快給你的Kubernetes集群建一個只讀賬戶(防止高管。。。后)


 需求:我們知道搭完k8s集群會創建一個默認的管理員kubernetes-admin用戶該用戶擁有所以權限,有一天開發或測試的同學需要登錄到k8s集群了解業務pod的狀態等,我們不可能提供管理員的賬戶給他不安全如果他因為某個高管。。。刪庫跑路啥辦??,所以建一個只讀賬戶迫在眉睫。

kubectl conifg命令常見操作:

  • kubectl config view:打印kubeconfig⽂件內容。
  • kubectl config set-cluster:設置kubeconfig的clusters配置段。
  • kubectl config set-credentials:設置kubeconfig的users配置段。
  • kubectl config set-context:設置kubeconfig的contexts配置段。
  • kubectl config use-context:設置kubeconfig的current-context配置段。
# kubectl config view 

 一、我是用kubeadm部署的集群,給只讀賬戶jackhe創建私鑰及證書文件,並保存在/etc/kubernetes/pki目錄下。

1)生成私鑰文件。

cd /etc/kubernetes/pki/
umask 077;openssl genrsa -out jackhe.key 2048

 2)創建證書部署請求,關鍵點其中-subj選項中的CN的值將被kubeconfig最為用戶名使用。

openssl req -new -key jackhe.key -out jackhe.csr -subj "/CN=jackhe"

3)用kubernetes集群生成的CA簽署證書,設置有限時間3650天。

openssl x509 -req -in jackhe.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out jackhe.crt -days 3650

 4)驗證證書信息。

openssl x509 -in jackhe.crt  -text -noout

 二、創建一個新的集群信息,因為最終我們是提供config給使用者,默認的config文件有管理員信息當我們執行:kubectl config use-context kubernetes-admin@kubernetes就擁有了管理權限,這是不被允許的。

kubectl config set-cluster mycluster --kubeconfig=/tmp/config --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server="https://192.168.10.129:6443" 

  選項:

--kubeconfig="":配置文件存放路徑
--certificate-authority="": 設置kuebconfig配置文件中集群選項中的certificate-authority路徑。
--embed-certs=false: 設置kuebconfig配置文件中集群選項中的embed-certs開關。
--server="": 設置kuebconfig配置文件中集群選項中的server。

 三、配置客戶端證書及密鑰,⽤戶名信息會通過命令從證書Subject的CN值中⾃動提取,例如前⾯創建csr時使⽤的“CN=jackhe”.

kubectl config set-credentials jackhe --embed-certs=true --client-certificate=/etc/kubernetes/pki/jackhe.crt --client-key=/etc/kubernetes/pki/jackhe.key --kubeconfig=/tmp/config 

 選項:

--client-certificate="": 設置kuebconfig配置文件中用戶選項中的證書文件路徑。
--client-key="": 設置kuebconfig配置文件中用戶選項中的證書密鑰路徑。
--embed-certs=false: 設置kuebconfig配置文件中用戶選項中的embed-certs開關。

 四、配置context,⽤來組合cluster和credentials,即訪問的集群的上下⽂。

kubectl config set-context jackhe@mycluster --cluster=mycluster --user=jackhe --kubeconfig=/tmp/config

  注意: jackhe@mycluster要對應上你新建的集群名字!!!
五、指定上下文切換到jackhe訪問集群,我們能看到現在是沒有任何權限的。

kubectl config use-context jackhe@mycluster --kubeconfig=/tmp/config
kubectl config view --kubeconfig=/tmp/config 
kubectl get pod --kubeconfig=/tmp/config

 六、接下來我們基於RBAC建立只讀ClusterRole文件(權限可配置)。

 kubectl apply -f  readonly.yaml

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: cluster-readonly
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - pods/attach
  - pods/exec
  - pods/portforward
  - pods/proxy
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - configmaps
  - endpoints
  - persistentvolumeclaims
  - replicationcontrollers
  - replicationcontrollers/scale
  - secrets
  - serviceaccounts
  - services
  - services/proxy
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - bindings
  - events
  - limitranges
  - namespaces/status
  - pods/log
  - pods/status
  - replicationcontrollers/status
  - resourcequotas
  - resourcequotas/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - namespaces
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - apps
  resources:
  - deployments
  - deployments/rollback
  - deployments/scale
  - statefulsets
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - autoscaling
  resources:
  - horizontalpodautoscalers
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - batch
  resources:
  - cronjobs
  - jobs
  - scheduledjobs
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - extensions
  resources:
  - daemonsets
  - deployments
  - ingresses
  - replicasets
  verbs:
  - get
  - list
  - watch

 七、創建基於用戶jackhe的ClusterRoleBinding文件。

kubectl apply -f readonly.yaml

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: cluster-readonly
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-readonly
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: jackhe

 八、我們這時再測試已經有了只讀權限。

kubectl get pod --kubeconfig=/tmp/config

 九、大功告成,接下來我們只要把/tmp/config文件放到用戶的家目錄.kube下就可以使用了。

mkdir -p /home/jackhe/.kube
cp /tmp/config /home/jackhe/.kube/
chown -R jackhe.jackhe /home/jackhe/.kube/

 OS切換到jackhe用戶,我們能看到只有只讀權限,也無法 上下文切換到kubernetes-admin@kubernetes ,因為配置文件里並沒有相關信息。哈哈,還想刪庫跑路!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM