课题研究 云安全与容器安全 子课题02 · 第03页 / 共8页
02子课题 · 容器与Kubernetes安全

容器与Kubernetes安全第03页:认证授权与准入控制体系

Kubernetes默认开放、声明式配置的风格,决定了"谁能做什么"必须在准入链上被显式收敛。本页对身份与权限体系做工程级解剖:认证机制(X.509证书、Bearer Token、OIDC、Webhook)的选型与风险;RBAC四对象模型与最小权限落地;ServiceAccount令牌从长期有效到绑定短期令牌的治理演进;准入控制器的内置+动态双层体系(OPA Gatekeeper与Kyverno的对比选型);Secrets从etcd明文存储到KMS静态加密的治理路线;以及API审计策略作为一切检测的原始数据源。

认证RBACServiceAccountOIDC准入控制AdmissionGatekeeperKyvernoSecrets加密KMS审计日志研究状态:研究中
所属专题云安全与容器安全 › 子课题02 容器与Kubernetes安全
目标受众平台工程与安全运营人员、身份治理架构师、合规审计人员
全文结构认证 → 授权 → 准入 → 机密 → 审计

01 · 认证体系

API Server的认证阶段回答"你是谁"。Kubernetes原生不提供用户管理系统,而是通过可插拔认证器对接外部身份源——这一设计既是灵活性,也是误配置的高发区。

认证方式机制适用场景风险与注意
X.509客户端证书apiserver以CA证书验证客户端证书,证书CN/O字段映射为用户/组组件间通信(kubelet、controller-manager)、kubeadm引导、紧急运维通道证书无过期提醒机制,长期不轮换的运维证书等同永久凭证;吊销不便
静态Token文件apiserver启动参数--token-auth-file指向CSV文件仅建议用于引导期文件变更不热生效(需重启),明文存储,禁止用于生产长期凭证
Bootstrap Token动态签名类型的Secret(bootstrap.kubernetes.io/token),用于节点加入集群kubeadm join节点引导应设置较短有效期(默认24小时),用后清理
ServiceAccount Token签名的JWT,代表工作负载身份;分为长期Secret式与绑定式(BoundSA)两类Pod内进程访问API见第3节专项治理——本课题最高优先治理项之一
OpenID Connect(OIDC)apiserver对接企业IdP(如Keycloak、Azure AD),经id_token完成认证人员访问(kubectl、Dashboard)的唯一推荐方式需妥善配置issuer、CA与username/group claim映射;禁用证书回退通道
Webhook Token将Token转发给外部Webhook服务验证对接非OIDC的自定义身份系统Webhook服务成为认证链单点,其可用性直接影响集群可用性
匿名请求SystemAnonymous用户,受匿名用户RBAC规则约束某些健康检查场景生产集群应关闭(--anonymous-auth=false);历史上多个高危面与匿名访问叠加放大

人员访问的唯一推荐路径:人员经OIDC从企业IdP获取短期id_token(可叠加SSO+MFA)访问集群;服务账号仅用于工作负载且默认不挂载;集群管理员应急通道使用短有效期证书并全程审计。任何"为方便起见"长期有效的静态token文件均应在基线核查中清零。

02 · RBAC深度解析

RBAC(Role-Based Access Control)自Kubernetes v1.8起进入稳定版(GA),是事实上的授权标准。其模型由四个对象构成,理解授权判定的优先级规则是排查过度授权的前提。

2.1 四对象模型与判定规则

对象作用域说明
Role命名空间级定义某一namespace内对资源的权限集合
ClusterRole集群级定义集群级资源(nodes、PVs、非资源URL如/healthz)或跨namespace权限
RoleBinding命名空间级将Role(或ClusterRole)授予用户/组/SA,权限被限制在该namespace内
ClusterRoleBinding集群级将ClusterRole授予用户/组/SA,作用于全集群——最高危绑定对象
  • deny优先于allow,allow优先于默认拒绝:RBAC只有允许规则,无显式拒绝;一个主体在任一角色上获得allow即生效。聚合规则意味着排查时必须求并集。
  • 高危verb清单:escalate(权限提升)、impersonate(冒充其他主体)、bind(绑定更高权限角色)、escalate verbs组合可将低权限转化为集群管理权限——授予这些verb须等同于授予admin进行评审。
  • system:*组:system:masters组默认绑定cluster-admin;system:serviceaccounts、system:authenticated等伪组范围极大,任何对其的绑定都应视为配置事故。

