身份与安全边界¶
微服务安全要区分用户身份与服务身份。用户是谁、能做什么,和某个工作负载是否有权调用另一个服务,是两套相关但不同的授权问题。
请求身份链¶
用户 → Identity Provider 登录
→ Gateway 验证 Token
→ 服务验证签名、受众、有效期和权限
→ 服务到服务使用工作负载身份 / mTLS
→ 数据层使用每服务最小权限账号
Gateway 验证过身份不代表内部服务可以无条件信任所有请求。关键服务仍需执行资源级授权,防止内部绕过和横向移动。
Token 与服务身份¶
- 短期 Token 优于长期固定密钥。
- 验证签名、issuer、audience、expiry,禁止只做 Base64 解码。
- 不在日志、URL、Trace attribute 中记录完整 Token。
- 服务账号按工作负载分配,不让所有 Pod 共用高权限身份。
- mTLS 同时提供加密和对端身份,但授权策略仍需单独定义。
Secret 生命周期¶
Secret 不进入镜像和明文 Git;由 Kubernetes Secret 配合静态加密、外部 Secret/KMS 等管理。轮换时考虑新旧凭据短期并存,避免一次更新导致所有实例失联。
网络与供应链¶
- 使用 NetworkPolicy/防火墙限制不必要的东西向和出站访问。
- 镜像固定版本或 digest,经过扫描、签名和来源校验。
- CI、Registry、GitOps 和集群权限分离并保留审计。
- 管理、调试、Actuator 和指标端点不直接暴露公网。
- API 入口限制请求体、上传大小、速率和异常输入。
发生凭据泄露时,删除日志或 Git 文件不够;要立即吊销和轮换,查询使用记录,评估可访问范围并修复传播链路。