3. 认证(Authentication)基础:ServiceAccount、UserAccount、X509证书、Bearer Token原理

在Kubernetes鉴权拦截链路中,认证(Authentication)是第一道关卡。只有通过认证的请求,才会进入后续的鉴权(Authorization)与准入控制(Admission Control)阶段。本章深入剖析四种核心认证机制:ServiceAccount、UserAccount、X509证书、Bearer Token,并揭示它们在错误处理链路中的关键作用。

3.1 认证体系全景:谁在请求API Server?

Kubernetes API Server 接收的所有请求,都必须携带身份凭证。认证模块负责从请求中提取并验证身份,最终将请求关联到一个确定的 UserInfo 对象(包含 Username、UID、Groups 和 Extra 字段)。

核心认知:Kubernetes 本身不管理用户(UserAccount),只管理服务账户(ServiceAccount)。普通用户通过 X509 证书或外部身份提供商(OIDC、Webhook)进行认证。
Kubernetes 认证体系全景图 Kubernetes 认证体系全景图 API Server 请求 认证模块(Authenticator Chain) X509 证书 CN/组织 → 用户/组 Bearer Token 静态/ServiceAccount/OIDC ServiceAccount Pod 内身份凭证 UserAccount 外部用户/管理员 UserInfo(Username/UID/Groups) 说明:认证模块按链式顺序尝试,任一成功即返回 UserInfo;全部失败则返回 401 Unauthorized 认证错误是鉴权拦截链路中最常见的错误来源之一

3.2 ServiceAccount:Pod 的身份凭证

ServiceAccount(服务账户)是 Kubernetes 为 Pod 内进程提供的身份标识。每个 Namespace 都有一个默认的 ServiceAccount(名为 default),Pod 未显式指定 ServiceAccount 时自动使用。

3.2.1 核心原理

  • 自动挂载:Kubernetes 将 ServiceAccount 的 Token 自动挂载到 Pod 的 /var/run/secrets/kubernetes.io/serviceaccount/ 目录。
  • Token 类型:传统 Token(静态 Secret)和 Projected Token(TokenRequest API),后者具有更短的过期时间和更安全的绑定机制。
  • 身份映射:ServiceAccount 名称映射为 system:serviceaccount:<namespace>:<name> 格式的 Username。
错误处理关键点:当 ServiceAccount 被删除或 Token 过期,Pod 内进程将无法通过认证,API 请求返回 401 Unauthorized。这是生产环境中常见的“静默故障”来源。

3.2.2 ServiceAccount 与 UserAccount 对比

对比维度 ServiceAccount UserAccount
管理方式 Kubernetes API 原生管理(kubectl create sa) 外部管理(证书、OIDC、Webhook)
使用场景 Pod 内进程、CronJob、Controller 管理员、CI/CD 系统、开发人员
命名空间 属于特定 Namespace 全局(集群级别)
用户名格式 system:serviceaccount:<ns>:<name> 自定义(如 admin@example.com)
自动挂载 自动挂载 Token 到 Pod 不适用
典型错误 Token 过期、SA 被删除、RBAC 未绑定 证书过期、Token 无效、OIDC 配置错误

3.3 X509 证书认证:双向 TLS 的基石

X509 客户端证书是 Kubernetes 最基础的认证方式之一。kubeconfig 文件中的 client-certificate 和 client-key 字段即用于此认证。

3.3.1 认证流程

  1. TLS 握手:客户端发起 HTTPS 请求,API Server 要求客户端提供证书。
  2. 证书验证:API Server 验证客户端证书的签名链(CA 信任)、有效期、是否被吊销。
  3. 身份提取:从证书的 CN(Common Name) 字段提取 Username,从 O(Organization) 字段提取 Groups。
  4. UserInfo 构建:将提取的信息封装为 UserInfo 对象,传递给后续鉴权模块。
常见错误陷阱:证书 CN 为空或格式错误会导致 Username 为空字符串;证书过期是生产环境中最频繁的认证故障原因之一。务必使用 openssl x509 -in client.crt -text -noout 定期检查证书有效期。

3.3.2 证书字段与身份映射

证书字段 映射到 UserInfo 示例值
CN (Common Name) Username admin、system:kube-controller-manager
O (Organization) Groups(可多个) system:masters、devops-team
OU (Organizational Unit) 不直接映射(可自定义) engineering

3.4 Bearer Token 认证:从静态到动态

