基于属性的访问控制(ABAC)定义了一种访问控制范例,通过使用将属性组合在一起的策略,将访问权限授予用户。
要启用 ABAC
模式,请在启动时指定 --authorization-policy-file=SOME_FILENAME
和 --authorization-mode=ABAC
。
文件格式是每行一个 JSON 对象。不允许存在内嵌的 list 或 map,每一行只能有一个 map 。
每一行都是一个“策略对象”,其中每个这样的对象都是具有以下属性的 map:
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
,布尔类型, 表示资源匹配策略仅适用于 get,list 和 watch 操作,非资源匹配策略仅适用于 get 操作。Note:未设置的属性与为属性设置为对应类型之零值(例如,空字符串,0,false)的效果相同。为了可读性,应尽量采用不设置的方式。将来,策略可能会用 JSON 格式表示,并通过 REST 接口管理。
请求具有与策略对象的属性相对应的属性。
当 kubernetes 收到请求时,确定各属性的取值。未知属性会被设置为其对应类型的零值(例如空字符串,0,false)。
设置为 "*"
的属性将匹配相应属性的任何值。
属性元组与策略文件中的各个策略逐一比较,以寻找匹配项。如果至少有一行匹配请求属性,则请求被授权(但稍后可能会验证失败)。
要允许任何经过身份验证的用户执行某些操作,请编写将 group 属性设置为 "system:authenticated"
的策略。
要允许任何未经身份验证的用户执行某些操作,请编写将 group 属性设置为 "system:unauthenticated"
的策略。
要允许用户执行任何操作,请编写将 apiGroup,namespace,resource 和 nonResourcePath 属性设置为 "*"
的策略。
Kubectl 使用 api-server 的 /api
和 /apis
端点来发现资源类型,并使用位于 /openapi/v2
的 schema 信息验证通过创建/更新操作发送到 API 的对象。
当使用 ABAC 授权时,必须通过策略中的 nonResourcePath
属性显式地公开这些特殊资源(参见下面的示例):
/api
, /api/*
, /apis
, 和 /apis/*
用于 API 版本协商。/version
用于通过 kubectl version
获取服务端版本。/swaggerapi/*
用于创建/更新操作。要检查特定 kubectl 操作中涉及的 HTTP 调用,您可以调整日志输出的详细程度:
kubectl –v=8 version
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 可以在命名空间 “projectCaribou” 中读取 Pod:
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "bob", "namespace": "projectCaribou", "resource": "pods", "readonly": true}}
任何人都可以对所有非资源路径发出只读请求:
{"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": "*"}}
每个服务帐户都有一个相应的 ABAC 用户名,该服务帐户的用户名是根据下面的命名规则生成的:
system:serviceaccount:<namespace>:<serviceaccountname>
创建新的命名空间会导致以下列格式创建新的服务帐户:
system:serviceaccount:<namespace>:default
例如,如果您想使用 ABAC 将默认服务帐户(在 kube-system
命名空间中)进行 API 完全授权,您可以将此行添加到您的策略文件中:
{"apiVersion":"abac.authorization.kubernetes.io/v1beta1","kind":"Policy","spec":{"user":"system:serviceaccount:kube-system:default","namespace":"*","resource":"*","apiGroup":"*"}}
需要重新启动 apiserver 以使新的策略行生效。
Note:从 Kubernetes 1.6 开始,ABAC 授权功能已被视为弃用。
此页是否对您有帮助?
Thanks for the feedback. If you have a specific, answerable question about how to use Kubernetes, ask it on Stack Overflow. Open an issue in the GitHub repo if you want to report a problem or suggest an improvement.