• 控制用户权限
    • User 来源
    • " level="2">使用 RBAC 控制用户权限
    • 配置 kubeconfig
    • 参考资料

    控制用户权限

    为了简单方便,小集群或测试环境集群我们通常使用最高权限的 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

    参考资料

    • https://kubernetes.io/zh/docs/reference/access-authn-authz/service-accounts-admin/
    • https://kubernetes.io/docs/reference/access-authn-authz/rbac/