ABA授权模式

基于属性的访问控制(Attribute-based access control - ABA)定义了访问控制范例,其中通过使用将属性组合在一起的策略来向用户授予访问权限。 在API Server启动ABA模式时,需要指定授权策略文件的路径和名字(--authorization-policy-file=SME_FILENAME),授权策略文件里的每一行以一个Map类型的JSN对象进行设置,这被称为"访问策略对象",通过设置"访问策略对象"中的属性来确定具体授权策略

策略对象是具有以下映射的属性:

版本控制属性
    apiVersion,字符串类型: 有效值为”abac.authorization.kubernetes.io/v1beta1”,允许版本控制和转换策略格式。
    kind,字符串类型: 有效值为 “Policy”,允许版本控制和转换策略格式


 spec 配置为具有以下映射的属性
    匹配属性:
        user,字符串类型; 来自 --token-auth-file 的用户字符串,如果你指定user,它必须与验证用户的用户名匹配。
        group 字符串类型; 如果指定group,它必须与经过身份验证的用户的一个组匹配
           system:authenticated匹配所有经过身份验证的请求。
           system:unauthenticated匹配所有未经过身份验证的请求

 资源匹配属性: 
    apiGroup,字符串类型; 表明匹配哪些API Group ,例如extensions或*匹配所有 API 组
    namespace,字符串类型; 表示该策略允许访问某个Namespace 例如: kube-system 或* 匹配所有资源请求
    resource,字符串类型; 资源类型。API资源对象,例:pods或*匹配所有资源请求 (表示匹配所有资源对象)

 非资源匹配属性:
    nonResourcePath (非资源请求路径),字符串类型;  非资源对象类的URL,
                            例如:/version或/apis
                            通配符:
                            * 匹配所有非资源请求。
                            /foo/* 匹配/foo/的所有子路径。
    readonly,布尔类型,如果为 true,则表示该策略仅适用于 get,list 和 watch 操作。

ABA授权算法

API Server进行ABA授权是算法如下:在API Server收到请求后,这些请求携带的策略对象的属性就被组装为一个数组,接下来使用策略文件对其进行逐条匹配.如果有一行匹配成功,那么这个请求就通过了授权(不过还是可能会在后续其他授权校验中失败)

常见策略匹配:

1.要允许所有认证用户做某件事,可以写一个策略,将group属性设置为system:authenticated 2.要允许所有为认证用户做某件事,可以把策略的group属性设置为system:unauthenticated 3.要允许一个用户做任何事,将策略的apiGroup、namespace、resource和nonResourcePath属性设置为"*"即可

使用Kubectl授权机制 Kubectl使用api-server的/api/apis端点进行获取版本信息。要验证kubetctl create/update命令发送给服务器的对象,kubectl需要向swagger资源进行查询。 对于Kubernetes v1的查询 那就是/swaggerapi/api/v1 /swaggerapi/experimental/v1

当使用ABA授权时,这些特殊资源必须明确通过策略中的 nonResourcePath 属性暴露出来(参见下面的例子): API版本协商/api/api/*/apis/apis/* 通过 kubectl version 查询服务器版本./version 用于创建/更新操作./swaggerapi/*

要查看API Server到特定kubectl操作的HP调用,您可以调整详细程度:

kubectl --v=8 version

ABA例子演示

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 可以在命名空间“projectaribou”中读取 pod:

{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "bob", "namespace": "projectaribou", "resource": "pods", "readonly": true}}

5.任何人都可以对所有非资源路径进行只读请求

{"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": "*"}}

完整例子演示文件 https://github.com/kubernetes/kubernetes/blob/master/pkg/auth/authorizer/abac/example_policy_file.jsonl

Service Account 与授权

Service Account会自动生成用户(user),用户名是根据以下规则生成的:

system:serviceaccount:<namespace>:<serviceaccountname>

创建新的命名空间也会导致创建一个新的Service Account:

system:serviceaccount:<namespace>:default

如果希望将 API 的 kube-system 命名空间中的Service Account "default" 具有全部权限,则可以将此行添加到策略文件中:

{"apiVersion":"abac.authorization.kubernetes.io/v1beta1","kind":"Policy","spec":{"user":"system:serviceaccount:kube-system:default","namespace":"*","resource":"*","apiGroup":"*"}}

如果添加了ABA策略,则需要重新启动apiserver以获取新的策略行.

https://kubernetes.io/cn/docs/admin/authorization/abac/

Copyright © i4t.com 2019 all right reserved,powered by Gitbook该文件修订时间: 2019-04-26 21:31:27

results matching ""

    No results matching ""