基于属性的访问控制(ABAC)定义了访问控制范例,通过使用将属性组合在一起的策略向用户授予访问权限。
使用--authorization-policy-file=SOME_FILENAME和--authorization-mode=ABAC启用ABAC模式。
策略文件格式是每行一个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/。
注意:unset属性与为其类型设置为零值的属性相同(例如,空字符串,0,false)。
Kubectl使用api-server的端点/api和/apis端点来发现服务的资源类型。
使用ABAC授权时,必须通过nonResourcePath策略中的属性显式公开这些特殊资源。
要检查特定kubectl操作中涉及的HTTP调用,可通过以下命令查看:
kubectl --v=8 version
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
每个服务帐户都有一个相应的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版本开始已被弃用!