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