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