Kubernetes 用户、RBAC 与企业访问体系
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| API | Application Programming Interface | 应用程序编程接口 |
| CA | Certificate Authority | 证书颁发机构 |
| CRD | Custom Resource Definition | Kubernetes 自定义资源定义 |
| CSR | Certificate Signing Request | 证书签名请求 |
| EKS | Elastic Kubernetes Service | AWS 托管 Kubernetes 服务 |
| GCP | Google Cloud Platform | Google 云平台 |
| GitOps | GitOps | 以 Git 保存期望状态、由自动化持续协调实际状态的运维方式 |
| GKE | Google Kubernetes Engine | Google 托管 Kubernetes 服务 |
| IAM | Identity and Access Management | 身份与访问管理 |
| IdP | Identity Provider | 身份提供方 |
| IRSA | IAM Roles for Service Accounts | 通过 Kubernetes 服务账号关联 AWS IAM 角色 |
| JWKS | JSON Web Key Set | JSON Web 密钥集,常用于验证令牌签名 |
| JWT | JSON Web Token | 一种携带声明的令牌格式 |
| MFA | Multi-Factor Authentication | 多因素认证 |
| OIDC | OpenID Connect | 基于 OAuth 2.0 的身份认证协议 |
| RBAC | Role-Based Access Control | 基于角色的访问控制 |
| SA | Service Account | 服务账号,供程序或工作负载使用的身份 |
| SSO | Single Sign-On | 单点登录 |
| UID | Unique Identifier | 唯一标识符;Linux 权限语境中为 User ID(用户标识) |
| YAML | YAML Ain’t Markup Language | 常用于配置文件的数据序列化语言 |
前置:实践约定、平台管理员、企业 IdP;演练只授权 orders。Kubernetes 没有普通 User 资源,人员身份来自外部认证;ServiceAccount 是命名空间内对象。
| 层 | 自建 | EKS | GKE |
|---|---|---|---|
| 认证 | OIDC/客户端证书 | IAM + EKS access entry | Google 身份/认证插件 |
| 集群内授权 | RBAC | RBAC 或 EKS access policy;权限可能叠加 | RBAC 与 GCP IAM 的适用权限均需检查 |
| Pod 访问云资源 | 工作负载联合身份 | IRSA/Pod Identity | Workload Identity Federation |
Pod 云角色不等于员工 kubectl 权限,Namespace 也不等于完整租户隔离。
1. 创建只读运维角色#
保存 orders-reader.yaml;日志可能含业务敏感数据,是否开放由团队确定;不授予 Secret、exec、port-forward。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata: {name: orders-reader, namespace: orders}
rules:
- apiGroups: [""]
resources: [pods, services, events]
verbs: [get, list, watch]
- apiGroups: [""]
resources: [pods/log]
verbs: [get]
- apiGroups: [apps]
resources: [deployments, replicasets, statefulsets]
verbs: [get, list, watch]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata: {name: commerce-readers, namespace: orders}
subjects:
- {kind: Group, name: 'oidc:commerce-readers', apiGroup: rbac.authorization.k8s.io}
roleRef: {kind: Role, name: orders-reader, apiGroup: rbac.authorization.k8s.io}kubectl apply --dry-run=server -f orders-reader.yaml
kubectl apply -f orders-reader.yaml
kubectl auth can-i list pods -n orders --as=review-user --as-group=oidc:commerce-readers
kubectl auth can-i get secrets -n orders --as=review-user --as-group=oidc:commerce-readers
kubectl auth can-i create pods/exec -n orders --as=review-user --as-group=oidc:commerce-readers
kubectl auth can-i list pods -n kube-system --as=review-user --as-group=oidc:commerce-readers结果依次 yes/no/no/no。执行者需 impersonate 权限;此测试验证授权映射,不能替代真实登录测试。ClusterRole 可复用规则;用 RoleBinding 引用仍限制在其 namespace;ClusterRoleBinding 才是集群范围授权。
2. 接入真实人员身份#
自建集群:IdP 注册专用 OIDC client,JWT 必须含固定 audience、稳定用户标识和组声明;所有 API Server 配置相同。以下是静态 Pod command 需要添加的参数,非可直接 apply 的 YAML:
--oidc-issuer-url=https://id.example.com/realms/platform
--oidc-client-id=kubernetes
--oidc-username-claim=sub
--oidc-username-prefix=oidc:
--oidc-groups-claim=groups
--oidc-groups-prefix=oidc:私有 CA 另配置 --oidc-ca-file 并挂载。先在一个控制面试点,确认 /readyz 和 IdP/JWKS 网络正常,再滚动其余控制面;已有 AuthenticationConfiguration 时不混用冲突参数。客户端使用企业批准的 OIDC exec 插件,不给员工复制 admin.conf。IdP groups 原始值为 commerce-readers,经前缀后匹配上面的组。
EKS:平台在支持 access entry 的认证模式下执行;现有集群先盘点迁移与应急入口,不能盲改认证模式:
aws eks create-access-entry --cluster-name "$CLUSTER" --principal-arn "$READONLY_ROLE_ARN" --type STANDARD --kubernetes-groups oidc:commerce-readers
aws eks describe-access-entry --cluster-name "$CLUSTER" --principal-arn "$READONLY_ROLE_ARN"角色信任只允许企业身份使用;这里不再关联宽泛 EKS access policy。员工通过 SSO 获取该角色短期凭据后 aws eks update-kubeconfig,真实运行 get pods 和拒绝测试。GKE 使用实际 Google 用户/已配置 Google Groups for RBAC 的组创建对应 RoleBinding,并核对其项目 IAM 没有额外写权限。
3. 工作负载身份与提权边界#
kubectl -n orders create serviceaccount report-reader
kubectl -n orders create rolebinding report-reader --role=orders-reader --serviceaccount=orders:report-reader
kubectl auth can-i list pods -n orders --as=system:serviceaccount:orders:report-reader
kubectl auth can-i get secrets -n orders --as=system:serviceaccount:orders:report-reader需要 API 的应用使用 projected 短期 token;无需 API 的 SA 设置 automountServiceAccountToken: false。能创建 Pod 的人可能挂载 Secret、使用高权限 SA;仅禁止 get secrets 不足以防提权。限制 bind/escalate/impersonate、token 创建、CSR approve、webhook/CRD 写权限;生产发布走受限 GitOps。
4. 真实登录与原会话撤权验收#
准备一个没有额外集群/云端授权的专用测试用户、其已登录 kubeconfig 和独立管理员 context。文件权限 0600,不要导出 kubeconfig 原文。先执行 auth whoami 确认真实用户名与组;以下 RoleBinding 只用于本次测试,不删除正式人员组绑定。
export ADMIN_CONTEXT='REPLACE_ADMIN_CONTEXT'
export REVIEW_KUBECONFIG='/secure/path/review-user.kubeconfig'
kubectl --kubeconfig="$REVIEW_KUBECONFIG" auth whoami
export REVIEW_SUBJECT='REPLACE_EXACT_AUTHENTICATED_USERNAME'
kubectl --context="$ADMIN_CONTEXT" -n orders create rolebinding review-only-reader --role=orders-reader --user="$REVIEW_SUBJECT" --dry-run=server -o name
kubectl --context="$ADMIN_CONTEXT" -n orders create rolebinding review-only-reader --role=orders-reader --user="$REVIEW_SUBJECT"
kubectl --kubeconfig="$REVIEW_KUBECONFIG" -n orders get pods -o name
# 预期 Forbidden;只请求名称,即使意外获权也不打印 Secret 内容。
kubectl --kubeconfig="$REVIEW_KUBECONFIG" -n orders get secrets -o name
kubectl --kubeconfig="$REVIEW_KUBECONFIG" -n kube-system get pods -o name
kubectl --kubeconfig="$REVIEW_KUBECONFIG" auth can-i create pods/exec -n orders预期依次:本命名空间 Pod 可读、Secret 和 kube-system Pod 被拒、exec 返回 no。Unauthorized、证书错误或网络失败不能替代 Forbidden 验收。若测试绑定已存在,先核对所有者,不覆盖或删除他人的绑定。
管理员撤销本次绑定,测试用户保持现有登录:
kubectl --context="$ADMIN_CONTEXT" -n orders delete rolebinding review-only-reader
kubectl --kubeconfig="$REVIEW_KUBECONFIG" -n orders get pods -o name预期 Forbidden;再重新登录重复测试,仍应被拒。若 exec 插件自动刷新 token,这只能证明该身份已撤权,不能用于测量原 token 的剩余有效期。保留撤权前后审计记录与时间;若仍允许,检查其他 RoleBinding/ClusterRoleBinding、用户组及 EKS/GKE 云端授权。can-i --as 只验证授权映射,不能证明真实身份认证成功。
5. 撤权与应急演练#
- 企业员工真实登录,保存允许/拒绝结果及审计 request UID。
- 删除测试 RoleBinding,重新验证原会话被拒;它若仍获权,检查其他绑定/云授权。
- IdP 撤组后考虑已签 JWT 有效期,不把“退出 SSO”当立即吊销所有 token;限制短会话并移除授权映射。
- 应急身份分人保管、MFA、短时授权、自动告警;不用共享
system:masters日常工作。
kubectl -n orders delete rolebinding report-reader
kubectl -n orders delete serviceaccount report-reader保留正式 reader 角色;失败时撤销本次绑定,不扩大到 cluster-admin。