# 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
        • 通配符:*匹配所有资源请求。
    • 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。

Last Updated: 4/15/2023, 8:33:17 PM