控制用户权限

为了简单方便,小集群或测试环境集群我们通常使用最高权限的 admin 账号,可以做任何操作,但是如果是重要的生产环境集群,可以操作集群的人比较多,如果这时还用这个账号可能就会比较危险,一旦有人误操作或故意搞事就可能酿成大错,即使 apiserver 开启审计也无法知道是谁做的操作,所以最好控制下权限,根据人的级别或角色创建拥有对应权限的账号,这个可以通过 RBAC 来实现(确保 kube-apiserver 启动参数 --authorization-mode=RBAC),基本思想是创建 User 或 ServiceAccount 绑定 Role 或 ClusterRole 来控制权限。

User 来源

User 的来源有多种:

  • token 文件: 给 kube-apiserver 启动参数 --token-auth-file 传一个 token 认证文件,比如: --token-auth-file=/etc/kubernetes/known_tokens.csv
    • token 文件每一行表示一个用户,示例: wJmq****PPWj,admin,admin,system:masters
    • 第一个字段是 token 的值,最后一个字段是用户组,token 认证用户名不重要,不会识别
  • 证书: 通过使用 CA 证书给用户签发证书,签发的证书中 CN 字段是用户名,O 是用户组

" class="reference-link">使用 RBAC 控制用户权限

下面给出几个 RBAC 定义示例。

给 roc 授权 test 命名空间所有权限,istio-system 命名空间的只读权限:

  1. kind: Role
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. name: admin
  5. namespace: test
  6. rules:
  7. - apiGroups: ["*"]
  8. resources: ["*"]
  9. verbs: ["*"]
  10. ---
  11. kind: RoleBinding
  12. apiVersion: rbac.authorization.k8s.io/v1
  13. metadata:
  14. name: admin-to-roc
  15. namespace: test
  16. subjects:
  17. - kind: User
  18. name: roc
  19. apiGroup: rbac.authorization.k8s.io
  20. roleRef:
  21. kind: Role
  22. name: admin
  23. apiGroup: rbac.authorization.k8s.io
  24. ---
  25. kind: Role
  26. apiVersion: rbac.authorization.k8s.io/v1
  27. metadata:
  28. name: readonly
  29. namespace: istio-system
  30. rules:
  31. - apiGroups: ["*"]
  32. resources: ["*"]
  33. verbs: ["get", "watch", "list"]
  34. ---
  35. kind: RoleBinding
  36. apiVersion: rbac.authorization.k8s.io/v1
  37. metadata:
  38. name: readonly-to-roc
  39. namespace: istio-system
  40. subjects:
  41. - kind: User
  42. name: roc
  43. apiGroup: rbac.authorization.k8s.io
  44. roleRef:
  45. kind: Role
  46. name: readonly
  47. apiGroup: rbac.authorization.k8s.io

给 roc 授权整个集群的只读权限:

  1. kind: ClusterRole
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. name: readonly
  5. rules:
  6. - apiGroups: ["*"]
  7. resources: ["*"]
  8. verbs: ["get", "watch", "list"]
  9. ---
  10. kind: ClusterRoleBinding
  11. apiVersion: rbac.authorization.k8s.io/v1
  12. metadata:
  13. name: readonly-to-roc
  14. subjects:
  15. - kind: User
  16. name: roc
  17. apiGroup: rbac.authorization.k8s.io
  18. roleRef:
  19. kind: ClusterRole
  20. name: readonly
  21. apiGroup: rbac.authorization.k8s.io

给 manager 用户组里所有用户授权 secret 读权限:

  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: ClusterRole
  3. metadata:
  4. name: secret-reader
  5. rules:
  6. - apiGroups: [""]
  7. resources: ["secrets"]
  8. verbs: ["get", "watch", "list"]
  9. ---
  10. apiVersion: rbac.authorization.k8s.io/v1
  11. kind: ClusterRoleBinding
  12. metadata:
  13. name: read-secrets-global
  14. subjects:
  15. - kind: Group
  16. name: manager
  17. apiGroup: rbac.authorization.k8s.io
  18. roleRef:
  19. kind: ClusterRole
  20. name: secret-reader
  21. apiGroup: rbac.authorization.k8s.io

配置 kubeconfig

  1. # 如果使用证书认证,使用下面命令配置用户认证信息
  2. kubectl config set-credentials <user> --embed-certs=true --client-certificate=<client-cert-file> --client-key=<client-key-file>
  3. # 如果使用 token 认证,使用下面命令配置用户认证信息
  4. # kubectl config set-credentials <user> --token='<token>'
  5. # 配置cluster entry
  6. kubectl config set-cluster <cluster> --server=<apiserver-url> --certificate-authority=<ca-cert-file>
  7. # 配置context entry
  8. kubectl config set-context <context> --cluster=<cluster> --user=<user>
  9. # 配置当前使用的context
  10. kubectl config use-context <context>
  11. # 查看
  12. kubectl config view

参考资料