从传统RBAC的角度理解K8S的RBAC

RBAC,一个用户可以有多个角色,一个角色可以有多个控制。

在K8S中,有(省略了部分配置):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: ingress-nginx
rules:
  
  # 对namespaces资源的控制
  - apiGroups:
      - ''
    resources:
      - namespaces
    verbs:
      - get
  
  # 对configmaps、pods、secrets、endpoints资源的配置
  - apiGroups:
      - ''
    resources:
      - configmaps
      - pods
      - secrets
      - endpoints
    verbs:
      - get
      - list
      - watch

---

# 类似用户角色关联表,但是它是角色到用户一对多,而传统的是用户到角色一对多
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding

# 关联的角色(角色Id)
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: ingress-nginx

# 绑定到的用户(用户Id)
subjects:
  - kind: ServiceAccount
    name: ingress-nginx
    namespace: ingress-nginx

假如我现在有一个需求,我需要为一个用户配置多个角色,在传统的方案中我会怎么做,我会在用户角色关联表里插入多条记录;在K8S的方案中,我需要怎么做呢?我需要创建多个RoleBinding,这个显然不是很优雅的解决方案,不如专门创建一个角色,然后绑定到这个用户上。

现在我发现很多时候,Service、Role、ClusterRole、RoleBinding、ClusterBinding都是谁需要谁自己准备好清单文件,然后由集群管理员创建出来,假如一个恶意的服务,它完全可以准备一份拥有非常高权限的清单文件,然后获取集群的信息,做一些攻击行为,我不知道这种事情现在该如何避免。

其实这个问题时普遍存在的,比如我们手机APP,它就是知道自己要哪些权限,然后申请这些权限,我们再赋予给它。假如我们赋权时不仔细甄别,可能就被APP拿去很高的权限,然后做一些攻击行为了。