为 CMEK 配置 Azure Key Vault
使用 Azure Key Vault 为您的组织提供加密密钥。
claude "/claude-api help me configure a customer-managed encryption key with Azure Key Vault"本指南将逐步介绍如何将 Azure Key Vault 密钥配置为您的 Anthropic 组织的 customer-managed encryption key(客户管理的加密密钥),即 CMEK。
前提条件
- 一个已启用 RBAC 授权(
enableRbacAuthorization: true)且允许公共网络访问的 Azure Key Vault。Anthropic 通过公共数据平面端点调用您的保管库;不支持专用端点。 - 保管库上已启用清除保护(
enablePurgeProtection: true)。如果没有启用,已删除的密钥可能会在软删除保留期内被永久清除,从而导致受 CMEK 保护的数据不可逆地丢失。清除保护一旦启用便无法禁用。 - 在保管库中创建密钥以及在其上分配 RBAC 角色的权限。
- 在您的 Entra 租户中创建服务主体的权限(
Application Administrator、Cloud Application Administrator或等效的自定义角色)。 - 您组织的 Anthropic Admin API 密钥。
- 已安装并完成身份验证的
azCLI。 - 在保管库上配置了诊断设置,将
AuditEvent日志类别路由到 Log Analytics、存储帐户或事件中心。Azure Key Vault 默认不会发出数据平面审计日志(例如KeyWrap、KeyUnwrap和KeyGet),因此如果不进行此配置,您将无法获得 Anthropic 密钥操作的审计记录。
Anthropic 应用信息
要让 Anthropic 使用您的加密密钥,您必须配置 Anthropic 多租户应用程序 ID 和显示名称。这些值为:
| 字段 | 值 |
|---|---|
| 多租户应用客户端 ID(美国) | 8635ae1a-3e5d-44e8-a4ed-e0f614466f87 |
| 应用显示名称 | anthropic-cmek-client-us |
加密密钥设置
同意 Anthropic 多租户应用程序
此操作会在您的 Entra 租户中为 Anthropic 的 CMEK 客户端应用程序创建一个服务主体。该应用程序不请求任何 Microsoft Graph 权限;它仅作为 Key Vault 数据平面访问的联合目标而存在。
az ad sp create --id 8635ae1a-3e5d-44e8-a4ed-e0f614466f87从输出中获取
id字段。这是该服务主体在您租户中的对象 ID,您在分配 RBAC 角色时会用到它。{ "appId": "8635ae1a-3e5d-44e8-a4ed-e0f614466f87", "displayName": "anthropic-cmek-client-us", "id": "<sp-object-id>" }如果该服务主体已存在于您的租户中(来自之前的尝试或其他集成),
az ad sp create会以"already exists"错误退出。请改为获取其对象 ID:az ad sp show --id 8635ae1a-3e5d-44e8-a4ed-e0f614466f87 --query id -o tsv此步骤没有对应的 Portal 操作。如果您本地未安装 Azure CLI,请从 Portal 顶部导航栏打开 Cloud Shell。命令成功执行后,您可以在 Microsoft Entra ID > Enterprise applications 中清除默认的应用程序类型筛选器并搜索
anthropic-cmek-client-us,以找到该服务主体的对象 ID。
在其 Entra 企业应用程序概览页面上查找服务主体的 Object ID(对象 ID)。 在您的保管库中创建 RSA 密钥
Azure Key Vault 不支持对称密钥包装,因此密钥必须是 RSA(3072 位或更大),且其允许的操作中包含
wrapKey和unwrapKey。az keyvault key create \ --vault-name <your-vault-name> \ --name <your-key-name> \ --kty RSA --size 3072 \ --ops wrapKey unwrapKey对于 HSM 支持的密钥,请使用
--kty RSA-HSM(需要 Premium SKU 保管库)。软件保护的 RSA 密钥对于此集成是可接受的。在 Portal 中,打开您的 Key Vault,选择 Keys,然后选择 Generate/Import。将密钥类型设置为 RSA,大小设置为 3072 或更大。要将密钥限制为仅可执行包装和解包操作,请打开密钥版本,滚动到 Permitted operations,并取消勾选除 Wrap Key 和 Unwrap Key 之外的所有选项。

