MCP 认证 + 身份栈
给要在 MCP server 里接 OAuth / SAML / SSO 的开发者准备的 9 件套 — 先 secret vault(Infisical / sops),再 OAuth/OIDC 流程助手(OpenAuth、Device Flow checklist),再身份源(Keycloak / Dex),再细粒度 scope(Casbin / OPA),最后审计(mcp-audit)。安装顺序有讲究,取舍说人话。
这个 pack 包含什么
这套是给已经下定决心「我的 MCP server 不能再把 OPENAI_API_KEY 写在 .env.example 里」的工程师准备的。每个都是开源、生产级、对应认证洋葱里的一个特定层。安装顺序要紧 — 底层装错,上面每一层都会骗你。
这套里没有 Auth0 wrapper 或一键 SSO 的 SaaS。目标是端到端把信任边界握在自己手里 —— 因为如果你的 MCP server 帮 agent 把工具调用打到客户数据库,信任边界就是产品。
推荐安装顺序
- Infisical — 给开发者用的 secret vault。替掉
.env,给每个 service 一份带类型的 secret。可自托管,有 CLI 和 SDK。从这里起步,因为后面每个工具都要找个地方放 client secret / signing key / webhook token。别带着明文 secret 直接跳到第 2 步。 - sops — 给提交到 git 的配置加密。Infisical 管运行时,sops 管你确实想入库的 YAML / JSON / env 文件(Helm values、Terraform tfvars、GitHub Actions)。Mozilla 出的事实标准,底层用 KMS / age / PGP。和 Infisical 是搭档不是替代。
- OpenAuth — 可自托管的通用 auth server,SST 团队出品。如果想自己当 OAuth 2.1 + OIDC 发证方又不想接 Auth0/Clerk,这就是替代品。默认配置合理、TypeScript 优先、能跑在 Lambda / Cloudflare / Node 上。如果你 MCP 后端是 JS/TS 且公司没有现成 IdP,选这个。
- OAuth Device Flow — CLI Agent Login Checklist — 不是一个 server,是一份 checklist。CLI agent(Claude Code / Codex / Cursor / 你自己的 MCP 客户端)通过 RFC 8628 device flow 登录。这份 checklist 覆盖 user code、polling interval、token 存储、refresh、和会咬人的边界(verifier 复用 / polling DoS / shell 历史里的 user code)。写流程之前先读,不是写完之后。
- Keycloak — 重量级 IdP,原生支持 SAML / OIDC / LDAP 联邦。如果你客户要把 MCP server 挂到 Okta / Azure AD / Google Workspace 上做 SAML 联邦,选这个。Java 写的,自带 admin UI,15+ 年 CVE 修复积累。占资源(1-2 GB RAM)但稳如老狗。
- Dex — 轻量级 OIDC 身份源,支持可插拔 connector。如果你想要一个小 Go 二进制把 LDAP / GitHub / Google / SAML 联邦成单个 OIDC issuer 然后就完事,选 Dex 不选 Keycloak。Kubernetes 原生、没有 admin UI 要维护。云原生团队默认 Dex,传统企业默认 Keycloak。
- Casbin — 灵活的策略式访问控制。认证(你是谁?)之后是授权(你能做什么?)。Casbin 把 RBAC / ABAC / RESTful matcher 都塞进一个小 config 文件,15+ 语言都有库。定义
(subject, object, action)规则,在每个 MCP tool 入口检查。应用层 scope 的合适尺寸。 - Open Policy Agent (OPA) — 基于 Rego 的云原生统一策略引擎。如果策略要跨多个 service —— admission control / sidecar 执行 / terraform plan 校验 / MCP gateway 中间件 —— 选 OPA 不选 Casbin。比 Casbin 重,但当「谁能调这个 MCP tool」和「谁能部署这个 pod」是同一个问题时,它才是正确答案。
- mcp-audit — 扫 MCP 配置找 secret 和 shadow API。诚实的审计步骤:指向你的 MCP server 配置,它会标出硬编码的 key、没声明的 egress、没加 scope 的 tool。每次改动后在 CI 里跑。你需要这个 pack 恰恰是因为前面 8 层都很容易配错。
它们怎么协同
┌─ Infisical (运行时 secret) ─┐
SECRET │ │── 下面每一层都要用
└─ sops (入库 secret) ────────┘
│
▼
AUTHN OpenAuth / Keycloak / Dex
(你的 MCP server 发 / 验 OIDC token)
│
▼
流程 OAuth Device Flow Checklist
(CLI agent 没浏览器也能登录)
│
▼
AUTHZ Casbin (进程内) / OPA (sidecar)
(每个 MCP tool 调用都过一遍策略)
│
▼
审计 mcp-audit (CI 闸口) + 签名审计日志
(出事时能给客户或监管证明)
最容易被跳过的一层是 scope —— 团队接好了 OAuth,然后把每个 MCP tool 暴露给每个登录用户。这就是认证版的 chmod 777。第一天就选 Casbin 或 OPA,在第一个真业务 tool 上线之前把策略文件写进 repo。
你会遇到的取舍
- Infisical vs HashiCorp Vault — Vault 更强(动态 secret / PKI / transit 加密 / lease)但运维成本高。Infisical 在 DX 上完胜,对 90% 的 MCP server 足够。等需要短期数据库凭据或审计师明确要求时再换 Vault。
- OpenAuth vs Keycloak vs Dex — OpenAuth = 用 TS 廉价自建 IdP。Keycloak = 自带 admin UI 的企业级 IdP。Dex = 套在现有身份源前面的 OIDC 桥。别同时跑两个,token 发证方只能有一个。
- Casbin vs OPA — Casbin 进程内、微秒级延迟、model 文件简单。OPA 跑成 service 或 sidecar,支持复杂 Rego,跟 Kubernetes / Envoy / Terraform 集成好。策略只在你 MCP server 里用 → Casbin;策略要全组织通用 → OPA。
- Device Flow vs PKCE redirect — 没浏览器的 CLI / agent 客户端选 device flow(读 checklist)。桌面或 Web MCP 客户端有浏览器,选 PKCE redirect,简单且更安全。
- mcp-audit 闸口 vs 运行时 — CI 闸口防配置漂移,运行时审计抓行为。最终都要,先把 CI 闸口接上。
常见踩坑
- secret 写在
claude_desktop_config.json或.cursor/mcp.json里 — 这些文件最后会进 dotfile repo / 屏幕共享 / 帖子截图。改成引用 Infisical handle 或 sops 加密文件,不要写原值。 - OAuth client secret 跨环境复用 — MCP server 经常有 dev/staging/prod 三套;泄一个就同时报废三套。第一天就发三套独立 client。
- 拿 OIDC ID token 当 bearer 调上游 API — ID token 是给客户端用的,不是给上游 API 的。要先换成带正确
aud和 scope 的 access token。 - 给每个登录用户都发
mcp:*scope — 定义 tool 级 scope(mcp:tool:read_file、mcp:tool:exec),在中间件里检查。Casbin / OPA 存在就是为了干这个。 - tool 调用没审计日志 — 当客户问「这个 agent 真的删了那条记录吗?」你需要的是签名 + append-only 的日志。mcp-audit 抓配置问题,你 MCP server 自己也要发结构化审计事件。
9 个资产打包就绪
常见问题
Infisical 和 sops 真的都要装?
是的,它们解决不同问题。Infisical 替代运行时的 .env —— 你的服务启动时通过类型化 SDK 或 sidecar 拉 secret,自带轮换和访问日志。sops 加密的是你想入库到 git 的 YAML / JSON / tfvars 文件(Helm values、Terraform variable、GitHub Actions 输入)。Infisical 是活 secret 的真理源,sops 是让声明式配置在 PR 里可 review 又不泄漏字面值的工具。两者搭档而非替代。
OpenAuth、Keycloak、Dex 怎么选?
TypeScript 团队从零自建 IdP、没有遗留身份源 —— 选 OpenAuth。客户要完整企业 IdP(和 Okta/Azure AD 做 SAML 联邦、admin UI、自助账号、开箱 MFA)—— 选 Keycloak。已经有身份源(LDAP / GitHub / Google)只缺一个 OIDC 桥 —— 选 Dex。同时跑两个 = 攻击面翻倍,token 发证方只能有一个。
Casbin vs OPA — OPA 的额外复杂度什么时候值得?
Casbin 适合:策略只活在你一个 MCP server 里,问题是「subject X 是不是 role Y」或「subject X 对资源 R 是否有 Z 权限」。OPA 适合:同一个策略要被多个服务执行(MCP gateway / Kubernetes admission / Terraform plan check / API gateway),需要单一 Rego 规则作为真理源。如果你别处还没跑 OPA,Casbin 起步更快、运维负担为零。
OAuth Device Flow Checklist 到底能帮我省什么?
省的是「第二次 code review 能抓到、第一次直接给你拿 CVE」的那些错误:retry 时不轮换 device code、polling 比服务器 interval 快被限流、把完整 user code 打进 shell 历史、refresh token 存 ~/.config 还 mode 644、logout 时不撤销 refresh token。Checklist 是一页起飞前自查,让资深 reviewer 跳过显眼问题直接看你真实流程。
mcp-audit 跟 Gitleaks 这种通用 secret 扫描器有啥区别?
Gitleaks 扫 git 历史里任何看起来像 credential 的字符串。mcp-audit 专门理解 MCP server 配置 schema —— 它会标出没有 scope 的 MCP tool、声明 network_access: true 却没列上游 host 的 server、不加限制就挂宿主文件系统的配置。不同层:Gitleaks 管 repo,mcp-audit 管 MCP 配置。CI 里两个一起跑,几乎不重叠。