K8s的用户和权限管理包括两个方面:认证和授权。认证解决用户是谁的问题,授权解决用户能做什么的问题。通过合理的权限管理,能够保证系统的安全可靠。
K8s的认证包含以下3种方式。这3种方式可以同时存在,认证时只按一种即可。
证书认证
设置apiserver的启动参数:--client_ca_file=SOMEFILE。
Token认证
设置apiserver的启动参数:--token_auth_file=SOMEFILE。
基本信息认证
设置apiserver的启动参数:--basic_auth_file=SOMEFILE。
1. 用户分类
K8s的用户分两种,一种是普通用户,一种是ServiceAccount(服务账户)。
1.1普通用户是假定被外部或独立服务管理的。管理员分配私钥。平时常用的kubectl命令都是普通用户执行的。
1.2ServiceAccount(服务帐户)是由Kubernetes API管理的用户。它们绑定到特定的命名空间,并由API服务器自动创建或通过API调用手动创建。服务帐户与存储为Secrets的一组证书相关联,这些凭据被挂载到pod中,以便集群进程与Kubernetes API通信。(登录dashboard时我们使用的就是ServiceAccount)
2. 普通用户的创建和查看及授权
普通用户并不是通过k8s来创建和维护,是通过创建证书和切换上下文环境的方式来创建和切换用户。
创建用户证书
创建devuser-csr.json文件:
k8s的用户名就是从CN上获取的。组是从O上获取的。这个用户或者组用于后面的角色绑定使用
cat > devuser-csr.json < { "CN": "devuser", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF 接下来生成user的证书: $ cfssl gencert -ca=ca.crt -ca-key=ca.key -config=ca-config.json -profile=kubernetes devuser-csr.json | cfssljson -bare devuser 就会生成下面的文件: devuser.csr devuser-key.pem devuser.pem 校验证书 # cfssl-certinfo -cert kubernetes.pem 生成config文件 kubeadm已经生成了admin.conf,我们拷贝过来这个文件,这样生成的配置文件会将admin用户的信息也保存下来 $ cp /etc/kubernetes/admin.conf devuser.kubeconfig 设置客户端认证参数: kubectl config set-credentials devuser \ --client-certificate=/root/ssl/devuser.pem \ --client-key=/root/ssl/devuser-key.pem \ --embed-certs=true \ --kubeconfig=devuser.kubeconfig 设置上下文参数: kubectl config set-context kubernetes \ --cluster=kubernetes \ --user=devuser \ --namespace=kube-system \ --kubeconfig=devuser.kubeconfig 创建角色 创建一个叫pod-reader的角色 [root@master1 ~]# cat pod-reader.yaml kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: kube-system name: pod-reader rules: - apiGroups: [""] # "" indicates the core API group resources: ["pods"] verbs: ["get", "watch", "list"] kubectl create -f pod-reader.yaml 绑定用户 创建一个角色绑定,把pod-reader角色绑定到 devuser上 [root@master1 ~]# cat devuser-role-bind.yaml kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: read-pods namespace: kube-system subjects: - kind: User name: devuser # 目标用户 apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader # 角色信息 apiGroup: rbac.authorization.k8s.io kubectl create -f devuser-role-bind.yaml 设置当前用户环境为新建的用户devuser kubectl config use-context kubernetes --kubeconfig=devuser.kubeconfig 使用新的config文件 rm $HOME/.kube/config && cp devuser.kubeconfig $HOME/.kube/config 发现已经没有别的namespace的权限了,也不能访问node信息了: 查看配置文件中包含的用户: 3.服务用户的创建和授权 服务账户的用户信息数据是由k8s来管理和维护的的。service account是给进程用的,让进程有相关的权限。如dasboard就是一个进程,我们就可以创建一个service account给它,让它去访问k8s。Service Account它并不是给kubernetes集群的用户使用的,而是给pod里面的进程使用的,它为pod提供必要的身份认证。 查看所有的service account 新增一个新的用户cnych 该用户只能对命名空间kube-system下面的pods和deployments进行管理 第一步新建一个ServiceAccount: $ kubectl create sa cnych -n kube-system 然后我们新建一个角色role-cnych:(role.yaml) kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: kube-system name: role-cnych rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"] - apiGroups: ["extensions", "apps"] resources: ["deployments"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] 注意上面的rules规则:管理pods和deployments的权限。 然后我们创建一个角色绑定,将上面的角色role-cnych绑定到cnych的ServiceAccount上:(role-bind.yaml) kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: role-bind-cnych namespace: kube-system subjects: - kind: ServiceAccount name: cnych namespace: kube-system roleRef: kind: Role name: role-cnych apiGroup: rbac.authorization.k8s.io 分别执行上面两个yaml文件: $ kubect create -f role.yaml $ kubect create -f role-bind.yaml 这样ServiceAccount cnych就创建好了,并授予了权限。 查看token名称 kubectl get secret -n kube-system 获取token kubectl describe secret/{token_name} -n kube-system 这样就可以使用查找到的token登录dashboard了