K8S 权限管理介绍

2021-03-02 container

简介

账号

K8S中的账号分为:

  • User Accounts 用户账户,用于集群外自然人使用,是全局性的唯一标识,详见 ~/.kube/config 中的配置 users.name 配置项。
  • Service Accounts 服务账户,用于 Pod 中的程序做身份认证,仅局限于所在的 Namespace 中,每个 Namespace 会自动创建默认账号,创建 Pod 时会默认使用该账号。

另外,如果启动 K8S 时添加了 --admission_control=ServiceAccount 参数配置,那么创建 ServiceAccount 时会随之创建一个 kubernetes.io/service-account-token 类型的 Secret 对象。

身份认证

包含如下几种:

  • 客户端证书,将 APIServer 中 --client-ca-file=xxx 指定的文件作为 CA 中心,同时验证有效性,并将 Subject 中的 CN 属性作为用户名。
  • 静态 Token 文件,需要通过 --token-auth-file=xxx 指定 Token 文件,这是一个包含 Token、用户名、用户ID 的 CSV 文件,请求需要同时带上 Authorization: Bearer 参数。
  • 静态密码文件,通过 --basic-auth-file=xxx 选项启用密码验证,同样包含指定密码、用户名、用户ID的 CSV 文件,然后在请求中带上 Authorization: Basic 参数。

APIServer 支持几种鉴权策略,这里仅列举常见的:

  • AlwaysDeny/AlwaysAllow 通常用于测试。
  • Node 对 kubelet 发送请求专用访问控制。
  • ABAC 基于属性的访问控制。
  • RBAC 基于角色的访问控制。
  • Webhook 通过调用外部的 Rest 请求进行授权。

RBAC

如果要使用 RBAC 策略,需要在 APIServer 中通过 --authorization-mode=RBAC 参数启动,会使用 rbac.authorization.k8s.io 这个 API Group 来实现授权决策,

  • Subject 对象,也就是规则作用的对象,包括用户+用户组、服务账号。
  • Role 角色,定义一组对 Kubernetes API 对象操作的规则,范围限定在某个 namespace 内。
  • ClusterRole 集群角色,该角色不受 namespace 的限制。
  • RoleBinding 将角色和对象进行绑定,范围限定在某个 namespace 内。
  • ClusterRoleBinding 将集群角色和对象进行绑定,不受 namespace 限制。
# vim role.yaml
kind: Role/ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  namespace: default          # 如果是集群角色则无需绑定具体命名空间
  name: pod-reader
rules:
- apiGroups: [""]             # 空字符串表明使用Core API Group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
# vim role_binding.yaml
kind: RoleBinding/ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: read-pods
  namespace: default         # 如果是集群角色绑定则无需绑定具体命名空间
subjects:
- kind: User
  name: Caden
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

常用命令

----- 查看某个namespace下的角色/集群角色信息
kubectl get role -n kube-system
kubectl get clusterrole -n kube-system
----- 查看某个namespace下的具体角色详细信息
kubectl get role <RoleName> -n kube-system -o yaml
kubectl get clusterrole <ClusterRoleName> -n kube-system -o yaml

----- 查看某个namespace下的角色绑定/集群角色绑定信息
kubectl get rolebinding -n kube-system
kubectl get clusterrolebinding -n kube-system
----- 查看某个namespace下的具体角色绑定/集群角色绑定详细信息
kubectl get rolebinding <RoleBindName> -n kube-system -o yaml
kubectl get clusterrolebinding <ClusterRoleBindName> -n kube-system -o yaml