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. 撤权与应急演练#

  1. 企业员工真实登录,保存允许/拒绝结果及审计 request UID。
  2. 删除测试 RoleBinding,重新验证原会话被拒;它若仍获权,检查其他绑定/云授权。
  3. IdP 撤组后考虑已签 JWT 有效期,不把“退出 SSO”当立即吊销所有 token;限制短会话并移除授权映射。
  4. 应急身份分人保管、MFA、短时授权、自动告警;不用共享 system:masters 日常工作。
kubectl -n orders delete rolebinding report-reader
kubectl -n orders delete serviceaccount report-reader

保留正式 reader 角色;失败时撤销本次绑定,不扩大到 cluster-admin。

参考:RBAC、提权风险、OIDC、EKS access entries。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