Kubernetes的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
        • 通配符:*匹配所有资源请求。
    • Non-resource-matching 属性:
      • nonResourcePath,字符串类型; non-resource request paths。
        • 例如:/version 或 /apis
        • 通配符:
          • * 匹配所有non-resource 请求。
          • /foo/* matches all subpaths of /foo/
    • readonly,boolean类型,如果为true,表示该策略仅用于操作get,list和watch。

注意:未设置的属性与设置值为零的属性相同(例如,空字符串,0,false)

Authorization Algorithm

属性设置为"*"将匹配所有属性值。

检查属性的元组以匹配策略文件中的每个策略。如果有一行匹配了请求属性,则请求被授权(但可能会在稍后的认证中失败)。

要允许认证过的用户执行操作,请将Group属性设置"system:authenticated"。

要允许未认证的用户执行操作,请将Group属性设置"system:unauthenticated"。

要允许用户执行任何操作,请编写一个策略,使用apiGroup,namespace,resource和nonResourcePath属性设置为"*"。

例/参考

  1. Alice对所有资源进行操作

    {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "alice", "namespace": "*", "resource": "*", "apiGroup": "*"}}
    
  2. Kubelet可以读取任何pod:
    {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "kubelet", "namespace": "*", "resource": "pods", "readonly": true}}
    
  3. Kubelet可以读/写事件:
    {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "kubelet", "namespace": "*", "resource": "events"}}
    
  4. Bob可以在namespace“projectCaribou”中读取pod:
    {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "bob", "namespace": "projectCaribou", "resource": "pods", "readonly": true}}
    
  5. 谁都可以向所有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。