附007.Kubernetes ABAC授权

一 ABAC

1.1 ABAC授权

基于属性的访问控制(ABAC)定义了访问控制范例,通过使用将属性组合在一起的策略向用户授予访问权限。

使用--authorization-policy-file=SOME_FILENAME和--authorization-mode=ABAC启用ABAC模式。

二 ABAC使用

2.1 策略文件格式

策略文件格式是每行一个JSON对象,每一行都是“策略对象”,其中每个这样的对象都是具有以下属性的映射:

版本控制属性:

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:布尔类型,当为true时,表示资源匹配策略仅适用于get,list和watch操作,非资源匹配策略仅适用于get操作。

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

2.2 Kubectl

Kubectl使用api-server的端点/api和/apis端点来发现服务的资源类型。

使用ABAC授权时,必须通过nonResourcePath策略中的属性显式公开这些特殊资源。

要检查特定kubectl操作中涉及的HTTP调用,可通过以下命令查看:

kubectl --v=8 version

2.3 相关授权操作

  1 {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "alice", "namespace": "*", "resource": "*", "apiGroup": "*"}}

解释:Alice可以对所有资源做任何事情。

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

解释:Kubelet可以读取任何pods。

  1 {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "kubelet", "namespace": "*", "resource": "events"}}

解释:Kubelet可以读写事件。

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

解释:Bob可以只读取命名空间“projectCaribou”中的pod。

  1 {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"group": "system:authenticated", "readonly": true, "nonResourcePath": "*"}}
  2 {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"group": "system:unauthenticated", "readonly": true, "nonResourcePath": "*"}}

解释:任何人都可以对所有非资源路径发出只读请求。

更多RBAC参考:https://kubernetes.io/docs/reference/access-authn-authz/rbac/#role-and-clusterrole

2.4 服务账户

每个服务帐户都有一个相应的ABAC用户名,该服务帐户的用户名是根据命名约定生成的:

  1 system:serviceaccount:<namespace>:<serviceaccountname>

创建新命名空间会导致以下列格式创建新服务帐户:

  1 system:serviceaccount:<namespace>:default

例如,如果要kube-system使用ABAC为API 授予默认服务帐户(在命名空间中)完全权限,则应将此行添加到策略文件中:

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

需要重新启动apiserver才能获取新的策略行。

注意:该ABAC授权功能在Kubernetes 1.6版本开始已被弃用!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券