一 ABAC
1.1 ABAC授權
基於屬性的訪問控制(ABAC)定義了訪問控制范例,通過使用將屬性組合在一起的策略向用戶授予訪問權限。
使用--authorization-policy-file=SOME_FILENAME和--authorization-mode=ABAC啟用ABAC模式。
二 ABAC使用
2.1 策略文件格式
策略文件格式是每行一個JSON對象,每一行都是“策略對象”,其中每個這樣的對象都是具有以下屬性的映射:
版本控制屬性:
apiVersion:字符串類型,有效值為“abac.authorization.kubernetes.io/v1beta1”;
kind:字符串類型,有效值為“Policy”;
spec 屬性設置為具有以下屬性的map:
- 主題匹配屬性:
user:字符串類型,來自於--token-auth-file。如果指定user,則必須與經過身份驗證的用戶的用戶名匹配。
group:字符串類型,如果指定group,則必須與經過身份驗證的用戶的其中一個組匹配。
system:authenticated:匹配所有經過驗證的請求;
system:unauthenticated:匹配所有未經身份驗證的請求。
- 資源匹配屬性:
apiGroup:字符串類型,一個API組。
例如: extensions
通配符:*匹配所有API組。
namespace:字符串類型,命名空間。
例如: kube-system
通配符:*匹配所有資源請求。
resource:字符串類型,資源類型。
例如: pods
通配符:*匹配所有資源請求。
- 非資源匹配屬性:
nonResourcePath:字符串類型,非資源請求路徑。
例如:/version或/apis
通配符:
* 匹配所有非資源請求。
/foo/*匹配的所有子路徑/foo/。
- readonly:布爾類型,當為true時,表示資源匹配策略僅適用於get,list和watch操作,非資源匹配策略僅適用於get操作。
注意:unset屬性與為其類型設置為零值的屬性相同(例如,空字符串,0,false)。
2.2 Kubectl
Kubectl使用api-server的端點/api和/apis端點來發現服務的資源類型。
使用ABAC授權時,必須通過nonResourcePath策略中的屬性顯式公開這些特殊資源。
要檢查特定kubectl操作中涉及的HTTP調用,可通過以下命令查看:
kubectl --v=8 version
2.3 相關授權操作
1 {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "alice", "namespace": "*", "resource": "*", "apiGroup": "*"}}
解釋:Alice可以對所有資源做任何事情。
1 {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "kubelet", "namespace": "*", "resource": "pods", "readonly": true}}
解釋:Kubelet可以讀取任何pods。
1 {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "kubelet", "namespace": "*", "resource": "events"}}
解釋:Kubelet可以讀寫事件。
1 {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "bob", "namespace": "projectCaribou", "resource": "pods", "readonly": true}}
解釋:Bob可以只讀取命名空間“projectCaribou”中的pod。
1 {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"group": "system:authenticated", "readonly": true, "nonResourcePath": "*"}} 2 {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"group": "system:unauthenticated", "readonly": true, "nonResourcePath": "*"}}
解釋:任何人都可以對所有非資源路徑發出只讀請求。
更多RBAC參考:https://kubernetes.io/docs/reference/access-authn-authz/rbac/#role-and-clusterrole
2.4 服務賬戶
每個服務帳戶都有一個相應的ABAC用戶名,該服務帳戶的用戶名是根據命名約定生成的:
1 system:serviceaccount:<namespace>:<serviceaccountname>
創建新命名空間會導致以下列格式創建新服務帳戶:
1 system:serviceaccount:<namespace>:default
例如,如果要kube-system使用ABAC為API 授予默認服務帳戶(在命名空間中)完全權限,則應將此行添加到策略文件中:
1 {"apiVersion":"abac.authorization.kubernetes.io/v1beta1","kind":"Policy","spec":{"user":"system:serviceaccount:kube-system:default","namespace":"*","resource":"*","apiGroup":"*"}}
需要重新啟動apiserver才能獲取新的策略行。
注意:該ABAC授權功能在Kubernetes 1.6版本開始已被棄用!