learning/k8s-advanced/sec/rbac/escalation.md
RBAC API 可以阻止用户通过编辑角色(Role/ClusterRole)和角色绑定(RoleBinding/ClusterRoleBinding)的方式越权。由于此校验在 API 级别,即使在未使用 RBAC authorizer 的情况下,也会执行。
只有当下面任意一个条件满足时,用户才可以创建/更新角色:
ClusterRole 集群级别, Role 同名称空间或者集群级别)rbac.authorization.k8s.io API group 中的角色或角色绑定执行 escalate 操作(不低于 Kubernetes 1.12)例如,如果 “user-1” 不能查询集群范围内的 secret 列表,则,他也不能创建包含该权限的 ClusterRole。如需要允许该用户创建/更新这样的角色:
Role 或 ClusterRole 对象Role 或 ClusterRole 中包含用户自己不具备的权限,该 API 调用将被禁止)Role 或 ClusterRole 中添加针对 rbac.authorization.k8s.io API group 中 Role 或 ClusterRole 执行 escalate 操作的权限(不低于 Kubernetes 1.12)只有当下面任意一个条件满足时,用户才可以创建/更新角色绑定:
Role、ClusterRole 执行 escalate 操作 (不低于 Kubernetes 1.12)例如,如果 “user-1” 不能查询集群范围内的 secret 列表,则,他也不能创建关联到包含该权限的 Role/ClusterRole 的 ClusterRoleBinding。如需要允许该用户创建/更新这样的 RoleBinding:
RoleBinding 或 ClusterRoleBinding 对象RoleBinding 将要引用的角色中所有的权限Role/ClusterRole 执行 bind 操作的权限例如,下面的 ClusterRole 和 RoleBinding 将允许 “user-1” 为其他用户授予对 “user-1-namespace” 名称空间下的 Role 执行 admin、edit、view 操作的权限:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: role-grantor
rules:
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["rolebindings"]
verbs: ["create"]
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["clusterroles"]
verbs: ["bind"]
resourceNames: ["admin","edit","view"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: role-grantor-binding
namespace: user-1-namespace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: role-grantor
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: user-1
当引导(bootstrap)第一个 Role 和 RoleBinding 时,允许初始用户为在新建用户时为新用户授予初始用户尚未拥有的权限是有必要的。此时可以:
system:masters group 中的用户,该 group 默认绑定到 cluster-admin 超级用户角色--insecure-port),可以通过该端口调用 API Server 的接口,此时不会执行认证和授权校验