Claude Code 网关与用量
Claude Code 网关与用量
Claude 应用网关配置
13 分钟阅读
Claude 应用网关配置
gateway.yaml 所有选项的参考文档:监听器与 TLS、OIDC、会话、Postgres 存储、Amazon Bedrock、Claude Platform on AWS、Google Cloud Agent Platform 和 Microsoft Foundry 上游、模型路由、托管策略以及遥测。
Claude 应用网关部署由一个 YAML 文件配置,通常命名为 gateway.yaml。网关的所有行为都在这个文件中定义:监听位置、开发者的登录方式、推理请求的去向,以及要应用的策略和遥测配置。本页是该文件中所有选项的参考文档。
要编写第一份配置,请从快速入门开始;其中会构建一份可运行的最小配置并将其启动。配置调整满意后,可参阅部署指南,了解如何将网关容器化,以及如何将其托管在 Kubernetes、Cloud Run 或您自己的平台上。
网关会在启动时通过 claude gateway --config /path/to/gateway.yaml 读取该文件一次。启动期间,每个选项都会依据 schema 进行验证,因此配置格式有误时,网关会在启动阶段报告具体字段的错误,而不会等到首次使用时才失败。
本页末尾的完整示例涵盖了所有配置部分。
文件结构
其中有五个必需部分。其他部分均为可选部分;省略时采用默认值。未知的键会导致启动失败,因此拼写错误会以明确指出键名的错误呈现,而不会被静默忽略。
必需部分:
listen:绑定地址、公开 URL、TLS 终止oidc:身份提供商 (IdP),包括颁发者、客户端、声明映射和登录资格session:网关签发的 bearer Token,包括密钥和有效期store:用于存储设备授权和限流计数器的 PostgreSQLupstreams:推理请求的目的地,可以是 Anthropic、Amazon Bedrock、Claude Platform on AWS、Google Cloud Agent Platform 或 Microsoft Foundry
可选部分:
admin:Admin API 身份验证和消费限额数据保留enforcement:消费限额的故障开放或故障关闭行为models和auto_include_builtin_models:管理员选定的模型列表及各上游对应的 IDmanaged:按 IdP 组划分的托管设置策略telemetry:将 OTLP 数据转发到可观测性技术栈access_control、limits、timeouts、rate_limits:IP 允许/拒绝规则、请求大小上限、上游首字节响应时间,以及按 IP 统计的登录限流
密钥展开
不要将 client_secret、jwt_secret 或 postgres_url 等密钥直接写入 gateway.yaml。请使用以下任一形式引用密钥,网关会在启动时从环境变量或文件中解析其值:
| 形式 | 解析结果 | 适用场景 |
|---|---|---|
${VAR} | 环境变量 VAR;若未定义,启动失败 | 容器环境变量、通过环境变量注入的 AWS Secrets Manager 密钥 |
${file:/path} | 去除首尾空白后的文件内容 | Kubernetes Secret 卷挂载、Vault Agent、SOPS |
必需部分
listen
listen 块控制网关在何处提供服务:绑定地址和端口、外部可见的源,以及可选的 TLS 终止。
| 字段 | 是否必需 | 说明 |
|---|---|---|
host | 否 | 绑定地址。默认为 0.0.0.0。 |
port | 否 | 绑定端口。默认为 8080。 |
public_url | 使用代理时必需 | 外部可见的 https:// 源,用于构造 IdP redirect_uri 和发现元数据。只要网关位于 ALB、Ingress 或 Cloud Run 等终止 TLS 的代理之后,就必须设置此项,因为网关在构造自身源时不信任可能由客户端伪造的 X-Forwarded-* 标头。下文的 trusted_proxies 仅控制客户端 IP 的解析。启用遥测时也必须设置此项,因为网关会根据该 URL 构造推送给客户端的 OTLP 端点。 |
tls.cert / tls.key | 否 | 网关自行终止 TLS 时使用的 PEM 文件路径。 |
trusted_proxies | 否 | 位于网关前方的负载均衡器 CIDR 或 IP。设置后,网关只信任来自这些对等方的 X-Forwarded-For,并记录真实客户端 IP,用于按 IP 限流和审计。等同于 nginx 的 set_real_ip_from。 |
oidc
oidc 块将网关连接到您的身份提供商,并决定哪些用户可以登录。它指定颁发者和 OAuth 客户端,映射承载电子邮件地址和组信息的声明,并可按电子邮件域或组限制登录。
OpenID Connect (OIDC) 是网关与身份提供商配合使用的 SSO 协议。有关需要在 IdP 端注册的内容,请参阅身份提供商设置。
| 字段 | 是否必需 | 说明 |
|---|---|---|
issuer | 是 | OIDC 发现基址,必须在 /.well-known/openid-configuration 提供发现信息。生产环境中应使用 HTTPS;网关也接受 http:// 颁发者。除非在网关环境中设置 CLAUDE_GATEWAY_ALLOW_LOOPBACK=1,否则 http://localhost:8081 之类的回环颁发者会被 SSRF 防护拒绝。 |
client_id / client_secret | 是 | 来自 OAuth 客户端注册的信息。 |
allowed_email_domains | 否 | 如果 id_token 的 email 声明不属于这些域之一,则拒绝该 Token;匹配不区分大小写。这是针对多租户 IdP 配置错误的纵深防御。无论此项如何设置,只要 id_token 的 email_verified 声明确为 false,就始终会被拒绝。 |
allowed_groups | 否 | 仅允许这些 IdP 组的成员登录,匹配依据为 groups_claim。即使用户属于允许的电子邮件域,只要不属于其中任何一个组,也会被拒绝。要求 IdP 发出组声明。 |
groups_claim | 否 | 指定 id_token 中承载组成员资格的声明。默认为 groups。Microsoft Entra 在 roles 下发出应用角色。可接受扁平键,也可接受 RFC 6901 JSON Pointer,例如用于嵌套声明的 /resource_access/gateway/roles。 |
google_groups | 否 | 通过 Google Workspace Admin SDK Directory API 查询已登录用户所属的组,因为 Google 的 id_token 不包含组声明。将 service_account_json_path 设为服务账号密钥文件;该服务账号须针对 https://www.googleapis.com/auth/admin.directory.group.readonly 范围启用全域委派。将 admin_email 设为该服务账号要模拟的 Workspace 管理员,因为 Directory API 要求真实的管理员主体。每位用户所属组的电子邮件地址会成为其组声明,因此 allowed_groups 和 managed.policies.match.groups 都按组电子邮件地址匹配。 |
email_claim | 否 | 指定 id_token 中承载用户电子邮件地址的声明。默认为 email。ADFS 和 Entra B2C 等部分 IdP 会改为发出 upn 或 preferred_username。可接受扁平键、JSON Pointer,或按顺序回退的键列表;使用其中第一个存在的键。 |
scopes | 否 | 完全覆盖网关请求的 OIDC scope。默认为 [openid, profile, email, offline_access]。当 IdP 拒绝其无法识别的 scope,或要求自定义 scope 才会发出组或电子邮件信息时,可设置此项。必须包含 openid。移除 offline_access 会禁用刷新 Token,此后开发者每隔 session.ttl_hours 都要重新在浏览器中登录。有关各 IdP 的 scope 配置方法(例如 Google 的刷新 Token 流程),请参阅身份提供商设置。 |
extra_auth_params | 否 | 原样附加到 IdP 授权请求的额外查询参数。它用于覆盖 IdP 特有的行为,例如 Google 刷新 Token 所需的 access_type: offline、部分 Entra 租户使用的 domain_hint,或升级身份验证流程使用的 acr_values。不能覆盖由网关管理的协议参数:state、nonce、redirect_uri、PKCE、scope、response_type、response_mode 和 client_id。 |
userinfo_fallback | 否 | 当 id_token 缺少电子邮件或组信息时,从 /userinfo 获取。Keycloak 轻量级访问 Token、Okta 组织服务器和 ADFS 最小化 Token 需要使用此项。id_token 仍是权威来源;userinfo 只补全缺失信息。默认为 false。 |
use_pkce | 否 | 在授权请求中发送 PKCE (S256) challenge。默认为 true。仅当 IdP 拒绝为此机密客户端使用 PKCE 时才设为 false。 |
clock_skew_seconds | 否 | 验证 id_token 的时间声明时允许时钟偏差。默认为严格校验的 0。如果主机与 IdP 的时钟偏差导致登录后立即出现“token expired / not yet valid”错误,请增大此值。 |
token_endpoint_auth_method | 否 | 覆盖 Token 端点的身份验证方法。可设为 client_secret_basic 或 client_secret_post。默认自动协商。 |
id_token_signed_response_alg | 否 | 预期的 id_token 签名算法。默认为 RS256。对于使用 ES256、PS256 或 EdDSA 签名的 IdP,请设置此项。 |
additional_authorized_parties | 否 | 除 client_id 外还可接受的额外 azp 值,用于 Keycloak 代理和 Token 交换流程。 |
discovery_url | 否 | 从此 URL 获取发现文档,而不是根据 issuer 推导。适用于位于会重写颁发者主机名的代理之后的 IdP。路径必须包含 /.well-known/。 |
form_action_origins | 否 | /device 页面的 Content-Security-Policy: form-action 指令允许使用的其他源。网关已允许 'self' 和发现到的 authorization_endpoint 源,但 Chrome 会针对整个重定向链强制执行 form-action。如果 IdP 会经由另一个主机重定向,例如联合到 ADFS 的 Azure AD、中心辐射型 Okta 或企业 SSO 拦截器,请列出授权请求可能经过的每个源。 |
ca_cert_pem | 否 | 仅针对 IdP 请求替换系统信任存储的 PEM CA 证书。适用于位于企业 PKI 后方的 Keycloak 或 Dex。 |
session
session 块定义网关在登录后签发的 bearer Token:用于签名的密钥及其有效期。
| 字段 | 是否必需 | 说明 |
|---|---|---|
jwt_secret | 是 | 至少包含 32 字节的熵,例如由 openssl rand -base64 32 生成。用于签署网关的 HS256 bearer Token。可接受单个字符串,也可接受用于轮换的数组:索引 0 处的密钥用于签名,所有条目都可用于验证。轮换时,先在数组开头加入新密钥,等待 ttl_hours,然后移除旧密钥。 |
ttl_hours | 否 | 网关 bearer Token 的有效期。默认为 1。如果 IdP 签发刷新 Token,CLI 会在到期前静默刷新。有效期越短,停用用户生效越快;有效期越长,与 IdP 的往返次数越少。如果 IdP 因不支持 offline_access 而无法签发刷新 Token,就不能静默刷新;可将此值提高到 8 或 12,避免开发者每小时都要返回浏览器登录。 |
store
store 块将网关连接到 PostgreSQL 数据库,用于保存设备授权和限流计数器。
| 字段 | 是否必需 | 说明 |
|---|---|---|
postgres_url | 是 | postgres:// 或 postgresql:// URL。此项必需,因为浏览器回调写入、轮询 CLI 读取的设备授权汇合点需要跨副本状态。网关会在启动时自行执行 schema 迁移,因此相应角色需要目标 schema 的 CREATE TABLE 权限。如果安全策略禁止应用角色执行 DDL,请先用管理员角色运行迁移,并在每次新版本包含迁移时再次运行,然后向应用角色授予网关表的 SELECT, INSERT, UPDATE, DELETE 权限。请参阅升级和 Postgres。 |
username | 否 | 覆盖 postgres_url 中的用户。 |
password | 否 | 数据库凭据。请在此处设置,而不要放入 postgres_url,以免凭据出现在 URL 中。可包含任意字符,且优先于 URL 中的凭据。 |
max_connections | 否 | 每个副本的 Postgres 连接池大小。默认为 5,这一保守值适合共享数据库。启用消费限额后,每个推理请求的关键路径会执行数次数据库操作;专用数据库承受负载时可提高此值,同时应确保“副本数 × 此值”低于数据库的 max_connections。 |
本地开发时,可将 postgres_url 指向一个用完即弃的 Postgres 容器,例如 docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres。
upstreams
upstreams 是一个有序列表。网关会将推理请求转发到第一个能够解析所请求模型的上游。遇到 5xx、429、401、403、404 或超时时,会故障转移到下一个上游;其他 4xx 不会触发故障转移,因为这类错误应归因于请求本身,而不是上游。401 或 403 表示网关自身的凭据未能通过该上游的验证;404 表示该上游不提供所请求的模型,因此列表中后续的上游仍可能处理请求。
在 404 时进行故障转移需要网关 v2.1.198 或更高版本。早期版本即使列表中的后续上游提供该模型,也会把第一个 404 返回给客户端。
同一提供商的多个上游必须分别设置不同的 name:。
Amazon Bedrock、Claude Platform on AWS、Google Cloud Agent Platform 和 Microsoft Foundry 客户端在启动时创建一次,其 SDK 会在内部刷新凭据,因此轮换云凭据无需重启。静态 Anthropic API 密钥和 bearer Token 会在启动时读取;请参阅 Anthropic API。
Anthropic API
最小的 Anthropic 上游配置只需一个来自 Claude Console 的 API 密钥:
两种凭据形式发送的标头不同:
api_key:发送x-api-key。请在 Claude Console 中轮换密钥,并更新环境变量。oauth_token:发送Authorization: Bearer。如果组织签发的是短期 Token,而不是长期 API 密钥,请使用 bearer 形式。bearer 只在启动时读取一次,因此需要重新挂载密钥并重启才能刷新。
除静态密钥或 bearer 外,还可以使用 Workload Identity Federation。按照 Workload Identity Federation 指南创建联合规则,然后将工作负载的 OIDC JWT 以文件形式挂载,例如 Kubernetes 投射的服务账号 Token 或 CI 平台的 id-token。网关会将该 JWT 交换为短期 bearer,并自动刷新。每次交换都会重新读取 Token 文件,因此轮换后的投射 Token 无需重启即可生效。
Amazon Bedrock
有关网关所替代或位于其前方的客户端 Amazon Bedrock 部署,请参阅 Amazon Bedrock 上的 Claude Code。网关侧的上游配置如下:
空的 auth 块会使用 AWS SDK 的默认凭据链:环境变量、~/.aws/credentials、ECS 任务角色、EC2 实例元数据或 EKS 上的 IRSA。在生产环境中,应为网关 Pod 分配 IAM 角色,而不要将静态密钥嵌入容器镜像。
| 设置 | 方法 |
|---|---|
| IAM 权限 | 针对推理配置文件 ARN 和底层基础模型 ARN,向网关主体授予 bedrock:InvokeModel 和 bedrock:InvokeModelWithResponseStream。对于美国区域中的内置目录:arn:aws:bedrock:<region>:<account>:inference-profile/us.anthropic.* 和 arn:aws:bedrock:*::foundation-model/anthropic.*。 |
| 模型访问权限 | 在 Amazon Bedrock 控制台中,按区域申请并启用所需 Claude 模型的访问权限。跨区域推理配置文件 (us.anthropic.*) 要求在其覆盖的每个区域中都具有模型访问权限。 |
| EKS (IRSA) | 创建包含上述策略的 IAM 角色,并为集群的 OIDC 提供商配置一份限定到网关服务账号的信任策略。使用 eks.amazonaws.com/role-arn: arn:aws:iam::<acct>:role/claude-gateway 为服务账号添加注解。auth: {} 会自动使用该角色。 |
| ECS / EC2 | 将 IAM 角色附加到任务定义或实例配置文件。auth: {} 会自动使用该角色。 |
| 其他环境 | 通过 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 和 AWS_SESSION_TOKEN 环境变量传入凭据,或在 auth: 中通过 ${VAR} 展开显式设置。 |
| 区域 | region: 是 API 端点所在的区域。无论选择哪个区域,跨区域推理配置文件都会在相应地理范围(美国、欧洲、亚太)内进行路由。对于美国以外的区域或预置吞吐量 ARN,请添加 models: 块,配置正确的各上游 ID。 |
Claude Platform on AWS
Claude Platform on AWS 在 AWS 基础设施上的 aws-external-anthropic.<region>.api.aws 提供 Anthropic 第一方 API。它使用第一方模型 ID,按原样处理 anthropic-beta 标头,并提供 count_tokens,因此不需要进行任何 Bedrock 特有的转换。anthropicAws 提供商要求 Claude Code v2.1.198 或更高版本;较早的网关版本会在启动时拒绝它。
有关同一平台的客户端部署,请参阅 Claude Platform on AWS 上的 Claude Code。网关侧的上游配置如下:
该平台与 Amazon Bedrock 运行在不同的 AWS 账号中,并使用自己的服务名称 aws-external-anthropic 对 SigV4 请求进行签名,因此仅限 Bedrock 的 IAM 角色无法授权访问它。如果同时设置了 SigV4 凭据,auth.api_key 中的 API 密钥优先。空的 auth 块使用 AWS SDK 的默认凭据链,与 Amazon Bedrock 上游使用的凭据链相同。
| 字段 | 是否必需 | 说明 |
|---|---|---|
region | 是 | AWS 区域,由小写字母、数字和连字符组成。网关据此推导端点:https://aws-external-anthropic.<region>.api.aws。 |
workspace_id | 是 | 作为标头随每个请求发送;平台要求提供此值。 |
auth.api_key | 否 | 平台 API 密钥,以 x-api-key 发送。它不是 bearer Token:两种身份验证模式分别为 API 密钥和 SigV4。 |
auth.aws_access_key_id / auth.aws_secret_access_key | 否 | 显式 SigV4 凭据。只设置其中一项会导致启动失败。还可同时设置 auth.aws_session_token。 |
base_url | 否 | 覆盖推导出的端点。 |
由于平台可解析第一方模型 ID,因此内置目录不需要 models: 块即可路由到该平台。自行指定 models: 列表时,请使用 anthropicAws: 作为条目键,并将第一方 ID 设为其值。
Google Cloud Agent Platform
有关等效的客户端设置,请参阅 Google Cloud 上的 Claude Code。网关侧的上游配置如下:
空的 auth 块使用应用默认凭据:GOOGLE_APPLICATION_CREDENTIALS、GCE 元数据或 GKE Workload Identity。虽然也支持服务账号 JSON 密钥文件,但不建议使用;请优先使用 Workload Identity,或将服务账号附加到 GCE 或 Cloud Run 实例。
将 region: global 设为使用 Google Cloud Agent Platform 的全球端点,而不是区域端点。随后 Google 会将每个请求路由到可用区域,您无需跟踪各区域的模型可用性。指定具体区域则会将每个请求固定到该区域。
| 设置 | 方法 |
|---|---|
| IAM 权限 | 在项目中向网关的服务账号授予 roles/aiplatform.user,或授予包含 aiplatform.endpoints.predict 的自定义角色。启用 Google Cloud Agent Platform API (aiplatform.googleapis.com)。 |
| 模型访问权限 | 在 Model Garden 中为项目启用 Claude 模型。这些模型会发布到特定区域;请查看模型卡了解支持的区域。 |
| GKE (Workload Identity) | 将 GCP 服务账号绑定到网关的 Kubernetes 服务账号,并使用 iam.gke.io/gcp-service-account: claude-gateway@<proj>.iam.gserviceaccount.com 为 KSA 添加注解。auth: {} 会自动使用该身份。 |
| Cloud Run / GCE | 将服务的服务账号设为具有 roles/aiplatform.user 的账号。auth: {} 会自动使用该身份。 |
| 其他环境 | 使用 auth: { service_account_json: /secrets/sa.json },其中路径指向以密钥形式挂载的 JSON 密钥文件。该字段接收文件路径而非密钥内容,因此不涉及 ${file:…} 展开。 |
Microsoft Foundry
有关客户端 Microsoft Foundry 部署,请参阅 Microsoft Foundry 上的 Claude Code。网关侧的上游配置如下:
use_azure_ad: true 通过 DefaultAzureCredential 解析凭据:AKS、ACI 或 App Service 上的 Managed Identity、Azure CLI,或环境凭据。API 密钥也可用,但作用于整个项目,且不会自动轮换。Microsoft Foundry 的端点根据 resource: 推导;对于 Azure Government 等主权云,可设置可选的 base_url 来覆盖该端点。
| 设置 | 方法 |
|---|---|
| RBAC | 在 Microsoft Foundry 资源上,向网关身份授予 Azure AI User 或 Cognitive Services User。 |
| 部署 | Microsoft Foundry 使用由管理员选择的部署名称,而不是规范模型 ID。添加 models: 块,将每个规范 ID 映射到相应部署名称。 |
| AKS(工作负载身份) | 将用户分配的 Managed Identity 与集群的 OIDC 颁发者联合,并绑定到网关的服务账号。use_azure_ad: true 会通过 WorkloadIdentityCredential 自动使用该身份。 |
| ACI / App Service | 在资源上启用系统分配或用户分配的 Managed Identity。use_azure_ad: true 会自动使用它。 |
| 其他环境 | auth: { api_key: "${FOUNDRY_API_KEY}" }。在 { } 内使用 ${…} 时要加引号。 |
多个上游
同一提供商可以出现多次,但各项必须使用不同的 name:。这适用于不同区域、通过不同凭据链访问的不同账号、预置吞吐量与按需容量,以及跨提供商回退等场景。
网关按顺序尝试上游。5xx、429、401、403、404、超时和缺少端点 (501) 会触发故障转移;其他 4xx 不会。
429 表示单个上游的容量问题,因此预置吞吐量 (PT) 耗尽时会故障转移到按需容量。404 表示单个上游的模型可用性问题,因此尚未启用某个模型的上游不会阻止后续可提供该模型的上游。无法解析所请求模型的上游会被跳过,不会发生网络往返。
以下示例首先将请求路由到 Amazon Bedrock 预置吞吐量配额;容量溢出后,依次转移到按需容量和另一个账号,最后回退到 Anthropic API:
| 调整方式 | 方法 |
|---|---|
| 不同区域 | 每个区域配置一个 Amazon Bedrock 上游,各自使用对应的 region:。启用 auto_include_builtin_models: true 后,跨区域推理配置文件会自动路由;对于固定到特定区域的部署,请使用 models: 块。 |
| 不同账号 | 每个账号配置一个 Amazon Bedrock 上游,各自在 auth: 中使用自己的凭据。默认凭据链 (auth: {}) 使用 Pod 的身份;如需访问第二个账号,请设置显式凭据或 bearer Token。 |
| 预置吞吐量 | 在 models: 中,以该上游的名称将模型映射到预置吞吐量 ARN。其他上游继续使用按需 ID,因此会在 PT 容量耗尽后再进行故障转移。 |
| VPC / FIPS 端点 | 将上游的 base_url: 设为 VPC 端点或 FIPS 端点 URL。 |
| 限定模型的路由 | 从模型的 upstream_model: 映射中省略某个上游,即可针对该模型跳过该上游。例如,将 Opus 路由到预置吞吐量,而将 Sonnet 和 Haiku 路由到按需容量。 |
在不同云提供商之间进行故障转移,或回退到直接使用 Anthropic API,会改变请求适用的协议、地理区域及其他条款。
无论处理某个请求的是哪个上游,CLI 都会对网关应用相同的功能门控,因此故障转移不会向上游发送其无法接受的请求正文字段。
可选部分
admin
可选。启用 /v1/organizations/spend_limits(与 Anthropic 的公共 Admin API 对应)以及 /v1/messages 上按开发者执行的消费限额。有关限额的设置和执行方式,请参阅消费限额;本节介绍用于启用和调整该功能的 gateway.yaml 键。
| 字段 | 是否必需 | 说明 |
|---|---|---|
write_keys | 否 | {id, key} 数组。与其中任一项匹配的 x-api-key 可以列出、设置和删除消费限额。密钥值至少要有 32 个字符;id 在 read_keys 和 write_keys 中必须全局唯一。 |
read_keys | 否 | {id, key} 数组。只读:可访问所有 GET 端点,包括列出限额、按 ID 获取单项,以及读取 /effective 和 /audit。 |
admin_groups | 否 | IdP 组名称。如果网关 JWT 的 groups 声明包含其中任一组,该 JWT 即拥有完整的读写管理权限,审计身份记录为 oidc:<sub>。此方式适合人工管理员;机器应使用 API 密钥。 |
blocked_message | 否 | 原样附加到被阻止开发者看到的 429 billing_error。请写明完整指引,例如 URL 或 Slack 频道。未设置时,错误为 spend limit reached。 |
audit_retention_days | 否 | 默认为 365。超过期限的 admin_audit 行会被清理。 |
spend_retention_months | 否 | 默认为 13。超过该期限的 spend 计数器行会被清理。默认值会保留一个完整年度及当前不完整月份的数据,供同比报告使用。 |
identity_retention_days | 否 | 默认为 90。principal_emails 行的最近出现 TTL;这些行保存每位开发者的电子邮件、显示名称和组信息(个人身份信息)。此值有意短于消费数据的保留期,使已停用的身份可随时间清除,同时保留其匿名消费计数器。 |
group_limit_mode | 否 | min(默认)或 max。如果开发者所属的多个组均设有限额,min 执行最严格的限额,max 执行最宽松的限额。限额执行和 /effective 均使用此设置。 |
enforcement
enforcement 块控制存储不可用时消费限额检查的行为。
| 字段 | 是否必需 | 说明 |
|---|---|---|
fail_closed_on_error | 否 | 默认为 false。Postgres 中断时,消费限额执行采用故障开放策略,以保持推理服务可用。设为 true 可改为故障关闭:超出限额的开发者会被阻止,但存储不可达时其他所有人也会被阻止。没有 admin: 块时,此设置不起作用。 |
models
models 块是可选的管理员精选模型列表,由 /v1/models 提供,并用于转换各上游的模型 ID。对于美国以外的 Amazon Bedrock 区域、Amazon Bedrock 预置吞吐量 ARN 和 Microsoft Foundry 部署名称,此块为必需。
managed
managed 块定义基于角色的访问策略,以 IdP 组或电子邮件域为匹配条件。策略按顺序求值:先选择第一个匹配项,再将其合并到下文所述的 match: {} 全匹配基础策略之上。系统通过 GET /managed/settings 按用户提供策略,并使用 ETag/304 缓存。
通常列在最后的 match: {} 全匹配策略会被视为基础层。其他每项策略都会从全匹配策略继承自身未设置的键,因此按角色配置的条目只需列出与组织默认值不同的部分。合并规则取决于键的类型:
- 允许列表:
availableModels和permissions.allow。具体策略的列表会完全替换基础列表。 - 拒绝列表和 Hook 数组:
permissions.deny、permissions.ask、disabledMcpjsonServers、deniedMcpServers、blockedMarketplaces,以及hooks各事件类型的数组。这些值取基础策略与具体策略的并集,因此组织级拒绝规则或审计 Hook 不会被按角色的覆盖意外移除。 - 记录类型的键:
env、modelOverrides和skillOverrides。这些键进行浅合并,因此按角色配置的env块会覆盖自身设置的键,同时继承基础策略中的其余键。
availableModels 还会在服务器端的 /v1/messages 强制执行,因此无论客户端发送什么内容,被拒绝的模型都会返回 400。
| 匹配器 | 行为 |
|---|---|
match: {} | 匹配每个已通过身份验证的用户。可以先设置这样一项,之后再在其上方添加限定组范围的策略。 |
match: { groups: [a, b] } | 如果 JWT 的 groups 声明包含所列任一组,则匹配。区分大小写:组名必须与 IdP 中的大小写完全一致。 |
match: { email_domain: example.com } | 对 JWT 的 email 声明中最后一个 @ 后面的部分进行匹配,不区分大小写。每项策略接受一个域。 |
match: { groups: [a], email_domain: example.com } | 两个条件都必须匹配。 |
已通过身份验证但未匹配任何策略的用户会获得网关默认配置,即可使用目录中的所有模型,且没有托管设置。如果要保证始终存在默认策略,请在最后添加 match: {} 全匹配项。
网关不维护自己的用户目录。它依据用户的 IdP Token 对每个请求进行授权:从 Token 的 groups 声明读取组成员资格,并据此评估策略。网关没有可供枚举的用户花名册,也不需要预先创建账号,因此没有 SCIM 端点,因为不存在需要通过 SCIM 同步到网关的数据。
请在权威数据源中管理用户和组的生命周期,即使用 IdP 原生的 SCIM 配置或专用的身份治理平台。由这些系统管理的成员资格和用户停用会通过 Token 自动传递到网关。如果要使用 SCIM 配置 Claude 账号本身,这是 Claude for Enterprise 的一项功能。
需要考虑两个传播周期:
- 策略内容:编辑策略并重新部署后,已连接的客户端会在下次轮询托管设置时收到更新,最长不超过一小时
- 组成员资格:更改用户的组成员资格会改变与其匹配的策略。这会在下次重新签发会话时生效,即下次静默刷新时,最长由
session.ttl_hours决定。
cli 中可以包含的内容
每个 cli 值都是一份完整的 Claude Code managed-settings.json 文档,其 schema 与通过 MDM 或 /etc/claude-code/managed-settings.json 部署的文档相同,只是在此处以 YAML 表示。CLI 会在托管层级应用下发的文档,其优先级高于用户和项目设置。
网关启动时会依据 CLI 的设置 schema 验证每份文档。如果存在无法识别的顶层键,或已识别键的值格式错误,启动就会失败,并在错误中列出所有有问题的键。schema 中有意保持开放的部分仍接受任意值,因为较新的客户端可能会识别网关 schema 尚不了解的条目。这些开放键包括 env、pluginConfigs,以及 permissions 下嵌套的键。
由于验证使用网关安装版本所附带的 schema,如果要在托管配置中加入较新 Claude Code 版本引入的顶层设置键,必须先升级网关。全面推广新策略前,请先在一台客户端上进行冒烟测试。
完整的键参考请参阅 Claude Code 设置。运维人员最常用的键如下:
| 键 | 执行方 | 效果 |
|---|---|---|
availableModels | 网关 + CLI | 模型允许列表。还会在 /v1/messages 进行检查,因此经过修改的客户端也无法绕过。 |
permissions.allow / .deny | CLI | 工具和命令规则。请参阅权限。 |
permissions.disableBypassPermissionsMode | CLI | 设为 disable 可禁用 bypassPermissions(自动批准每次工具调用的模式)及 --dangerously-skip-permissions 标志。 |
allowManagedPermissionRulesOnly | CLI | 设为 true 时,忽略用户和项目权限规则,只应用本文档中的规则。 |
env | CLI | 合并到 CLI 进程中的环境变量。可用于遥测、自动更新和模型名称覆盖。 |
hooks | CLI | 组织级 Hook。 |
由于这些设置经由网络传送,CLI 会在首次应用任何能够执行 shell 命令或改变流量目的地的设置前,向每位开发者显示一次安全审批对话框。该对话框涵盖:
hooks- 不在 CLI 内置安全列表中的
env变量 apiKeyHelper和statusLine等执行 shell 的设置- 托管的 CLAUDE.md 内容
以下安全列表决定哪些 env 变量无需批准即可应用:
- 在安全列表中:自动更新变量和模型名称变量
- 不在安全列表中:代理变量、基础 URL 变量和
OTEL_EXPORTER_OTLP_ENDPOINT
网关的遥测配置会推送 OTEL_EXPORTER_OTLP_ENDPOINT,因此设置 telemetry.forward_to 会在每个交互式客户端上触发该对话框。使用 -p 标志的非交互式运行会跳过对话框,并直接应用设置。该对话框旨在保护开发者的计算机免受已遭入侵或恶意网关的影响,而不是保护组织免受开发者影响,因此允许 -p 跳过是有意设计,并非漏洞。
如果开发者拒绝,Claude Code 会直接退出,而不会应用策略。因此,如果向覆盖范围广的策略推送新的 Hook 或非安全环境变量,每个匹配该策略的开发者都会在下次启动时看到审批提示。
早期版本将 cli 键命名为 settings。该拼写仍可作为别名使用,但新部署应使用 cli。
与其他托管来源之间的优先级
如果设备上还存在本地 managed-settings.json 或通过 MDM 下发的策略,各托管来源不会合并。优先级最高的来源提供全部策略设置,优先级从高到低如下:
- 策略辅助程序
- 网关下发的设置
- MDM;在 Windows 上通过 HKLM 注册表,在 macOS 上通过 plist
managed-settings.json文件- HKCU 注册表(仅限 Windows)
嵌入式宿主可以通过 SDK 的 managedSettings 选项提供策略。默认情况下该策略会被忽略;仅当某个托管来源通过 parentSettingsBehavior: "merge" 选择加入时才会应用,并且会经过筛选,只能收紧策略,不能放宽策略。
唯一的例外是以下键:只要用户可写的 HKCU 层级之上的任一管理员来源设置了这些键,无论其余策略来自何处,它们都会生效:
sandbox.network.allowManagedDomainsOnly和sandbox.filesystem.allowManagedReadPathsOnly:锁定后,会合并各来源中相应允许列表的并集allowAllClaudeAiMcps:仅允许型的 claude.ai MCP 服务器允许列表覆盖sandbox.bwrapPath和sandbox.socatPath:沙箱辅助二进制文件的文件系统路径forceRemoteSettingsRefresh:在远程托管设置获取到最新版本前阻止启动。因此,即使不含此键的缓存远程负载是最高优先级来源,由 MDM 或文件策略设置的该键仍会生效
其他所有键(包括 allowManagedPermissionRulesOnly 和 disableBypassPermissionsMode)都只取自最高优先级来源。有关设置页中的同一规则,请参阅设置优先级。
网关策略适用于计算机上的每次 Claude Code 调用,包括非交互式 claude -p 运行和 Agent SDK 启动的会话。如果启动时网关不可达,已登录的会话会报错退出,而不会在缺少策略的情况下运行。
telemetry
CLI 会通过 HTTP 发送 OpenTelemetry Protocol (OTLP) 指标、日志,以及启用后的跟踪数据;网关会将这些数据原样转发到各个已配置的目的地。有关 CLI 发出的指标和事件,请参阅监控用量。
CLI 会在每次导出中附加已通过身份验证的用户身份,该身份从网关签发的 JWT 中读取,包括 user.id、user.email 和 user.groups 属性。因此,无需开发者侧配置即可按开发者归属成本和用量。
CLI 默认关闭遥测。同时配置 telemetry.forward_to 和 listen.public_url 会将其开启。网关会通过 /managed/settings 向每个已连接的客户端推送五个环境变量:
CLAUDE_CODE_ENABLE_TELEMETRY=1OTEL_METRICS_EXPORTER=otlpOTEL_LOGS_EXPORTER=otlpOTEL_TRACES_EXPORTER=otlpOTEL_EXPORTER_OTLP_ENDPOINT=<public_url>
推送的端点根据公开 URL 构造,因此开发者或策略无需为指标和日志提供任何 OTEL 配置。推送的配置在托管层级应用,会覆盖开发者在本地设置的 OTEL_* 变量。
跟踪数据还要求每个客户端设置 CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1。网关不会推送该变量,因此请通过托管策略的 env 块设置。该变量不在 CLI 安全列表中,因此通过策略下发时,也会触发推送 OTLP 端点时已会触发的同一个安全审批对话框。
网关会中继 protobuf 和 JSON 两种 OTLP 编码,任何兼容 OpenTelemetry 的后端均可作为目的地。
HTTP 调优
四个可选顶层块 access_control、limits、timeouts 和 rate_limits 用于调整 HTTP 接口。默认值适合大多数部署。
| 块 | 键 | 默认值 | 说明 |
|---|---|---|---|
access_control | allow_cidrs / deny_cidrs | 空 | 根据客户端地址对入站 IP 执行允许/拒绝规则,地址为经过 trusted_proxies 解析后的结果。先检查 deny_cidrs;即使客户端同时匹配 allow_cidrs,只要匹配拒绝规则就会被拒绝。如果 allow_cidrs 非空,网关默认拒绝未匹配的请求。/healthz 和 /readyz 不受 allow_cidrs 限制。 |
limits | max_request_bytes | 32 MiB | 入站请求正文的最大大小;超出限制的请求会在正文进入缓冲区前收到 413。处理大型文件或图像请求时可提高此值。 |
limits | max_request_header_bytes | 未设置 | 设置后,标头过大的请求返回 431。 |
limits | max_url_length | 未设置 | 设置后,URL 过长的请求返回 414。 |
timeouts | upstream_ttfb_ms | 120000 | 等待上游响应标头的最长时间(首字节时间)。随后响应正文以流式方式传输,不受总时钟时长上限限制。此项适用于直接连接 Anthropic 的上游路径;其他每个提供商均受其 SDK 自身的超时限制。 |
rate_limits | device_authorization.max / .window_seconds | 30 / 600 | 未经身份验证的设备授权端点按 IP 执行的限流。大型组织共用出口 IP 或 NAT 时可提高此值。这些限制仅适用于设备授权登录流程,不适用于 /v1/messages 推理。请参阅防止暴力破解用户代码。 |
rate_limits | device_verify.max / .window_seconds | 10 / 600 | 对 /device 上提交的 user_code 按 IP 执行限流。 |
完整示例
以下完整参考配置涵盖所有核心部分;HTTP 调优块保持默认值。复制该配置,删除不需要的部分,然后填入您自己的值。快速入门中的配置是此示例的最小版本。
客户端托管设置
以上内容用于配置网关服务器。开发者计算机如何连接网关则需要在每台设备上单独配置,具体通过 Claude Code 的托管设置完成。网关无法自行推送这些键,因为正是这些键告诉客户端网关位于何处。
对于 CLI,请在各操作系统的 managed-settings.json 中设置以下两个键:
将该文件部署到每台设备,通常可通过 MDM 平台完成。不同平台使用不同的文件路径:
| 平台 | 路径 |
|---|---|
| macOS | /Library/Application Support/ClaudeCode/managed-settings.json,或 com.anthropic.claudecode 托管偏好设置域 |
| Linux 和 WSL | /etc/claude-code/managed-settings.json |
| Windows | C:\Program Files\ClaudeCode\managed-settings.json,或通过 HKLM 注册表使用组策略 |
forceLoginGatewayUrl 和 forceLoginMethod 的 "gateway" 值仅在管理员控制的托管层级中生效。开发者在自己的 ~/.claude/settings.json 中设置这些值不起作用。
相关内容
- Claude 应用网关概览:快速入门和开发者连接
- 部署指南:IdP 设置、容器镜像、Kubernetes 和 Cloud Run,以及运维
- 消费限额:按开发者设置的限额和 Admin API
桂公网安备45010502001169号