Bearer Token 是 HTTP 请求头 Authorization: Bearer <token> 中携带的凭证。Kubernetes 支持多种 Token 类型。

3.4.1 Token 类型对比

Token 类型 来源 生命周期 安全性 典型错误
静态 Token 静态文件(--token-auth-file) 永久(需重启 API Server 更新) 低(泄露风险高) Token 被泄露、文件格式错误
ServiceAccount Token Secret 或 TokenRequest API 永久(Secret)或 1h(Projected) 中(需配合 RBAC) Token 过期、Secret 被删除
OIDC Token 外部身份提供商(如 Keycloak) 短时间(通常 1h) 高(支持刷新) OIDC 配置错误、Token 签名验证失败
Bootstrap Token 集群初始化时生成 临时(用于节点加入) 中 Token 过期、Secret 未创建

3.4.2 TokenRequest API:现代 ServiceAccount 认证

从 Kubernetes 1.21 开始,TokenRequest API 成为 ServiceAccount 获取 Token 的推荐方式。它生成的 Token 是 Projected Token,具有以下特性:

  • 绑定 Pod 身份:Token 中嵌入 Pod 的 UID,即使 Token 泄露也无法在其他 Pod 中使用。
  • 自动过期:默认 1 小时过期,减少泄露风险。
  • 自动刷新:kubelet 在 Token 过期前自动刷新挂载的 Token。
最佳实践:在 Kubernetes 1.24+ 中,创建 ServiceAccount 不再自动生成 Secret。应使用 kubectl create token <sa-name> 或 TokenRequest API 获取临时 Token,避免使用永久 Secret Token。
TokenRequest API 认证流程 TokenRequest API 认证流程 ① Pod 内进程 请求 TokenRequest API ② API Server 验证 Pod 身份 & RBAC ③ 生成 Token 嵌入 Pod UID + 过期时间 返回 Projected Token ④ 使用 Token Authorization: Bearer <token> ⑤ 验证 Token 签名验证 + 过期检查 + Pod 绑定 ⑥ 返回 UserInfo Username/UID/Groups TokenRequest API 常见认证错误 • Token 过期:默认 1h,kubelet 自动刷新失败时返回 401 • Pod 绑定失效:Pod 被删除后 Token 立即失效 • RBAC 未绑定:Token 有效但无权限,返回 403 Forbidden • Token 签名密钥轮换:API Server 重启后旧 Token 可能失效

3.5 认证链与错误处理策略

API Server 的认证模块以 链式(Chain) 方式工作。每个认证器依次尝试,任一成功即停止;全部失败则返回 401 Unauthorized。

3.5.1 默认认证链顺序

  1. X509 证书认证器(验证客户端证书)
  2. Bearer Token 认证器(验证 Token)
  3. ServiceAccount 认证器(验证 ServiceAccount Token)
  4. Webhook Token 认证器(外部认证服务)
  5. Anonymous 认证器(允许匿名请求,默认禁用)

3.5.2 认证错误分类与排查

错误类型 HTTP 状态码 常见原因 排查方法
证书错误 401 证书过期、CA 不信任、CN 为空 openssl verify -CAfile ca.crt client.crt
Token 错误 401 Token 过期、格式错误、签名无效 检查 Token 是否包含 . 分隔的三段
ServiceAccount 错误 401 SA 被删除、Token Secret 不存在 kubectl get sa -n <ns> 检查 SA 状态
OIDC 错误 401 Issuer 不可达、ClientID 不匹配 检查 API Server 日志中的 OIDC 错误
匿名请求被拒 401 --anonymous-auth=false 检查 API Server 启动参数
工程落地建议:在鉴权拦截链路中,认证错误应优先记录 详细的错误原因(如“证书过期于 2024-12-31”),而非仅返回“401 Unauthorized”。这有助于快速定位问题,减少排障时间。

3.6 本章小结

  • ServiceAccount 是 Pod 的身份凭证,推荐使用 TokenRequest API 获取临时 Token。
  • UserAccount 由外部管理,X509 证书和 Bearer Token 是两种主要认证方式。
  • X509 证书 通过 CN/O 字段映射 Username 和 Groups,证书过期是常见故障。
  • Bearer Token 支持静态、ServiceAccount、OIDC 等多种类型,Projected Token 提供更高的安全性。
  • 认证链按顺序尝试,全部失败返回 401;详细的错误日志是高效排障的关键。