在微服务架构中,用户身份管理和认证是核心挑战。传统方案如 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 条/用户,避免滥用。
落地清单:
- 初始化 MFA 流程:GET /self-service/settings/flows?update=true。
- 提交绑定:POST /self-service/settings,包含
method: totp 和 secret。
- 验证:登录后强制 MFA,失败回滚到密码。
- 监控:日志 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/)。