创建大小为 3072 或更大的 RSA 密钥。 
将 Permitted operations(允许的操作)限制为 Wrap Key(包装密钥)和 Unwrap Key(解包密钥)。 授予 Anthropic 服务主体访问您密钥的权限
将
Key Vault Crypto User角色分配给第一步中的服务主体,作用域限定为单个密钥而非整个保管库。VAULT_ID=$(az keyvault show --name <your-vault-name> --query id -o tsv) az role assignment create \ --role "Key Vault Crypto User" \ --assignee-object-id <sp-object-id> \ --assignee-principal-type ServicePrincipal \ --scope "${VAULT_ID}/keys/<your-key-name>"内置的
Key Vault Crypto User角色在其分配的作用域上授予密钥加密操作(加密、解密、包装、解包、签名、验证)以及密钥读取权限。您在上一步中对密钥设置的--ops wrapKey unwrapKey限制进一步缩小了这些操作中哪些可以针对此密钥成功执行,因此实际上 Anthropic 只能执行包装和解包操作。在 Portal 中,打开密钥(而非保管库),选择其 Access control (IAM) 选项卡,点击 Add > Add role assignment,选择 Key Vault Crypto User,并将其分配给
anthropic-cmek-client-us服务主体。
将 Key Vault Crypto User 分配给 Anthropic 服务主体,作用域限定为该密钥。 验证您的保管库配置
az keyvault show --name <your-vault-name> \ --query "{rbac:properties.enableRbacAuthorization, purge:properties.enablePurgeProtection, pub:properties.publicNetworkAccess, net:properties.networkAcls.defaultAction, ipRules:properties.networkAcls.ipRules, uri:properties.vaultUri, tenantId:properties.tenantId}"确认以下内容:
rbac为true。purge为true。如果为false或null,请在继续之前在保管库上启用清除保护。如果没有启用,软删除的密钥可能会在保留期内被永久清除,导致受 CMEK 保护的数据无法恢复。pub为"Enabled"。如果为"Disabled",Anthropic 将无法通过公共数据平面端点访问保管库,验证会失败。net为"Allow";或者,如果为"Deny",则ipRules中包含 Anthropic 的出口地址范围(请联系 Anthropic 获取当前列表)。uri是您注册密钥时使用的保管库 URI。tenantId是管理该保管库的租户。注册密钥时请将此值用作tenant_id,而不是您当前活动订阅的租户(在跨租户设置中两者可能不同)。
向 Anthropic 注册密钥
注册密钥的方式取决于您使用的产品。
向 Anthropic 注册密钥
通过 Admin API 创建外部密钥配置。
client = anthropic.Anthropic() external_key = client.beta.organization.external_keys.create( display_name="<friendly-name>", geo="us", provider_config={ "type": "azure", "vault_uri": "https://<your-vault-name>.vault.azure.net/", "key_name": "<your-key-name>", "tenant_id": "<your-tenant-id>", }, ) print(f"id: {external_key.id}") print(f"display_name: {external_key.display_name}")响应中包含外部密钥 ID:
{ "type": "external_key", "id": "ekey_<id>", "display_name": "<friendly-name>" }验证密钥
针对您的密钥触发一次加密和解密往返操作。这可以确认 Anthropic 能够向您的租户进行身份验证并执行包装和解包操作。
client = anthropic.Anthropic() validation = client.beta.organization.external_keys.validate("ekey_<id>") print(f"status: {validation.status}") print(f"error: {validation.error}")成功的响应如下所示:
{ "type": "external_key_validation", "status": "success", "error": null }如果验证失败,
error字段会描述问题所在。常见原因包括:- RBAC 传播延迟: 角色分配可能需要几分钟才能生效。请稍候并重试。
- 网络 ACL 阻止了 Anthropic: 按照验证步骤中的说明确认公共网络访问和
ipRules。 - 针对工作负载标识的条件访问策略: 如果您的租户有针对服务主体的条件访问策略,请排除 Anthropic 服务主体,或将 Anthropic 的出口地址范围添加到该策略的命名位置中。
将密钥附加到工作区
密钥验证通过后,请在向新工作区发送任何请求之前将其附加到该工作区。对于已经在接收请求的工作区,密钥可能需要最多一天才能生效。
client = anthropic.Anthropic() workspace = client.beta.organization.workspaces.update( "<workspace-id>", external_key_id="ekey_<id>" ) print(f"id: {workspace.id}") print(f"external_key_id: {workspace.external_key_id}")
Terraform
对于基础设施即代码部署,相同的步骤可映射到 azurerm 和 azuread 提供程序。
Was this page helpful?