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,如 scopedepartment

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_idactor_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"
}

实际场景示例

用户调用链

  1. 用户 A 登录系统,Keycloak 返回 JWT
  2. 前端调用 order-service,携带用户 JWT
  3. order-service 将用户身份注入到调用 inventory-service 的请求头
  4. inventory-service 校验身份并执行权限检查

服务身份调用链

  1. order-service 定时任务启动,通过 SPIRE 获取机器身份
  2. 使用 SVID 建立与 inventory-service 的 mTLS 连接
  3. 访问日志中记录调用者为 order-service

总结

统一身份体系不仅提升了服务之间的互信和可管控性,更是构建**平台工程(Platform Engineering)零信任架构(Zero Trust Architecture)**的核心。

  • ✅ 安全保障:统一身份 + 细粒度授权
  • ✅ 提高效率:消除重复集成的认证模块
  • ✅ 增强可观测:完整的审计链路与身份上下文

推荐工具与最佳实践汇总

目标 工具 最佳实践
用户认证 Keycloak 自定义 claim,启用 introspection
服务认证 SPIRE 自动注册、短期证书
网关/传输 Istio + Envoy RequestAuthentication + mTLS
审计日志 Loki + Promtail 标准化结构字段,绑定 trace_id
链路跟踪 OpenTelemetry 结合 trace 与身份上下文

参考资料


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。