RBAC
一.只能访问某个 namespace 的普通用户
1.我们想要创建一个 User Account,只能访问 kube-system 这个命名空间,对应的用户信息如下所示:
username: cccc
group: yyyy
2.创建用户凭证,Kubernetes 没有 User Account 的 API 对象,不过要创建一个用户帐号的话也是挺简单的,利用管理员分配给你的一个私钥就可以创建了,这个我们可以参考官方文档中的方法,这里我们来使用 OpenSSL 证书来创建一个 User,当然我们也可以使用更简单的 cfssl工具来创建,给用户 cccc 创建一个私钥,命名成 cccc.key:
[root@master01 rbac]# openssl genrsa -out cccc.key 2048
Generating RSA private key, 2048 bit long modulus
............+++
.................+++
e is 65537 (0x10001)
3.使用我们刚刚创建的私钥创建一个证书签名请求文件:cccc.csr,要注意需要确保在-subj参数中指定用户名和组(CN表示用户名,O表示组):
[root@master01 rbac]# openssl req -new -key cccc.key -out cccc.csr -subj "/CN=cccc/O=yyyy"
4.然后找到我们的 Kubernetes 集群的 CA 证书,我们使用的是 kubeadm 安装的集群,CA 相关证书位于 /etc/kubernetes/pki/ 目录下面,如果你是二进制方式搭建的,你应该在最开始搭建集群的时候就已经指定好了 CA 的目录,我们会利用该目录下面的 ca.crt 和 ca.key两个文件来批准上面的证书请求。生成最终的证书文件,我们这里设置证书的有效期为 500 天:
[root@master01 rbac]# openssl x509 -req -in cccc.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out cccc.crt -days 500
5.现在我们可以使用刚刚创建的证书文件和私钥文件在集群中创建新的凭证和上下文(Context)
[root@master01 rbac]# kubectl config set-context cccc-context --cluster=kubernetes --namespace=kube-system --user=cccc
User "cccc" set.
6.我们可以看到一个用户 cccc 创建了,然后为这个用户设置新的 Context,我们这里指定特定的一个 namespace:
[root@master01 rbac]# kubectl config set-context cccc-context --cluster=kubernetes --namespace=kube-system --user=cccc
Context "cccc-context" created.
7.我们的用户 cccc 就已经创建成功了,现在我们使用当前的这个配置文件来操作 kubectl 命令的时候,发现如下报错:
[root@master01 rbac]# kubectl get pods --context=cccc-context
Error from server (Forbidden): pods is forbidden: User "cccc" cannot list resource "pods" in API group "" in the namespace "kube-system"
8.创建角色
[root@master01 rbac]# cat role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: cccc-role
namespace: kube-system
rules:
- apiGroups: ["", "apps"]
resources: ["deployments", "replicasets", "pods"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # 也可以使用['*']
[root@master01 rbac]# kubectl get role -n kube-system
NAME CREATED AT
cccc-role 2021-07-04T15:36:34Z
9.绑定角色
[root@master01 rbac]# cat rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: cccc-rolebinding
namespace: kube-system
subjects:
- kind: User
name: cccc
apiGroup: ""
roleRef:
kind: Role
name: cccc-role
apiGroup: rbac.authorization.k8s.io # 留空字符串也可以,则使用当前的apiGroup
[root@master01 rbac]# kubectl get rolebindings -n kube-system
NAME ROLE AGE
cccc-rolebinding Role/cccc-role 21s
10.测试
[root@master01 rbac]# kubectl get pods --context=cccc-context
NAME READY STATUS RESTARTS AGE
coredns-6d56c8448f-4fl6j 1/1 Running 3 44d
coredns-6d56c8448f-p7fls 1/1 Running 3 44d
etcd-master01 1/1 Running 41 71d
kube-apiserver-master01 1/1 Running 50 82d
kube-controller-manager-master01 1/1 Running 96 47d
kube-flannel-ds-2zlzc 1/1 Running 20 82d
kube-flannel-ds-b99kt 1/1 Running 21 82d
kube-flannel-ds-csbbs 1/1 Running 20 82d
kube-proxy-79x54 1/1 Running 19 82d
kube-proxy-b9hg2 1/1 Running 20 82d
kube-proxy-g6b4m 1/1 Running 19 82d
kube-scheduler-master01 1/1 Running 89 73d
11.测评
[root@master01 rbac]# kubectl --context=cccc-context get pods --namespace=default
Error from server (Forbidden): pods is forbidden: User "cccc" cannot list resource "pods" in API group "" in the namespace "default"
# 我们可以看到我们使用 kubectl 的使用并没有指定 namespace,这是因为我们我们上面创建这个 Context 的时候就绑定在了 kube-system 这个命名空间下面
[root@master01 rbac]# kubectl --context=cccc-context get svc
Error from server (Forbidden): services is forbidden: User "cccc" cannot list resource "services" in API group "" in the namespace "kube-system"
# 我们可以看到没有权限获取,因为我们并没有为当前操作用户指定其他对象资源的访问权限,是符合我们的预期的。这样我们就创建了一个只有单个命名空间访问权限的普通 User