前言
kubernetes安全机制围绕API server来设计的,使用了认证、鉴权、准入控制三步,保证API Server的安全。
一、认证
确认是否可信:
- https 证书认证,基于ca证书(使用这个认证方式)
- 双向认证,最安全!
- http token认证,通过token来识别用户
- http Base认证,用户名 + 密码认证
如果组件想访问,要经过双向认证
pod 认证到 api-server的标准:如果 pod 想访问通过 service account 中token !
# 获取集群的pod
kubectl get pod -n kube-system
# 进入某个集群
kubectl exec pod名 -n kube-system -it -- /bin/sh
# 查看secrets的信息
cd /run/secrets/kubernetes.io
二、 鉴权
确定请求方有哪些资源的权限:
- ABAC:基于属性的访问控制,需要重启(已经淘汰)
- Webbook:调用外部rest服务对用户进行授权(集群外部)
- RBAC:基于角色的访问控制(现行默认规则)
4个资源对象概念: Role表示一组规则权限,只会增加,在一个namespace中,想跨名称空间用ClusterRole(集群级别的) RoleBinding适用于某个命名空间授权,ClusterRole Binding适用于集群 范围授权
注意:k8s不提供用户管理,User、Group、Service Account 的指定用户都是从Kubenetes(kubectl 、 kube-proxy)或是其他自定义的用户在向CA申请证书时,提供的证书请求文件决定的!
三、准入控制
例子:创建一个用户devuser,管理dev空间
一、 创建用户名密码
kubernetes没有用户名和密码,只能在Linux里创建!
useradd devuser
passwd
Eisoo.com123
二、 鉴权(RBAC)
1. 证书请求文件
创建 /usr/local/cert/devuser
目录,编辑 devuser-csr.json
{
"CN": "admin", # CN 用户名
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
# Group
"O": "k8s", # O 字段是组
"OU": "System"
}
]
}
2. 准备cfssl证书生成工具
cfssl是一个开源的证书管理工具,使用json文件生成证书,相比openssl 更方便使用。找任意一台服务器操作,这里用Master节点。
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
3. 生成证书请求和证书私钥
回到 /usr/local/cert/devuser
目录 , 最好到/etc/kubernetes/pki
下生成令牌
cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /usr/local/k8s/cert/devuser/devuser-csr.json | cfssljson -bare devuser
4. 声明访问的KUBE_APISERVER信息
进入devuser目录,设置 kube_apiserver
参数
(如果不做更改的话,或者这一步可以省略)
export KUBE_APISERVER="10.4.104.169:6443"
5. 设置集群参数
kubectl config set-cluster kubernetes \ # 设置kubernetes的集群
--certificate-authority=/etc/kubernetes/pki/ca.crt \ # 指定CA的证书
--embed-certs=true \ # 指定是否进行加密和认证
--server=https://10.4.104.169:6443 \ # 指定服务器信息
--kubeconfig=devuser.kubeconfig # 创建一个devuser的config文件
若是执行上一步 ,那么把 server=${KUBE_APISERVER}
ls一下就会出现一个devuser.kubeconfig
的文件!查看此时的kuberconfig文件,有了server的数据!
6. 设置客户端认证参数
# 设置客户端认证参数
kubectl config set-credentials devuser \ # 创建证书的devuser
--client-key=/etc/kubernetes/pki/devuser-key.pem \ # 指定客户端证书
--client-certificate=/etc/kubernetes/pki/devuser.pem \ # 指定客户端私钥
--embed-certs=true \ # 开启认证方式
--kubeconfig=devuser.kubeconfig
cat一下,多了用户的信息,用户名、用户证书以及用户私钥等!
7. 设置上下文参数
为了帮用户绑定至某个名称空间
先去devuser的操作界面中创建一个名称空间
kubectl create namespace dev
再回到master
# 设置上下文参数
kubectl config set-context default \
--cluster=kubernetes \ # 默认集群名称
--user=devuser \ # 名称
--namespace=dev \ # 名称空间
--kubeconfig=lucy.kubeconfig
8. 设置用户权限rolebinding
集群中已有一个clusterrole的admin用户,可以在集群中为所欲为!
把admin用户进行rolebinding绑定至dev名称空间中,代表用户admin在dev下为所欲为!
kubectl create rolebinding devuser-admin-binding --clusterrole =admin --user=devuser --namespace=dev
回到master,复制dev配置文件到.kube,再赋予权限
把文件拷贝到用户目录下,首先在用户目录下建一个.kube/
再把devuser的config改名,改成config
切换上下文,使其生效
9. 测试:找default空间,dev访问不到。
三、完成√
提供dev用户名和密码!只能访问dev空间!
四、用代码实现
待更新。。。