前言¶
记录一下 kubernetes 中扮演另一个用户的 API 和用法(信息主要来自官方文档和源码)。
API¶
请求 api server 的时候指定以下 http header 之一即可实现用户扮演的需求(当然,请求方必须有扮演该用户的权限) (信息来自 文档 ):
- Impersonate-User: 扮演的用户的用户名
- Impersonate-Group: 扮演的用户组,多个值(出现多次)表示多个组,需要同时指定 Impersonate-User
- Impersonate-Extra-( extra name ): 动态指定的 key,用于指定用户的其他信息,需要同时指定 Impersonate-User
例子:
Impersonate-User: jane.doe@example.com Impersonate-Group: developers Impersonate-Group: admins Impersonate-Extra-dn: cn=jane,ou=engineers,dc=example,dc=com Impersonate-Extra-acme.com%2Fproject: some-project Impersonate-Extra-scopes: view Impersonate-Extra-scopes: development
Impersonate-User 和 Impersonate-Group 值的语法¶
Impersonate-User 的值即可以是 User 也可以是 service account,对应的语法如下:
- <User>: 普通的自定义 User ,比如 alice, bob
- system:serviceaccount:<namespace>:<serviceaccount>: 某个 namespace 下的 service account,比如 system:serviceaccount:kube-system:default 表示 kube-system namespace 下的 default service account
Impersonate-Group 的值即可以是普通的自定义 Group 也可以是系统内置的一些特定 group ,对应的语法如下:
- <Group>: 普通的自定义 Group ,比如 admins, developers
- system:authenticated: 所有已认证用户
- system:unauthenticated: 所有未认证用户
- system:serviceaccounts: 所有 serviceaccount (无论是哪个 namespace 下的)
- system:serviceaccounts:<namespace> : 某个 namespace 下的所有 serviceaccount
kubectl¶
kubectl 命令的 --as 可以配置 Impersonate-User 的值, --as-group 可以配置 Impersonate-Group 的值,例子:
- kubectl --as=system:serviceaccount:kube-system:default
- kubectl --as=superman --as-group=system:masters
配置扮演用户的权限¶
默认情况下大部分 user 或 serviceaccount 都是没有扮演用户的权限的,可以通过 RBAC 的方式配置权限。
简单来说就是需要为发起扮演的用户绑定一个拥有 impersonate 权限的 ClusterRole 。
可以扮演 user、group、serviceaccount 的 ClusterRole 例子:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: impersonator
rules:
- apiGroups: [""]
resources: ["users", "groups", "serviceaccounts"]
verbs: ["impersonate"]
Impersonate-Extra-( extra name ) header 支持的 (extra name) 也是需要绑定相应的 ClusterRole 。
比如下面的 ClusterRole 表示可以在扮演是设置 Impersonate-Extra-scopes header,其中的 scopes 就是在下面的 resources 里定义的:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: scopes-impersonator
rules:
# Can set "Impersonate-Extra-scopes" header.
- apiGroups: ["authentication.k8s.io"]
resources: ["userextras/scopes"]
verbs: ["impersonate"]
同时还可以通过 resourceNames 的值限制 header 的有效值,例子:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: limited-impersonator
rules:
# Can impersonate the user "jane.doe@example.com"
- apiGroups: [""]
resources: ["users"]
verbs: ["impersonate"]
resourceNames: ["jane.doe@example.com"]
# Can impersonate the groups "developers" and "admins"
- apiGroups: [""]
resources: ["groups"]
verbs: ["impersonate"]
resourceNames: ["developers","admins"]
# Can impersonate the extras field "scopes" with the values "view" and "development"
- apiGroups: ["authentication.k8s.io"]
resources: ["userextras/scopes"]
verbs: ["impersonate"]
resourceNames: ["view", "development"]
Comments