Claude Platform Docs
管理加密密钥

为 CMEK 配置 Azure Key Vault

使用 Azure Key Vault 为您的组织提供加密密钥。

Configure with the /claude-api skill in Claude Code
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 AdministratorCloud Application Administrator 或等效的自定义角色)。
  • 您组织的 Anthropic Admin API 密钥。
  • 已安装并完成身份验证的 az CLI
  • 在保管库上配置了诊断设置,将 AuditEvent 日志类别路由到 Log Analytics、存储帐户或事件中心。Azure Key Vault 默认不会发出数据平面审计日志(例如 KeyWrapKeyUnwrapKeyGet),因此如果不进行此配置,您将无法获得 Anthropic 密钥操作的审计记录。

Anthropic 应用信息

要让 Anthropic 使用您的加密密钥,您必须配置 Anthropic 多租户应用程序 ID 和显示名称。这些值为:

字段
多租户应用客户端 ID(美国)8635ae1a-3e5d-44e8-a4ed-e0f614466f87
应用显示名称anthropic-cmek-client-us

加密密钥设置

  1. 同意 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。

    anthropic-cmek-client-us 的 Microsoft Entra 企业应用程序概览,显示其 Application ID 和 Object ID。
    在其 Entra 企业应用程序概览页面上查找服务主体的 Object ID(对象 ID)。
  2. 在您的保管库中创建 RSA 密钥

    Azure Key Vault 不支持对称密钥包装,因此密钥必须是 RSA(3072 位或更大),且其允许的操作中包含 wrapKeyunwrapKey

    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 KeyUnwrap Key 之外的所有选项。

    Azure Key Vault 创建密钥页面,已选择 Generate 选项、RSA 密钥类型和 3072 RSA 密钥大小。
    创建大小为 3072 或更大的 RSA 密钥。
    Azure Key Vault 密钥版本,其 Permitted operations 仅限于 Wrap Key 和 Unwrap Key。
    将 Permitted operations(允许的操作)限制为 Wrap Key(包装密钥)和 Unwrap Key(解包密钥)。
  3. 授予 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 IAM 角色分配,显示 anthropic-cmek-client-us 已被分配 Key Vault Crypto User 角色。
    将 Key Vault Crypto User 分配给 Anthropic 服务主体,作用域限定为该密钥。
  4. 验证您的保管库配置

    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}"

    确认以下内容:

    • rbactrue
    • purgetrue。如果为 falsenull,请在继续之前在保管库上启用清除保护。如果没有启用,软删除的密钥可能会在保留期内被永久清除,导致受 CMEK 保护的数据无法恢复。
    • pub"Enabled"。如果为 "Disabled",Anthropic 将无法通过公共数据平面端点访问保管库,验证会失败。
    • net"Allow";或者,如果为 "Deny",则 ipRules 中包含 Anthropic 的出口地址范围(请联系 Anthropic 获取当前列表)。
    • uri 是您注册密钥时使用的保管库 URI。
    • tenantId 是管理该保管库的租户。注册密钥时请将此值用作 tenant_id,而不是您当前活动订阅的租户(在跨租户设置中两者可能不同)。

向 Anthropic 注册密钥

注册密钥的方式取决于您使用的产品。

  1. 向 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>"
    }
  2. 验证密钥

    针对您的密钥触发一次加密和解密往返操作。这可以确认 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 的出口地址范围添加到该策略的命名位置中。
  3. 将密钥附加到工作区

    密钥验证通过后,请在向新工作区发送任何请求之前将其附加到该工作区。对于已经在接收请求的工作区,密钥可能需要最多一天才能生效

    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

对于基础设施即代码部署,相同的步骤可映射到 azurermazuread 提供程序。

Was this page helpful?