kubernetes RBAC實戰 kubernetes 用戶角色訪問控制,kubectl配置生成

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-amd64
 chmod +x cfssl_linux-amd64
 mv cfssl_linux-amd64 /bin/cfssl

wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
 chmod +x cfssljson_linux-amd64
 mv cfssljson_linux-amd64 /bin/cfssljson

wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
 chmod +x cfssl-certinfo_linux-amd64
 mv cfssl-certinfo_linux-amd64 /bin/cfssl-certinfo

簽發客戶端證書

根據ca證書與麼鑰簽發用戶證書

根證書已經在/etc/kubernetes/pki目錄下了

[root@master1 ~]# ls /etc/kubernetes/pki/
 apiserver.crt ca-config.json devuser-csr.json front-proxy-ca.key sa.pub
 apiserver.key ca.crt devuser-key.pem front-proxy-client.crt
 apiserver-kubelet-client.crt ca.key devuser.pem front-proxy-client.key
 apiserver-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 < 校驗證書
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.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

使用新的config文件

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

效果, 已經沒有別的namespace的權限了,也不能訪問node信息了:

[root@master1 ~]# kubectl get node
 Error from server (Forbidden): nodes is forbidden: User "devuser" cannot list nodes at the cluster scope

[root@master1 ~]# kubectl get pod -n kube-system
 NAME READY STATUS RESTARTS AGE
 calico-kube-controllers-55449f8d88-74x8f 1/1 Running 0 8d
 calico-node-clpqr 2/2 Running 0 8d
 kube-apiserver-master1 1/1 Running 2 8d
 kube-controller-manager-master1 1/1 Running 1 8d
 kube-dns-545bc4bfd4-p6trj 3/3 Running 0 8d
 kube-proxy-tln54 1/1 Running 0 8d
 kube-scheduler-master1 1/1 Running 1 8d

[root@master1 ~]# kubectl get pod -n default
 Error 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.yaml
 apiVersion: rbac.authorization.k8s.io/v1beta1
 kind: ClusterRoleBinding
 metadata:
 name: kubernetes-dashboard
 labels:
 k8s-app: kubernetes-dashboard
 roleRef:
 apiGroup: rbac.authorization.k8s.io
 kind: ClusterRole
 name: cluster-admin
 subjects:
 - 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-system
 Name: cluster-admin
 Labels: kubernetes.io/bootstrapping=rbac-defaults
 Annotations: rbac.authorization.kubernetes.io/autoupdate=true
 PolicyRule:
 Resources Non-Resource URLs Resource Names Verbs
 --------- ----------------- -------------- -----
 [*] [] [*]
 *.* [] [] [*]

而創建dashboard時創建了這個service account:

apiVersion: v1
 kind: ServiceAccount
 metadata:
 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.yaml
 kind: ClusterRoleBinding
 apiVersion: rbac.authorization.k8s.io/v1beta1
 metadata:
 name: admin
 annotations:
 rbac.authorization.kubernetes.io/autoupdate: "true"
 roleRef:
 kind: ClusterRole
 name: cluster-admin
 apiGroup: rbac.authorization.k8s.io
 subjects:
 - kind: ServiceAccount
 name: admin
 namespace: kube-system
 ---
 apiVersion: v1
 kind: ServiceAccount
 metadata:
 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 admin
 admin-token-7rdhf kubernetes.io/service-account-token 3 14m
[root@master1 ~]# kubectl describe secret admin-token-7rdhf -n kube-system
 Name: admin-token-7rdhf
 Namespace: kube-system
 Labels:
 Annotations: kubernetes.io/service-account.name=admin
 kubernetes.io/service-account.uid=affe82d4-d10b-11e7-ad03-00163e01d684

Type: kubernetes.io/service-account-token

Data
 ====
 ca.crt: 1025 bytes
 namespace: 11 bytes
 token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbi03cmRoZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImFmZmU4MmQ0LWQxMGItMTFlNy1hZDAzLTAwMTYzZTAxZDY4NCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbiJ9.jSfQhFsY7V0ZmfqxM8lM_UUOoUhI86axDSeyVVtldSUY-BeP2Nw4q-ooKGJTBBsrOWvMiQePcQxJTKR1K4EIfnA2FOnVm4IjMa40pr7-oRVY37YnR_1LMalG9vrWmqFiqIsKe9hjkoFDuCaP7UIuv16RsV7hRlL4IToqmJMyJ1xj2qb1oW4P1pdaRr4Pw02XBz9yBpD1fs-lbwheu1UKcEnbHS_0S3zlmAgCrpwDFl2UYOmgUKQVpJhX4wBRRQbwo1Sn4rEFVI1NIa9l_lM7Mf6YEquLHRu3BCZTdu9YfY9pevQz4OfHE0NOvDIqmGRL8Z9kPADAXbljWzcD1m1xCQ

用此token在界面上登錄即可

本文轉自開源中國-kubernetes RBAC實戰 kubernetes 用戶角色訪問控制,kubectl配置生成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章