2.2 最小权限工程化要点

  • 按"应用面→命名空间→verbs资源清单"三维生成Role,默认禁止ClusterRoleBinding;确需集群级读(如监控)使用内置的只读聚合ClusterRole并RoleBinding到指定namespace。
  • 对ServiceAccount实施"按服务拆分":一个Deployment一个SA,绝不复用default SA。
  • 开启--authorization-mode=RBAC,Node,Node授权器保障kubelet仅能操作本节点资源,与RBAC互补。
  • 周期性权限审查:用kubectl auth can-i以攻击者视角重放关键操作清单,输出差异报告。

03 · ServiceAccount与令牌治理

ServiceAccount(SA)是工作负载的集群内身份。其治理经历了三个阶段的演进,当前最佳实践已非常明确,但存量集群的治理欠账依然普遍。

阶段机制风险
长期Secret式令牌
(v1.21及之前为默认)
SA配套生成kubernetes.io/service-account-token类型Secret,挂载进Pod;令牌无过期时间令牌泄露即永久凭证;Secret被复制到CI/CD、镜像、笔记中的事故频发
绑定式短期令牌
(BoundServiceAccountTokenVolume,v1.21起默认启用)
经TokenRequest API签发的绑定令牌:限定受众(audience)、绑定Pod与SA、默认1小时有效期并自动轮换显著缩小泄露窗口;要求应用正确支持令牌轮换
手动TokenRequest外部工作负载(如CI/CD)经kubectl create token或API获取指定audience的短期令牌外部化场景推荐方式,消除长期kubeconfig落盘
  • automountServiceAccountToken=false:不访问API的Pod(绝大多数业务容器)应显式关闭令牌自动挂载——被攻破的容器不再自带集群凭证。
  • default SA最小化:default SA默认无权限(v1.24起不再自动创建配套Secret),但历史上其令牌常被误挂载;应确保无任何绑定将其与权限关联。
  • 外部云身份联合:对需要访问云资源(S3、数据库)的Pod,优先使用IRSA类机制(EKS)、Workload Identity(GKE/AKS)将K8s SA映射为云IAM角色,避免云密钥进Pod——这是Capital One类元数据凭证风险的容器版解法(与子课题01协同)。

04 · 准入控制体系

准入控制器是API Server处理链中在持久化之前执行的插件链,分两类:变更型(Mutating)在校验前修改对象(如注入sidecar、默认化安全字段),校验型(Validating)仅做放行/拒绝判定。"默认安全"的工程落地,90%发生在这一层。

4.1 内置准入插件的关键项

插件作用安全意义
PodSecurity(PSA)按namespace标签(pod-security.kubernetes.io/enforce等)强制执行PSS三档取代PSP的内置方案,本课题第4页详述
LimitRanger / ResourceQuota默认与上限约束Pod资源、数量配额防止资源耗尽型拒绝服务与"吵闹邻居"
ServiceAccount为未指定SA的Pod注入default SA知悉此默认行为,配合automount=false策略
NamespaceLifecycle禁止向处于终止中的namespace新建对象防止对象悬挂
ValidatingAdmissionPolicy
(v1.30 GA)
原生CEL表达式校验策略,无需外部Webhook轻量校验场景的首选,降低对外部准入服务的依赖

4.2 动态准入:策略即代码的两大主流

维度OPA GatekeeperKyverno
策略语言Rego(通用策略语言,学习曲线较陡)YAML声明式策略,无新语言
运行方式Webhook(ValidatingWebhookConfiguration)+ 审计同步Webhook;支持Generate(变更生成资源)、Verify Images(验签)等独有功能
生态OPA生态通用(也可用于Envoy等),ConstraintTemplate约束模板库成熟Kyverno策略库丰富,与K8s资源模型贴合度高
典型场景复杂跨资源策略、组织级统一策略平台K8s原生治理(标签、资源、镜像验签、生成默认网络策略)

准入链可靠性设计:动态准入Webhook是集群控制面的同步依赖——其故障/超时会阻塞全部写操作。必须:①为Webhook服务自身配置高可用与合理的failurePolicy(对关键安全策略用Fail,对非关键用Ignore+告警);②Webhook配置设置namespaceSelector/objectSelector排除其自身所在命名空间,避免死锁;③策略变更走GitOps评审,灰度启用(dry-run→audit→enforce)。

05 · Secrets全生命周期治理

