AIOps 一场颠覆传统运维的盛筵
746
2022-10-12
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: 用此 token 在界面上登录即可 作者:fanux原文链接:https://segmentfault.com/a/1190000012151075 近期招生课程 Python 实战班 18 期、自动化运维班 7 期Golang 开发班 3 期、架构师班 2 期
发表评论
暂时没有评论,来抢沙发吧~