Common Identity Service
Posted on Sun 18 May 2025 in tech
Abstract | Common Identity Service |
---|---|
Authors | Walter Fan |
Category | learning note |
Status | v1.0 |
Updated | 2025-05-18 |
License | CC-BY-NC-ND 4.0 |
构建统一身份体系:服务间通信的基石
What:为人或机器定义统一身份
在现代企业的分布式系统中,服务间通信频繁,身份认证与授权成为关键环节。我们提出建立“一套通用的身份体系”,为**所有内部服务实体(用户或机器)**提供统一的身份标识,确保整个系统中的身份具备:
- 一致性(统一结构与语义)
- 可追踪性(全链路可观测)
- 可控性(细粒度授权)
这不仅是架构规范化的体现,更是 Zero Trust 安全架构的关键组成。
Why:解决混乱身份带来的系统复杂度与安全风险
系统现状问题
- 身份结构不统一,字段语义不一致
- 服务 A 调用服务 B 时上下文丢失,无法感知调用者
- 权限控制逻辑分散,缺乏可复用组件
- 审计与日志记录不标准,无法进行追责和分析
风险代价
- 安全盲区:缺乏最小权限控制
- 治理困难:DevOps 团队无法统一管理权限与访问路径
- 合规压力:审计链路不完整,影响金融、医疗等行业合规性
统一身份体系是构建 服务治理平台(Service Mesh) 与实现 零信任安全(Zero Trust Security) 的第一步。
How:统一身份体系的四个关键实践
1. 通用身份模型设计
{
"sub": "abc-123",
"type": "user", // 或 machine
"scope": ["order:read"],
"metadata": {
"org": "acme-inc",
"env": "prod"
}
}
封装方式建议采用:
- JWT(适用于 OIDC)
- SPIFFE ID(用于服务身份)
SPIFFE ID 示例:
spiffe://example.org/ns/default/sa/order-service
2. 统一身份发放机制
用户身份发放(OIDC + Keycloak)
- 支持多种登录方式:LDAP、SAML、社交账户
- 签发 JWT,设置自定义 claim,如
scope
和department
Keycloak 客户端配置示例:
{
"clientId": "frontend-app",
"protocol": "openid-connect",
"publicClient": true,
"redirectUris": ["https://app.example.com/*"],
"attributes": {
"post.logout.redirect.uris": "+",
"use.refresh.tokens": "true"
}
}
服务身份发放(SPIRE)
- 每个服务注册为一个 SPIFFE ID
- 使用 node attestation + workload attestation 自动颁发 X.509/SVID
SPIRE registration 示例:
spire-server entry create \
-spiffeID spiffe://example.org/ns/default/sa/inventory-service \
-selector k8s:sa:inventory-service \
-parentID spiffe://example.org/ns/default/sa/spire-agent \
-ttl 3600
3. 请求链中强制携带身份令牌
所有请求链必须显式或隐式传递身份:
请求链图示:
+--------+ +----------------+ +-----------------+
| User | ──JWT──▶ | order-service | ──JWT────▶ | inventory-service |
+--------+ +----------------+ +-----------------+
▲ ▲ ▲
│ │ │
身份源(OIDC) 服务验证+传递 服务验证+授权判断
- 在 gRPC 中使用 metadata 传递
authorization
- 在 HTTP 中使用标准
Authorization: Bearer <token>
Istio 请求身份透传配置(Envoy Filter 或 AuthorizationPolicy):
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: allow-user-token
spec:
selector:
matchLabels:
app: inventory-service
action: ALLOW
rules:
- from:
- source:
requestPrincipals: ["*"]
4. 审计与可观测性体系
- 在每次服务调用中,记录统一格式的调用者身份(如
actor_id
、actor_type
) - 接入 OpenTelemetry,将调用链与 traceId 绑定
- 结合 Loki / Elastic 做链路审计
日志示例结构:
{
"trace_id": "abc-xyz",
"actor_id": "123456",
"actor_type": "user",
"request_path": "/inventory/update",
"timestamp": "2025-05-18T10:23:00Z"
}
实际场景示例
用户调用链
- 用户 A 登录系统,Keycloak 返回 JWT
- 前端调用
order-service
,携带用户 JWT order-service
将用户身份注入到调用inventory-service
的请求头inventory-service
校验身份并执行权限检查
服务身份调用链
order-service
定时任务启动,通过 SPIRE 获取机器身份- 使用 SVID 建立与
inventory-service
的 mTLS 连接 - 访问日志中记录调用者为
order-service
总结
统一身份体系不仅提升了服务之间的互信和可管控性,更是构建**平台工程(Platform Engineering)与零信任架构(Zero Trust Architecture)**的核心。
- ✅ 安全保障:统一身份 + 细粒度授权
- ✅ 提高效率:消除重复集成的认证模块
- ✅ 增强可观测:完整的审计链路与身份上下文
推荐工具与最佳实践汇总
目标 | 工具 | 最佳实践 |
---|---|---|
用户认证 | Keycloak | 自定义 claim,启用 introspection |
服务认证 | SPIRE | 自动注册、短期证书 |
网关/传输 | Istio + Envoy | RequestAuthentication + mTLS |
审计日志 | Loki + Promtail | 标准化结构字段,绑定 trace_id |
链路跟踪 | OpenTelemetry | 结合 trace 与身份上下文 |
参考资料
- SPIFFE / SPIRE
- NIST Zero Trust Architecture
- Keycloak Identity Brokering
- Istio Authorization Policies
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。