Hotdry.
ai-security

使用 Kratos 部署自托管身份服务器:支持多因素认证、OAuth2/OIDC 和自助服务流程

指导在微服务中部署 Ory Kratos 自托管身份服务器,实现多因素认证、OAuth2/OIDC 集成和可扩展的用户管理自助流程。

在微服务架构中,用户身份管理和认证是核心挑战。传统方案如 Auth0 或 Okta 虽强大,但依赖云服务可能带来合规性和成本问题。Ory Kratos 作为开源、云原生身份服务器,提供 headless API 设计,支持自托管部署。它用 Go 语言编写,可扩展至亿级用户,支持多因素认证 (MFA)、OAuth2/OIDC 集成以及自助服务流程 (self-service flows),完美适用于微服务环境。本文聚焦单一技术点:如何部署自托管 Kratos,实现 MFA、OAuth2/OIDC 和自助流程的可落地配置。

为什么选择 Kratos 自托管?

Kratos 的优势在于其 API-first 架构,避免了 UI 耦合,便于集成到现有微服务中。它支持密码、社交登录、Passkeys、Magic Link、MFA (TOTP/SMS)、SAML 等多种认证方式。自助服务流程包括注册、登录、注销、设置、恢复和验证,用户可独立管理账户,无需管理员干预。这在微服务中确保了用户管理的可扩展性,同时降低运维负担。

部署自托管 Kratos 可避免第三方依赖,确保数据主权。相比 Homegrown 方案,Kratos 提供生产级特性,如 CSRF 保护、会话管理(JWT 或 cookie)。在微服务中,它可作为中央身份提供者 (IdP),通过 OIDC 与服务间联邦认证。

部署步骤:基础环境搭建

首先,准备 Docker 和 Docker Compose 环境。Kratos 推荐使用 PostgreSQL 作为后端数据库。克隆官方仓库:

git clone https://github.com/ory/kratos.git
cd kratos

使用 quickstart 配置启动服务。编辑 contrib/quickstart/kratos/kratos.yml 文件,设置数据库连接和公共 / 管理 API 端口。默认端口:公共 API 4433,管理 API 4434。

示例 docker-compose.yml 配置(基于 quickstart):

version: '3'
services:
  kratos:
    image: oryd/kratos:v1.2.0
    ports:
      - "4433:4433"
      - "4434:4434"
    command: serve --dev
    environment:
      - DSN=postgres://kratos:secret@postgres:5432/kratos?sslmode=disable&max_conns=20&max_idle_conns=4
      - LOG_LEVEL=debug
    depends_on:
      - postgres
    volumes:
      - ./kratos.yml:/etc/config/kratos/kratos.yml
  postgres:
    image: postgres:15
    environment:
      - POSTGRES_USER=kratos
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=kratos
    volumes:
      - postgres_data:/var/lib/postgresql/data
volumes:
  postgres_data:

运行 docker-compose up --build。访问 http://localhost:4433/self-service/welcome 检查服务是否启动。Kratos 默认提供欢迎页,但生产环境需自定义 UI 或集成到前端(如 React)。

关键参数:

  • DSN:数据库连接字符串,建议使用 TLS 加密生产环境。
  • serve --dev:开发模式,生产用 --config /etc/config/kratos/kratos.yml
  • 资源限制:CPU 1 core, 内存 512MB 起步,亿级用户需 Kubernetes 集群扩展。

配置多因素认证 (MFA)

MFA 是安全基石,Kratos 支持 TOTP (Google Authenticator)、WebAuthn (FIDO2) 和 SMS。启用 MFA 在自助设置流程中实现,用户可自行绑定设备。

kratos.yml 中配置:

selfservice:
  flows:
    settings:
      ui_url: https://your-ui.com/settings
      privileged_session_max_age: 15m  # MFA 后延长会话
  methods:
    totp:
      enabled: true
      issuer: "Your Company"
    webauthn:
      enabled: true
  • TOTP 配置:用户在设置页面生成二维码,扫描后输入 6 位码验证。阈值:失败 3 次锁定 5 分钟。
  • WebAuthn:支持硬件密钥 (YubiKey),注册时挑战 - response 机制。参数:RP ID 为域名,超时 30s。
  • SMS:集成 Twilio 等提供商,配置 method: sms 和 API 密钥。限制:每日 100 条 / 用户,避免滥用。

落地清单:

  1. 初始化 MFA 流程:GET /self-service/settings/flows?update=true。
  2. 提交绑定:POST /self-service/settings,包含 method: totp 和 secret。
  3. 验证:登录后强制 MFA,失败回滚到密码。
  4. 监控:日志 MFA 尝试率,警报异常 >5%。

风险:弱 MFA 易绕过,确保 TOTP 种子安全存储(数据库加密)。

集成 OAuth2/OIDC 和自助服务流程

Kratos 本身不直接处理 OAuth2,但通过与 Ory Hydra 集成实现 OIDC 提供者 (OP)。Hydra 处理授权码流、令牌发放,Kratos 提供用户身份。

部署 Hydra:

docker run -d --name hydra oryd/hydra:v2.2.0 serve all --dangerous-force-http

配置 Kratos OIDC:

oauth2:
  provider:
    url: http://hydra:4444/
    client_id: kratos
    client_secret: secret

自助服务流程:

  • 注册:POST /self-service/registration,traits 包括 email/password。启用验证码:captcha: enabled: true
  • 登录:支持 password/OIDC。流程:初始化 GET /self-service/login/browser,返回 flow ID,前端渲染表单。
  • 恢复:email 码重置,超时 10m。
  • 设置:更新 traits/MFA,privileged 会话需 MFA。

OIDC 集成参数:

  • 客户端 scopes: openid profile email。
  • 令牌 TTL: access 1h, refresh 24h。
  • 回滚:如果 OIDC 失败,fallback 到本地登录。

示例前端集成 (React): 使用 @ory/kratos-client SDK,fetch flow,渲染 nodes 为表单。提交后重定向到 callback。

监控与最佳实践

  • 监控点:Prometheus 指标,追踪登录成功率 (>99%)、MFA 覆盖 (>80%)、流程时延 (<500ms)。
  • 安全阈值:CSRF token 必填,HTTPS 强制,率限 10 req/s/IP。
  • 扩展:Kubernetes Helm chart,水平 pod autoscaling 基于 CPU 70%。
  • 回滚策略:蓝绿部署,测试 MFA/OIDC 兼容。

Kratos 自托管提供灵活、安全的用户管理,适用于微服务。实际部署中,结合业务调整配置,确保合规 (GDPR)。

资料来源:Ory Kratos GitHub (https://github.com/ory/kratos),官方文档 (https://www.ory.sh/docs/kratos/)。

查看归档