K8S權限控制,限制用戶在多個namespace上的訪問權限


前言


kubernetes應用越來越廣泛,我們kubernetes集群中也會根據業務來划分不同的命名空間,隨之而來的就是安全權限問題,我們不可能把集群管理員賬號分配給每一個人,有時候可能需要限制某用戶對某些特定命名空間的權限,比如開發和測試人員也可能需要登錄集群,了解應用的運行情況,查看pod的日志,甚至是修改某些配置。這時候,我們可以通過創建受限的kubeconfig文件,將該config分發給有需要的人員,讓他們能通過kubectl命令實現一些允許的操作。

創建集群級別的角色 ClusterRole

clusterrole.dev-log.yaml 用於提供對pod的完全權限和其它資源的查看權限.

# 提供基本權限
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: dev-log
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - pods/exec
  verbs:
  - create
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - delete
- apiGroups:
  - ""
  resources:
  - endpoints
  - services
  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

在default命名空間應用配置文件:

$ kubectl apply -f clusterrole.dev-log.yaml -n default
$ kubectl get ClusterRole -n default

在default命名空間創建 ServiceAccount

創建ServiceAccount后,會自動創建一個綁定的 secret ,后面在kubeconfig文件中,會用到該secret中的token.

$ kubectl create serviceaccount dev -n default
$ kubectl get serviceaccount -n default

對ServiceAccount和集群角色建立綁定關系

對需要的namespace進行授權,以下示例為對app命名空間授權。

$ kubectl create rolebinding rbd-dev --clusterrole=dev-log --serviceaccount=default:dev --namespace=app

獲取ServiceAccount的secret中的token

$ kubectl get serviceaccounts dev -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: "2020-06-03T06:36:29Z"
  name: dev
  namespace: app
  resourceVersion: "2633621"
  selfLink:xxx
  uid: xx
secrets:
- name: dev-token-v97rh

對應的secret名稱為:dev-token-v97rh。

$ kubectl get secrets dev-token-v97rh -o yaml
apiVersion: v1
data:
  ca.crt: xxx
namespace: aGFkb29w
token:  xxx
kind: Secret
metadata:
  annotations:
    kubernetes.io/service-account.name: dev
    kubernetes.io/service-account.uid: xxx
  creationTimestamp: "2020-06-03T06:36:29Z"
  name: dev-token-v97rh
  namespace: app
  resourceVersion: "2633620"
  selfLink: xxx
  uid:xxx
type: kubernetes.io/service-account-token

該secret的token為:
token=xxx
該token是經過base64處理的,需要進行解碼處理

$ echo $token | base64 -d
xxx

組裝config文件

將token填充到以下的config配置中:

# config
apiVersion: v1
kind: Config
clusters:
- cluster:
    server: K8S集群地址
    certificate-authority-data: "ca.crt后的內容"
  name: k8s-dev
users:
- name: "devlog"
  user:
    token: "解碼后的token字符串"
contexts:
- context:
    cluster: dev
    user: "dev"
  name: dev
preferences: {}
current-context: dev

將該文件保存為config 並放入 $HOME/.kube/ 目錄下即可。
至此,k8s限制用戶在多個namespace上的訪問權限操作完成。

后記

K8S權限控制是很復雜的,本文只是最簡單的一種,因為工作需要,做個記錄。后面有其他的需求再做補充。


免責聲明!

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



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