# k8s 的 ABAC Mode
基于属性的访问控制(ABAC)
# Policy 文件格式
使用 ABAC 模式指定策略文件:--authorization-policy-file=SOME_FILENAME。
文件格式是 JSON, one JSON object per line
。
每一行都是一个“policy 对象”,policy 对象具有以下属性:
- Versioning 属性:
- apiVersion,字符串类型; 有效值为“abac.authorization.kubernetes.io/v1beta1”。允许版本控制和对策略格式进行转换。
- kind,字符串类型:有效值为“Policy”。允许版本控制和对策略格式进行转换。
- spec 属性:
- Subject-matching 属性:
- user,字符串类型;
- group,字符串类型;
- Resource-matching 属性:
- apiGroup,字符串类型; 一个 API Group。
- 例如: extensions
- 通配符:*匹配所有 API Group。
- namespace,字符串类型;一个(namespace)命名空间
- 例如: kube-system
- 通配符:*匹配所有资源请求。
- resource,字符串类型; 资源类型
- 例如: pods
- 通配符:*匹配所有资源请求。
- apiGroup,字符串类型; 一个 API Group。
- Non-resource-matching 属性:
- nonResourcePath,字符串类型; non-resource request paths。
- 例如:/version 或 /apis
- 通配符:
- * 匹配所有 non-resource 请求。
/foo/*
matches all subpaths of/foo/
- nonResourcePath,字符串类型; non-resource request paths。
- readonly,boolean 类型,如果为 true,表示该策略仅用于操作 get,list 和 watch。
- Subject-matching 属性:
注意:未设置的属性与设置值为零的属性相同(例如,空字符串,0,false)
# Authorization Algorithm
属性设置为"*"将匹配所有属性值。
检查属性的元组以匹配策略文件中的每个策略。如果有一行匹配了请求属性,则请求被授权(但可能会在稍后的认证中失败)。
要允许认证过的用户执行操作,请将 Group 属性设置"system:authenticated"。
要允许未认证的用户执行操作,请将 Group 属性设置"system:unauthenticated"。
要允许用户执行任何操作,请编写一个策略,使用 apiGroup,namespace,resource 和 nonResourcePath 属性设置为"*"。
# 例/参考
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}}
Kubelet 可以读/写事件:
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "kubelet", "namespace": "*", "resource": "events"}}
Bob 可以在 namespace“projectCaribou”中读取 pod:
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "bob", "namespace": "projectCaribou", "resource": "pods", "readonly": true}}
谁都可以向所有 non-resource paths 发出只读请求:
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"group": "system:authenticated", "readonly": true, "nonResourcePath": "*"}} {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"group": "system:unauthenticated", "readonly": true, "nonResourcePath": "*"}}
完整示例文件
# A quick note on service accounts
service accounts 自动生成 user:
system:serviceaccount:<namespace>:<serviceaccountname>
创建新的 namespace 时也会创建一个新的 service account:
system:serviceaccount:<namespace>:default
例如,如果想要在 kube-system 中对 service account 默认权限授予 API,则需要将此行添加到策略文件中:
{"apiVersion":"abac.authorization.kubernetes.io/v1beta1","kind":"Policy","spec":{"user":"system:serviceaccount:kube-system:default","namespace":"*","resource":"*","apiGroup":"*"}}
最后重启 apiserve。