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 Gatekeeper | Kyverno |
|---|---|---|
| 策略语言 | 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页)
Kubernetes官方文档——认证(Authentication)、授权(RBAC)、准入控制器(Admission Controllers)、Secret管理与静态加密、审计:kubernetes.io/docs/reference/access-authn-authz;kubernetes.io(静态加密);kubernetes.io(审计)。
Kubernetes官方博客——RBAC良好实践(RBAC Good Practices)与ServiceAccount绑定令牌演进说明:kubernetes.io/blog。
OPA Gatekeeper官方文档:open-policy-agent.github.io/gatekeeper;Kyverno官方文档与策略库:kyverno.io/docs。
External Secrets Operator:external-secrets.io;Secrets Store CSI Driver:secrets-store-csi-driver.sigs.k8s.io;HashiCorp Vault:developer.hashicorp.com/vault。
NSA & CISA《Kubernetes Hardening Guidance》v1.1(2022):RBAC最小化、Secrets与凭证保护、审计日志章节。