基于属性的访问控制(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。
注意:未设置的属性与设置值为零的属性相同(例如,空字符串,0,false)
- Subject-matching 属性:
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。