kubernetes RBAC 实战

网友投稿 746 2022-10-12

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

kubernetes RBAC 实战

kubernetes RBAC实战

环境准备

先用 kubeadm 安装好 kubernetes 集群,包地址(https://market.aliyun.com/products/56014009/cmxz022571.html#sku=yuncode1657100000) 好用又方便,服务周到,童叟无欺。

本文目的:让名为 devuser 的用户只能有权限访问特定 namespace 下的pod。

命令行 kubectl 访问

安装 cfssl

此工具生成证书非常方便, pem 证书与 crt 证书,编码一致可直接使用

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64chmod +x cfssl_linux-amd64mv cfssl_linux-amd64 /bin/cfsslwget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64chmod +x cfssljson_linux-amd64mv cfssljson_linux-amd64 /bin/cfssljsonwget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64chmod +x cfssl-certinfo_linux-amd64mv cfssl-certinfo_linux-amd64 /bin/cfssl-certinfo

签发客户端证书

根据查证书与秘钥签发用户证书

根证书已经在 /etc/kubernetes/pki 目录下了

[root@master1 ~]# ls /etc/kubernetes/pki/apiserver.crt                 ca-config.json  devuser-csr.json    front-proxy-ca.key      sa.pubapiserver.key                 ca.crt          devuser-key.pem     front-proxy-client.crtapiserver-kubelet-client.crt  ca.key          devuser.pem         front-proxy-client.keyapiserver-kubelet-client.key  devuser.csr     front-proxy-ca.crt  sa.key

注意以下几个文件: ca.crt ca.key ca-config.json devuser-csr.json

创建 ca-config.json 文件

cat > ca-config.json <

创建 devuser-csr.json 文件:

k8s 的用户名就是从 CN 上获取的。 组是从 O 上获取的。这个用户或者组用于后面的角色绑定使用

cat > devuser-csr.json <

生成 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,我们可以直接利用这个文件,省的自己再去配置集群参数

$ cp /etc/kubernetes/admin.conf devuser.kubeconfig

设置客户端认证参数:

kubectl config set-credentials devuser \--client-certificate=/etc/kubernetes/ssl/devuser.pem \--client-key=/etc/kubernetes/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

设置莫认上下文:

kubectl config use-context kubernetes --kubeconfig=devuser.kubeconfig

以上执行一个步骤就可以看一下 devuser.kubeconfig 的变化。里面最主要的三个东西

cluster: 集群信息,包含集群地址与公钥user: 用户信息,客户端证书与私钥,正真的信息是从证书里读取出来的,人能看到的只是给人看的。context: 维护一个三元组, namespace cluster 与 user

创建角色

创建一个叫 pod-reader 的角色

[root@master1 ~]# cat pod-reader.yamlkind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:  namespace: kube-system  name: pod-readerrules:- 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.yamlkind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: read-pods  namespace: kube-systemsubjects:- kind: User  name: devuser   # 目标用户  apiGroup: rbac.authorization.k8s.ioroleRef:  kind: Role  name: pod-reader  # 角色信息  apiGroup: rbac.authorization.k8s.io

kubectl create -f devuser-role-bind.yaml

使用新的 config 文件

$ rm .kube/config && cp devuser.kubeconfig .kube/config

最终的效果就是:已经没有别的 namespace 的权限了,也不能访问 node 信息了

[root@master1 ~]# kubectl get nodeError from server (Forbidden): nodes is forbidden: User "devuser" cannot list nodes at the cluster scope[root@master1 ~]# kubectl get pod -n kube-systemNAME                                       READY     STATUS    RESTARTS   AGEcalico-kube-controllers-55449f8d88-74x8f   1/1       Running   0          8dcalico-node-clpqr                          2/2       Running   0          8dkube-apiserver-master1                     1/1       Running   2          8dkube-controller-manager-master1            1/1       Running   1          8dkube-dns-545bc4bfd4-p6trj                  3/3       Running   0          8dkube-proxy-tln54                           1/1       Running   0          8dkube-scheduler-master1                     1/1       Running   1          8d[root@master1 ~]# kubectl get pod -n defaultError from server (Forbidden): pods is forbidden: User "devuser" cannot list pods in the namespace "default": role.rbac.authorization.k8s.io "pod-reader" not found

dashboard 访问

service account 原理

k8s 里面有两种用户,一种是 User,一种就是 service account,User 给人用的,service account 给进程用的,让进程有相关的权限。

如 dasboard 就是一个进程,我们就可以创建一个 service account 给它,让它去访问 k8s。

我们看一下是如何把 admin 权限赋给 dashboard 的:

╰─➤  cat dashboard-admin.yamlapiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata:  name: kubernetes-dashboard  labels:    k8s-app: kubernetes-dashboardroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: cluster-adminsubjects:- kind: ServiceAccount  name: kubernetes-dashboard  namespace: kube-system

把 kubernetes-dashboard 这个 ServiceAccount 绑定到 cluster-admin 这个 ClusterRole 上,这个 cluster role 非常牛逼,啥权限都有

[root@master1 ~]# kubectl describe clusterrole cluster-admin -n kube-systemName:         cluster-adminLabels:       kubernetes.io/bootstrapping=rbac-defaultsAnnotations:  rbac.authorization.kubernetes.io/autoupdate=truePolicyRule:  Resources  Non-Resource URLs  Resource Names  Verbs  ---------  -----------------  --------------  -----             [*]                []              [*]  *.*        []                 []              [*]

而创建 dashboard 时创建了这个 service account:

apiVersion: v1kind: ServiceAccountmetadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard  namespace: kube-system

然后 deployment 里指定 service account

volumes:      - name: kubernetes-dashboard-certs        secret:          secretName: kubernetes-dashboard-certs      - name: tmp-volume        emptyDir: {}      serviceAccountName: kubernetes-dashboard

更安全的做法

[root@master1 ~]# cat admin-token.yamlkind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1beta1metadata:  name: admin  annotations:    rbac.authorization.kubernetes.io/autoupdate: "true"roleRef:  kind: ClusterRole  name: cluster-admin  apiGroup: rbac.authorization.k8s.iosubjects:- kind: ServiceAccount  name: admin  namespace: kube-system---apiVersion: v1kind: ServiceAccountmetadata:  name: admin  namespace: kube-system  labels:    kubernetes.io/cluster-service: "true"    addonmanager.kubernetes.io/mode: Reconcile

[root@master1 ~]# kubectl get secret -n kube-system|grep adminadmin-token-7rdhf                        kubernetes.io/service-account-token   3         14m

[root@master1 ~]# kubectl describe secret admin-token-7rdhf -n kube-systemName:         admin-token-7rdhfNamespace:    kube-systemLabels:       Annotations:  kubernetes.io/service-account.name=admin              kubernetes.io/service-account.uid=affe82d4-d10b-11e7-ad03-00163e01d684Type:  kubernetes.io/service-account-tokenData====ca.crt:     1025 bytesnamespace:  11 bytestoken:      eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbi03cmRoZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImFmZmU4MmQ0LWQxMGItMTFlNy1hZDAzLTAwMTYzZTAxZDY4NCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbiJ9.jSfQhFsY7V0ZmfqxM8lM_UUOoUhI86axDSeyVVtldSUY-BeP2Nw4q-ooKGJTBBsrOWvMiQePcQxJTKR1K4EIfnA2FOnVm4IjMa40pr7-oRVY37YnR_1LMalG9vrWmqFiqIsKe9hjkoFDuCaP7UIuv16RsV7hRlL4IToqmJMyJ1xj2qb1oW4P1pdaRr4Pw02XBz9yBpD1fs-lbwheu1UKcEnbHS_0S3zlmAgCrpwDFl2UYOmgUKQVpJhX4wBRRQbwo1Sn4rEFVI1NIa9l_lM7Mf6YEquLHRu3BCZTdu9YfY9pevQz4OfHE0NOvDIqmGRL8Z9kPADAXbljWzcD1m1xCQ

用此 token 在界面上登录即可

作者:fanux原文链接:https://segmentfault.com/a/1190000012151075

近期招生课程

Python 实战班 18 期、自动化运维班 7 期Golang 开发班 3 期、架构师班 2 期

上一篇:日志深度分析
下一篇:Shell开发在运维中的经验总结|干货分享
相关文章

 发表评论

暂时没有评论,来抢沙发吧~