简介
账号
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