Secrets是集群内最高浓度的敏感资产,其风险贯穿存储、分发、使用、轮换、删除五个环节。治理的核心事实是:etcd默认以Base64(可逆编码而非加密)存储Secret,任何获得etcd读取能力或备份访问能力的主体都可还原全部Secret。

5.1 静态加密:EncryptionConfiguration

  • apiserver通过EncryptionConfiguration配置项启用静态加密:支持aescbc、aesgcm、secretbox等本地提供者,以及通过KMS插件对接外部密钥管理服务(KMS v1自v1.10引入、自v1.28起废弃(v1.29起默认禁用),KMS v2自v1.29起稳定(GA),性能与轮换机制大幅改进)。
  • 采用 envelope encryption(信封加密)模式:数据密钥加密Secret,主密钥由外部KMS保管——即使etcd数据与快照泄露,攻击者无法脱离KMS解密。
  • 切换加密提供者后须执行存量数据重写(kubectl get|replace 批量触发),否则旧数据仍以旧方式存储。

5.2 分发与使用环节

  • 最小化挂载:仅挂载所需Secret的特定key;优先以volume而非环境变量注入(环境变量在crash日志、/proc//environ、describe输出中更易泄露)。
  • 外部化机密管理:对高价值凭证(数据库口令、TLS私钥),优先采用External Secrets Operator同步Vault/AWS Secrets Manager等外部系统,或使用Secrets Store CSI Driver实现"挂载即取、不落etcd"的模式。
  • RBAC收敛:get/list secrets是顶级敏感权限;列表权限(list)在一次调用中即导出全部Secret,应严格按namespace+sa拆分。
  • 轮换与失效:建立凭证轮换SOP(应用支持reload最佳);删除Secret后若etcd未加密且快照存在,凭证仍可能从备份还原——轮换是唯一彻底的失效手段。
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources: ["secrets"]
    providers:
      - kms:                    # KMS v2 信封加密(推荐)
          apiVersion: v2
          name: my-kms-plugin
          endpoint: unix:///var/run/kms/kms.sock
          timeout: 3s
      - aescbc:                 # 本地回退(密钥须安全分发与轮换)
          keys:
            - name: key1
              secret: <BASE64_32BYTE_KEY>
      - identity: {}            # 读取未加密旧数据用

说明:示例仅展示配置结构(截断),完整字段与KMS插件部署参见Kubernetes官方文档"Encrypting Confidential Data at Rest"。

06 · API审计日志

审计策略(Audit Policy)定义了哪些API事件被记录、以何种详细程度记录,是所有上层检测(异常行为分析、取证、合规)的原始数据源。没有审计日志的集群在事件响应中近乎"盲飞"。

审计级别记录内容适用对象
None不记录高频只读端点(如GET /healthz)降噪
Metadata请求元数据(用户、verb、资源、时间),不含请求/响应体默认基线——覆盖全部写操作与敏感读
Request元数据+请求体secrets变更等需复核输入的操作
RequestResponse元数据+请求体+响应体谨慎使用:响应体可能含机密数据,存储成本高
  • 阶段(stage):RequestReceived、ResponseStarted、ResponseComplete、Panic四类事件;审计后端可选日志文件或Webhook(动态后端)。
  • 基线策略原则:对所有"写verb + secrets/configmaps/rbac类资源"至少记录Metadata;对get/list secrets提级为Request;对系统组件高频读(leases/endpoints)设None降噪。
  • 集成:审计日志经Filebeat/DaemonSet或Webhook直推SIEM/日志平台;检测规则见第7页场景库(如"非运维时段批量list secrets")。

本节参考来源(第3页)

[1]

Kubernetes官方文档——认证(Authentication)、授权(RBAC)、准入控制器(Admission Controllers)、Secret管理与静态加密、审计:kubernetes.io/docs/reference/access-authn-authz;kubernetes.io(静态加密);kubernetes.io(审计)。

[2]

Kubernetes官方博客——RBAC良好实践(RBAC Good Practices)与ServiceAccount绑定令牌演进说明:kubernetes.io/blog。

[3]

OPA Gatekeeper官方文档:open-policy-agent.github.io/gatekeeper;Kyverno官方文档与策略库:kyverno.io/docs。

[4]

External Secrets Operator:external-secrets.io;Secrets Store CSI Driver:secrets-store-csi-driver.sigs.k8s.io;HashiCorp Vault:developer.hashicorp.com/vault。

[5]

NSA & CISA《Kubernetes Hardening Guidance》v1.1(2022):RBAC最小化、Secrets与凭证保护、审计日志章节。