Kubernetes訪問控制之鑒權(quán)方法詳解
RBAC鑒權(quán)
鑒權(quán)是確定請求方有哪些資源的權(quán)限,API Server目前支持RBAC鑒權(quán)、Node鑒權(quán)、ABAC鑒權(quán) 和 Webhook模式
基于角色(Role)的訪問控制(RBAC)是一種基于組織中用戶的角色來調(diào)節(jié)控制對計算機或網(wǎng)絡(luò)資源的訪問的方法。
要啟用 RBAC,在啟動 API 服務(wù)器時將 --authorization-mode
參數(shù)設(shè)置為一個逗號分隔的列表并確保其中包含 RBAC
API對象
RBAC API 聲明了四種 Kubernetes 對象:Role
、ClusterRole
、RoleBinding
和 ClusterRoleBinding
Role 或 ClusterRole 中包含一組代表相關(guān)權(quán)限的規(guī)則。 這些權(quán)限是純粹累加的(不存在拒絕某操作的規(guī)則)
Role 定義命名空間內(nèi)權(quán)限,ClusterRole是定義跨命名空間的權(quán)限
Role定義例子如下:
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default ##如果kind是ClusterRole,無須指定,代表集群級別 name: pod-reader rules: - apiGroups: [""] #"" indicates the core API group 具體參考kubectl api-resources resources: ["pods"] # 資源names, 子資源例子:["pods/log"] verbs: ["get", "watch", "list"] #允許動作
如果是Role,代表能訪問default空間下的所有Pod,如果是ClusterRolo代表能訪問所有空間下的Pod
-指定固定某個資源名稱
rules: - apiGroups: [""] # 在 HTTP 層面,用來訪問 ConfigMap 資源的名稱為 "configmaps" resources: ["configmaps"] resourceNames: ["my-configmap"] verbs: ["update", "get"]
-指定非資源端點
rules: - nonResourceURLs: ["/healthz", "/healthz/*"] # nonResourceURL 中的 '*' 是一個全局通配符 verbs: ["get", "post"]
RoleBinding 將Role定義的權(quán)限授予用戶/用戶組/服務(wù)賬號 (統(tǒng)稱主體subject)
ClusterRoleBinding 只能將ClusterRole定義的權(quán)限授予用戶/用戶組/服務(wù)賬號(統(tǒng)稱主體subject)
將pod-reader角色授予普通用戶myuser
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: read-pods namespace: default subjects: - kind: User #支持User,Group,ServiceAccount 三種類型 name: myuser apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io
一個 RoleBinding 也可以引用某 ClusterRole 并將該 ClusterRole 綁定到 RoleBinding 所在的名字空間
聚合的ClusterRole
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: monitoring aggregationRule: clusterRoleSelectors: - matchLabels: rbac.example.com/aggregate-to-monitoring: "true" rules: [] # 控制面自動填充這里的規(guī)則
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: monitoring-endpoints labels: rbac.example.com/aggregate-to-monitoring: "true" # 當你創(chuàng)建 "monitoring-endpoints" ClusterRole 時, # 下面的規(guī)則會被添加到 "monitoring" ClusterRole 中 rules: - apiGroups: [""] resources: ["services", "endpointslices", "pods"] verbs: ["get", "list", "watch"]
相關(guān)核心內(nèi)置對象
所有system:
前綴都是系統(tǒng)自帶命名規(guī)則
1.主體Subject
名稱 | 類型 | 說明 |
---|---|---|
default | ServiceAccount | 每個命名空間自帶 |
system:anonymous | User | 匿名用戶 |
system:serviceaccounts | Group | 任務(wù)名字空間的服務(wù)賬號都屬于這個組 |
system:serviceaccounts:空間名字 | Group | 該名字空間下的服務(wù)賬號都屬于這個組 |
system:authenticated | Group | 所有通過身份認證的用戶都屬于這個組 |
system:unauthenticated | Group | 所有未通過身份認證的用戶都屬于這個組 |
system:masters | Group | 超級管理員cluster-admin所屬的組 |
system:serviceaccount: (單數(shù))是用于服務(wù)賬戶用戶名的前綴;
system:serviceaccounts: (復(fù)數(shù))是用于服務(wù)賬戶組名的前綴。
2.默認ClusterRole/ClusterRoleBinding
- 默認 ClusterRole 和 ClusterRoleBinding 都有kubernetes.io/bootstrapping=rbac-defaults 標簽
- 自動協(xié)商:在每次啟動時,API 服務(wù)器都會更新默認 ClusterRole 以添加缺失的各種權(quán)限, 并更新默認的 ClusterRoleBinding 以增加缺失的各類主體。
- 禁止可設(shè)置注解
rbac.authorization.kubernetes.io/autoupdate=false
默認ClusterRole | 對應(yīng)默認ClusterRoleBinding | 說明 |
---|---|---|
cluster-admin | cluster-admin, 綁定system:master組 | 超級管理員角色 |
admin | 無 | 大多數(shù)對象進行讀/寫操作包括角色和角色綁定 |
edit | 無 | 大多數(shù)對象進行讀/寫操作角色 |
view | 無 | 只有訪問權(quán)限角色 |
system:discovery | system:discovery,綁定組 system:authenticated | 允許以只讀方式訪問 API 發(fā)現(xiàn)端點 |
如果要禁用匿名的未經(jīng)過身份驗證的用戶訪問,請在 API 服務(wù)器配置中中添加 --anonymous-auth=false
的配置選項
- 創(chuàng)建一個dev空間的管理員dev-admin
kubectl create rolebinding dev-admin --clusterrole=cluster-admin --user=dev-admin -n dev
Node鑒權(quán)
節(jié)點鑒權(quán)是一種特殊用途的鑒權(quán)模式,專門對 kubelet 發(fā)出的 API 請求進行授權(quán),通過--authorization-mode=Node
啟動API服務(wù)器開啟
為了獲得節(jié)點鑒權(quán)器的授權(quán),kubelet 必須使用一個憑證以表示它在 system:nodes
組中,用戶名為 system:node:<nodeName>
ABAC鑒權(quán)
基于屬性的訪問控制(Attribute-based access control - ABAC)定義了訪問控制范例, 其中通過使用將屬性組合在一起的策略來向用戶授予訪問權(quán)限
- 指定策略文件
--authorization-policy-file=SOME_FILENAME
文件內(nèi)容格式JSON lines,例如:
- Alice 可以對所有資源做任何事情
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "alice", "namespace": "*", "resource": "*", "apiGroup": "*"}}
- kubelet 可以讀取任何 pod
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "kubelet", "namespace": "*", "resource": "pods", "readonly": true}}
一般都是使用RBAC + Node鑒權(quán)
以上就是Kubernetes訪問控制之鑒權(quán)的詳細內(nèi)容,更多關(guān)于Kubernetes訪問控制鑒權(quán)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
K8s Pod調(diào)度機制詳解(從理論到生成實戰(zhàn)指南)
Kubernetes調(diào)度機制是集群的智能調(diào)度中樞,主要完成過濾和打分兩個決策,在生產(chǎn)環(huán)境中,核心調(diào)度策略包括資源調(diào)度、親和性調(diào)度、污點與容忍、拓撲分布約束等,本文介紹K8s Pod調(diào)度機制詳解(從理論到生成實戰(zhàn)指南),感興趣的朋友一起看看吧2025-03-03Rancher部署配置開源Rainbond云原生應(yīng)用管理平臺
這篇文章主要為大家介紹了Rancher部署配置開源Rainbond云原生應(yīng)用管理平臺,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04k8s跨服務(wù)調(diào)用入門到實戰(zhàn)示例詳解
這篇文章主要為大家介紹了k8s跨服務(wù)調(diào)用入門到實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09Rainbond自動部署初始化Schema的數(shù)據(jù)庫步驟教程
這篇文章主要為大家介紹了Rainbond自動部署初始化Schema的數(shù)據(jù)庫過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04