---
title: Настройка Azure Key Vault для CMEK
url: https://platform.claude.com/docs/ru/manage-claude/cmek-azure-key-vault
description: Используйте Azure Key Vault для предоставления ключа шифрования для вашей организации.
---

Позвольте Claude Code настроить эту функцию за вас

```text
/claude-api помоги мне настроить ключ шифрования, управляемый клиентом, с помощью Azure Key Vault
```

Это руководство описывает настройку ключа Azure Key Vault в качестве [ключа шифрования, управляемого клиентом (customer-managed encryption key, CMEK)](https://platform.claude.com/docs/ru/manage-claude/cmek) для вашей организации Anthropic.

<Warning>
  Включение CMEK необратимо. Если ваш ключ Key Vault удалён или отключён, Anthropic не сможет восстановить данные, зашифрованные с его помощью. Ознакомьтесь с [предупреждениями и ограничениями](https://platform.claude.com/docs/ru/manage-claude/cmek) перед началом.
</Warning>

## Предварительные требования

* Azure Key Vault с **включённой авторизацией RBAC** (`enableRbacAuthorization: true`) и **разрешённым публичным сетевым доступом**. Anthropic обращается к вашему хранилищу через публичную конечную точку плоскости данных; частные конечные точки не поддерживаются.
* **Включённая защита от очистки** (`enablePurgeProtection: true`) в хранилище. Без неё удалённый ключ может быть безвозвратно очищен в течение периода хранения при мягком удалении, что приведёт к необратимой потере ваших данных, защищённых CMEK. Защиту от очистки нельзя отключить после включения.
* Разрешения на создание ключей в хранилище и на назначение ролей RBAC для него.
* Разрешения на создание субъектов-служб в вашем тенанте Entra (`Application Administrator`, `Cloud Application Administrator` или эквивалентная пользовательская роль).
* Ключ Admin API Anthropic для вашей организации.
* Установленный и аутентифицированный [`az` CLI](https://learn.microsoft.com/en-us/cli/azure/?view=azure-cli-latest).
* **Диагностические настройки** (Diagnostic Settings), настроенные в хранилище для маршрутизации категории журналов `AuditEvent` в Log Analytics, учётную запись хранилища или концентратор событий. Azure Key Vault по умолчанию не выдаёт журналы аудита плоскости данных (такие как `KeyWrap`, `KeyUnwrap` и `KeyGet`), поэтому без этого у вас не будет журнала аудита для операций Anthropic с ключами.

## Информация о приложении Anthropic

Чтобы Anthropic использовал ваш ключ шифрования, вы должны настроить идентификатор мультитенантного приложения Anthropic и отображаемое имя. Эти значения:

| Поле                                                   | Значение                               |
| ------------------------------------------------------ | -------------------------------------- |
| Идентификатор клиента мультитенантного приложения (US) | `8635ae1a-3e5d-44e8-a4ed-e0f614466f87` |
| Отображаемое имя приложения                            | `anthropic-cmek-client-us`             |

<Warning>
  Используйте только этот опубликованный идентификатор клиента и отображаемое имя. Никогда не доверяйте идентификатору, предоставленному по электронной почте, в чате или через любой канал онбординга.
</Warning>

## Настройка ключа шифрования

<Steps>
  <Step title="Согласие на мультитенантное приложение Anthropic">
    Это создаёт субъект-службу в вашем тенанте Entra для клиентского приложения CMEK Anthropic. Приложение не запрашивает разрешений Microsoft Graph; оно существует исключительно как цель федерации для доступа к плоскости данных Key Vault.

    ```bash
    az ad sp create --id 8635ae1a-3e5d-44e8-a4ed-e0f614466f87
    ```

    Из вывода захватите поле `id`. Это идентификатор объекта субъекта-службы в вашем тенанте, который вы используете при назначении роли RBAC.

    ```json
    {
      "appId": "8635ae1a-3e5d-44e8-a4ed-e0f614466f87",
      "displayName": "anthropic-cmek-client-us",
      "id": "<sp-object-id>"
    }
    ```

    Если субъект-служба уже существует в вашем тенанте (из предыдущей попытки или другой интеграции), `az ad sp create` завершается с ошибкой «already exists». Вместо этого получите его идентификатор объекта:

    ```bash
    az ad sp show --id 8635ae1a-3e5d-44e8-a4ed-e0f614466f87 --query id -o tsv
    ```

    У этого шага нет эквивалента в Portal. Если у вас не установлен Azure CLI локально, откройте Cloud Shell из верхней панели навигации Portal. После успешного выполнения команды вы можете найти идентификатор объекта субъекта-службы в **Microsoft Entra ID > Enterprise applications**, очистив фильтр типа приложения по умолчанию и выполнив поиск `anthropic-cmek-client-us`.

    <Frame caption="Найдите Object ID субъекта-службы на обзоре его корпоративного приложения Entra.">
      ![Обзор корпоративного приложения Microsoft Entra для anthropic-cmek-client-us, где показаны его Application ID и Object ID.](https://platform.claude.com/docs/images/cmek/azure-service-principal.png)
    </Frame>
  </Step>

  <Step title="Создайте ключ RSA в вашем хранилище">
    Azure Key Vault не поддерживает симметричное обёртывание ключей, поэтому ключ должен быть RSA (3072-бит или больше) с `wrapKey` и `unwrapKey` в разрешённых операциях.

    Опция `--tags` добавляет тег организации `anthropic-org-<ORGANIZATION_UUID>` со значением `true`, где `<ORGANIZATION_UUID>` — это идентификатор вашей организации Anthropic в нижнем регистре. Тег необходим для того, чтобы Anthropic мог проверить ключ.

    <Note>
      **Как найти идентификатор организации:** скопируйте поле **Organization ID** на странице [Organization](https://platform.claude.com/settings/organization) (`platform.claude.com/settings/organization`) в Claude Console или в разделе **Organization settings > Organization** в claude.ai, либо прочитайте поле `id` из конечной точки [Organization Info](https://platform.claude.com/docs/ru/api/organization/retrieve). Используйте UUID без префикса, а не идентификатор с префиксом `org_`.
    </Note>

    ```bash
    az keyvault key create \
      --vault-name <VAULT_NAME> \
      --name <KEY_NAME> \
      --kty RSA --size 3072 \
      --ops wrapKey unwrapKey \
      --tags anthropic-org-<ORGANIZATION_UUID>=true
    ```

    Для ключей с поддержкой HSM используйте `--kty RSA-HSM` (требуется хранилище с SKU Premium). Программно защищённые ключи RSA приемлемы для этой интеграции.

    Из Portal откройте ваш Key Vault, выберите **Keys**, затем **Generate/Import**. Установите тип ключа RSA и размер 3072 или больше. Чтобы ограничить ключ только обёртыванием и разворачиванием, откройте версию ключа, прокрутите до **Permitted operations** и снимите все флажки, кроме **Wrap Key** и **Unwrap Key**.

    На странице **Create a key** также добавьте тег организации в разделе **Tags**.

    <Frame caption="Создайте ключ RSA размером 3072 или больше, с тегом anthropic-org-<ORGANIZATION_UUID>, установленным в true.">
      ![Страница Create a key в Azure Key Vault с типом ключа RSA, размером ключа 3072 и тегом anthropic-org со значением true.](https://platform.claude.com/docs/images/cmek/azure-create-key-tag.png)
    </Frame>

    <Frame caption="Ограничьте разрешённые операции до Wrap Key и Unwrap Key. Версия ключа показывает тег организации.">
      ![Версия ключа Azure Key Vault с одним тегом и разделом Permitted operations, где оставлены только Wrap Key и Unwrap Key.](https://platform.claude.com/docs/images/cmek/azure-permitted-operations-tag.png)
    </Frame>

    Чтобы использовать один ключ для нескольких организаций Anthropic, добавьте по одному такому тегу для каждой организации. Версия ключа может содержать не более 15 тегов, включая ваши собственные.

    <Note>
      Чтобы добавить тег к уже имеющемуся ключу, откройте текущую версию ключа в Portal, выберите ссылку рядом с **Tags**, добавьте тег и нажмите **Save**. С помощью Azure CLI выполните `az keyvault key set-attributes --vault-name <VAULT_NAME> --name <KEY_NAME> --tags anthropic-org-<ORGANIZATION_UUID>=true`. Его опция `--tags` заменяет теги версии, поэтому также укажите каждый тег, который уже есть у версии, в `--tags` как `name=value`. Для ключа в Managed HSM используйте `--hsm-name <HSM_NAME>` вместо `--vault-name`.
    </Note>
  </Step>

  <Step title="Предоставьте субъекту-службе Anthropic доступ к вашему ключу">
    Назначьте роль `Key Vault Crypto User` субъекту-службе из первого шага, ограниченную **отдельным ключом**, а не всем хранилищем.

    ```bash
    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`.

    <Note>
      **Альтернатива с выделенным хранилищем:** Microsoft рекомендует выделенное хранилище для каждого приложения с ролями, назначенными в области хранилища. Если вы создаёте хранилище, содержащее только этот ключ CMEK Anthropic, вы можете назначить роль в области хранилища, и эффект будет идентичным. Ограничивайте область отдельным ключом, когда ключ находится в общем хранилище.
    </Note>

    <Frame caption="Назначьте Key Vault Crypto User субъекту-службе Anthropic, ограниченному ключом.">
      ![Назначения ролей IAM в Key Vault: субъекту-службе anthropic-cmek-client-us назначена роль Key Vault Crypto User.](https://platform.claude.com/docs/images/cmek/azure-role-assignment.png)
    </Frame>
  </Step>

  <Step title="Проверьте конфигурацию вашего хранилища">
    ```bash
    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` при регистрации ключа, а не тенант вашей текущей активной подписки (эти два могут различаться в межтенантных конфигурациях).
  </Step>
</Steps>

## Зарегистрируйте ключ в Anthropic

Способ регистрации ключа зависит от того, какой продукт вы используете.

<Tabs>
  <Tab title="Claude Platform">
    Вы можете настроить ключ в Claude Console или через Admin API с одинаковым результатом.

    <Tabs>
      <Tab title="Claude Console">
        <Steps>
          <Step title="Зарегистрируйте ключ в Anthropic">
            В Claude Console перейдите на страницу [Data retention](https://platform.claude.com/settings/privacy#encryption-keys) (`platform.claude.com/settings/privacy`). Если вы не видите **Encryption keys**, выберите **Organization** в раскрывающемся меню в верхней части страницы. В разделе **Encryption keys** нажмите **Add key**. Введите отображаемое имя, выберите **Azure Key Vault** и нажмите **Continue**. Заполните поля **Vault URI**, **Key name** и **Tenant ID** и нажмите **Add**.

            Шаг с деталями ключа показывает тег организации. Добавьте его к ключу, как описано в [шаге создания](https://platform.claude.com/docs/ru/manage-claude/cmek-azure-key-vault#organization-tag), прежде чем нажать **Add**.
          </Step>

          <Step title="Проверьте ключ">
            В списке **Encryption keys** нажмите **Verify** рядом с ключом. При успешной проверке появляется **Connected**. Если проверка не пройдена, сообщение укажет причину.
          </Step>

          <Step title="Прикрепите ключ к рабочему пространству">
            В Claude Console перейдите на страницу [Data retention](https://platform.claude.com/settings/privacy) (`platform.claude.com/settings/privacy`) и выберите рабочее пространство в раскрывающемся меню в верхней части страницы. В разделе **Encryption key** выберите ключ, нажмите **Save** и подтвердите. Прикрепление ключа нельзя отменить. Для рабочего пространства, которое уже получает запросы, ключ может [вступить в силу в течение суток](https://platform.claude.com/docs/ru/manage-claude/cmek#how-it-works).
          </Step>
        </Steps>
      </Tab>

      <Tab title="API">
        <Steps>
          <Step title="Зарегистрируйте ключ в Anthropic">
            Создайте конфигурацию внешнего ключа через Admin API.

            <CodeGroup>
              ```bash cURL
              curl -sS "https://api.anthropic.com/v1/organizations/external_keys" \
                -H "x-api-key: $ANTHROPIC_API_KEY" \
                -H "anthropic-version: 2023-06-01" \
                -H "content-type: application/json" \
                -d '{
                  "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>"
                  }
                }'
              ```

              ```bash CLI
              ant organization:external-keys create <<'YAML'
              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>"
              YAML
              ```

              ```python Python
              client = anthropic.Anthropic()

              external_key = client.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}")
              ```

              ```typescript TypeScript
              const client = new Anthropic();

              const externalKey = await client.organization.externalKeys.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>"
                }
              });

              console.log(`id: ${externalKey.id}`);
              console.log(`display_name: ${externalKey.display_name}`);
              ```

              ```csharp C#
              using Anthropic.Models.Organization.ExternalKeys;

              AnthropicClient client = new();

              var externalKey = await client.Organization.ExternalKeys.Create(new()
              {
                  DisplayName = "<friendly-name>",
                  Geo = Geo.Us,
                  ProviderConfig = new AzureExternalKeyConfigParam
                  {
                      VaultUri = "https://<your-vault-name>.vault.azure.net/",
                      KeyName = "<your-key-name>",
                      TenantID = "<your-tenant-id>"
                  }
              });

              Console.WriteLine($"id: {externalKey.ID}");
              Console.WriteLine($"display_name: {externalKey.DisplayName}");
              ```

              ```go Go
              client := anthropic.NewClient()

              externalKey, err := client.Organization.ExternalKeys.New(context.Background(), anthropic.OrganizationExternalKeyNewParams{
              	DisplayName: anthropic.String("<friendly-name>"),
              	Geo:         anthropic.OrganizationExternalKeyNewParamsGeoUs,
              	ProviderConfig: anthropic.OrganizationExternalKeyNewParamsProviderConfigUnion{
              		OfAzure: &anthropic.AzureExternalKeyConfigParam{
              			VaultURI: "https://<your-vault-name>.vault.azure.net/",
              			KeyName:  "<your-key-name>",
              			TenantID: "<your-tenant-id>",
              		},
              	},
              })
              if err != nil {
              	log.Fatal(err)
              }

              fmt.Printf("id: %s\n", externalKey.ID)
              fmt.Printf("display_name: %s\n", externalKey.DisplayName)
              ```

              ```java Java
              import com.anthropic.models.organization.externalkeys.AzureExternalKeyConfigParam;
              import com.anthropic.models.organization.externalkeys.ExternalKeyCreateParams;

              void main() {
                  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

                  var params = ExternalKeyCreateParams.builder()
                      .displayName("<friendly-name>")
                      .geo(ExternalKeyCreateParams.Geo.US)
                      .providerConfig(AzureExternalKeyConfigParam.builder()
                          .vaultUri("https://<your-vault-name>.vault.azure.net/")
                          .keyName("<your-key-name>")
                          .tenantId("<your-tenant-id>")
                          .build())
                      .build();
                  var externalKey = client.organization().externalKeys().create(params);

                  IO.println("id: " + externalKey.id());
                  IO.println("display_name: " + externalKey.displayName().orElseThrow());
              }
              ```

              ```php PHP
              use Anthropic\Organization\ExternalKeys\ExternalKeyCreateParams\Geo;
              // ...

              $client = new Client();

              $externalKey = $client->organization->externalKeys->create(
                  displayName: '<friendly-name>',
                  geo: Geo::US,
                  providerConfig: [
                      'type' => 'azure',
                      'vaultURI' => 'https://<your-vault-name>.vault.azure.net/',
                      'keyName' => '<your-key-name>',
                      'tenantID' => '<your-tenant-id>',
                  ],
              );

              echo "id: {$externalKey->id}\n";
              echo "display_name: {$externalKey->displayName}\n";
              ```

              ```ruby Ruby
              client = Anthropic::Client.new

              external_key = client.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>"
                }
              )

              puts "id: #{external_key.id}"
              puts "display_name: #{external_key.display_name}"
              ```
            </CodeGroup>

            Ответ содержит идентификатор внешнего ключа:

            ```json
            {
              "type": "external_key",
              "id": "ekey_<id>",
              "display_name": "<friendly-name>"
            }
            ```
          </Step>

          <Step title="Проверьте ключ">
            Запустите цикл шифрования и дешифрования с вашим ключом. Это подтверждает, что Anthropic может аутентифицироваться в вашем тенанте и выполнять операции обёртывания и разворачивания.

            <CodeGroup>
              ```bash cURL
              curl -sS -X POST "https://api.anthropic.com/v1/organizations/external_keys/ekey_<id>/validate" \
                -H "x-api-key: $ANTHROPIC_API_KEY" \
                -H "anthropic-version: 2023-06-01"
              ```

              ```bash CLI
              ant organization:external-keys validate --external-key-id "ekey_<id>"
              ```

              ```python Python
              client = anthropic.Anthropic()

              validation = client.organization.external_keys.validate("ekey_<id>")

              print(f"status: {validation.status}")
              print(f"error: {validation.error}")
              ```

              ```typescript TypeScript
              const client = new Anthropic();

              const validation = await client.organization.externalKeys.validate("ekey_<id>");

              console.log(`status: ${validation.status}`);
              console.log(`error: ${validation.error}`);
              ```

              ```csharp C#
              AnthropicClient client = new();

              var validation = await client.Organization.ExternalKeys.Validate("ekey_<id>");

              Console.WriteLine($"status: {validation.Status.Raw()}");
              Console.WriteLine($"error: {validation.Error}");
              ```

              ```go Go
              client := anthropic.NewClient()

              validation, err := client.Organization.ExternalKeys.Validate(context.Background(), "ekey_<id>")
              if err != nil {
              	log.Fatal(err)
              }

              fmt.Printf("status: %s\n", validation.Status)
              fmt.Printf("error: %s\n", validation.Error)
              ```

              ```java Java
              AnthropicClient client = AnthropicOkHttpClient.fromEnv();

              var validation = client.organization().externalKeys().validate("ekey_<id>");

              IO.println("status: " + validation.status().asString());
              IO.println("error: " + validation.error().orElse(""));
              ```

              ```php PHP
              $client = new Client();

              $validation = $client->organization->externalKeys->validate(
                  externalKeyID: 'ekey_<id>',
              );

              echo "status: {$validation->status}\n";
              echo "error: {$validation->error}\n";
              ```

              ```ruby Ruby
              client = Anthropic::Client.new

              validation = client.organization.external_keys.validate("ekey_<id>")

              puts "status: #{validation.status}"
              puts "error: #{validation.error}"
              ```
            </CodeGroup>

            Успешный ответ выглядит так:

            ```json
            { "type": "external_key_validation", "status": "success", "error": null }
            ```

            Если проверка не удаётся, поле `error` описывает проблему. Распространённые причины:

            * **Задержка распространения RBAC:** назначения ролей могут вступать в силу через несколько минут. Подождите и повторите попытку.
            * **Сетевые ACL, блокирующие Anthropic:** подтвердите публичный сетевой доступ и `ipRules`, как описано в шаге проверки.
            * **Политики условного доступа для рабочих идентификаторов:** если в вашем тенанте есть политики условного доступа, нацеленные на субъекты-службы, исключите субъект-службу Anthropic или добавьте диапазоны исходящего трафика Anthropic в именованные местоположения политики.
          </Step>

          <Step title="Прикрепите ключ к рабочему пространству">
            После проверки ключа прикрепите его к новому рабочему пространству, прежде чем отправлять какие-либо запросы в это рабочее пространство. Для рабочего пространства, которое уже получает запросы, ключ может [вступить в силу в течение дня](https://platform.claude.com/docs/ru/manage-claude/cmek#how-it-works).

            <CodeGroup>
              ```bash cURL
              curl -sS -X POST "https://api.anthropic.com/v1/organizations/workspaces/<workspace-id>" \
                -H "x-api-key: $ANTHROPIC_API_KEY" \
                -H "anthropic-version: 2023-06-01" \
                -H "content-type: application/json" \
                -d '{
                  "external_key_id": "ekey_<id>"
                }'
              ```

              ```bash CLI
              ant organization:workspaces update \
                --workspace-id "<workspace-id>" \
                --external-key-id "ekey_<id>"
              ```

              ```python Python
              client = anthropic.Anthropic()

              workspace = client.organization.workspaces.update(
                  "<workspace-id>", external_key_id="ekey_<id>"
              )

              print(f"id: {workspace.id}")
              print(f"external_key_id: {workspace.external_key_id}")
              ```

              ```typescript TypeScript
              const client = new Anthropic();

              const workspace = await client.organization.workspaces.update("<workspace-id>", {
                external_key_id: "ekey_<id>"
              });

              console.log(`id: ${workspace.id}`);
              console.log(`external_key_id: ${workspace.external_key_id}`);
              ```

              ```csharp C#
              AnthropicClient client = new();

              var workspace = await client.Organization.Workspaces.Update("<workspace-id>", new()
              {
                  ExternalKeyID = "ekey_<id>"
              });

              Console.WriteLine($"id: {workspace.ID}");
              Console.WriteLine($"external_key_id: {workspace.ExternalKeyID}");
              ```

              ```go Go
              client := anthropic.NewClient()

              workspace, err := client.Organization.Workspaces.Update(
              	context.Background(),
              	"<workspace-id>",
              	anthropic.OrganizationWorkspaceUpdateParams{
              		ExternalKeyID: anthropic.String("ekey_<id>"),
              	},
              )
              if err != nil {
              	log.Fatal(err)
              }

              fmt.Printf("id: %s\n", workspace.ID)
              fmt.Printf("external_key_id: %s\n", workspace.ExternalKeyID)
              ```

              ```java Java
              import com.anthropic.models.organization.workspaces.WorkspaceUpdateParams;

              void main() {
                  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

                  var params = WorkspaceUpdateParams.builder()
                      .externalKeyId("ekey_<id>")
                      .build();
                  var workspace = client.organization().workspaces().update("<workspace-id>", params);

                  IO.println("id: " + workspace.id());
                  IO.println("external_key_id: " + workspace.externalKeyId().orElseThrow());
              }
              ```

              ```php PHP
              $client = new Client();

              $workspace = $client->organization->workspaces->update(
                  workspaceID: '<workspace-id>',
                  externalKeyID: 'ekey_<id>',
              );

              echo "id: {$workspace->id}\n";
              echo "external_key_id: {$workspace->externalKeyID}\n";
              ```

              ```ruby Ruby
              client = Anthropic::Client.new

              workspace = client.organization.workspaces.update(
                "<workspace-id>",
                external_key_id: "ekey_<id>"
              )

              puts "id: #{workspace.id}"
              puts "external_key_id: #{workspace.external_key_id}"
              ```
            </CodeGroup>
          </Step>
        </Steps>
      </Tab>
    </Tabs>
  </Tab>

  <Tab title="Claude Enterprise">
    В [claude.ai > Organization settings > Data and privacy](https://claude.ai/admin-settings/data-privacy-controls) откройте **Encryption keys**, затем нажмите **Add key**. Выберите **Azure**, введите URI хранилища, имя ключа и идентификатор тенанта из шага проверки и нажмите **Continue**. Anthropic проверяет ключ с помощью цикла шифрования и дешифрования. Как только он отображается как проверенный, ваша организация защищена CMEK с этого момента.

    В Claude Enterprise CMEK применяется ко всей организации, поэтому нет отдельного шага прикрепления к рабочему пространству, и организация может иметь только один ключ.
  </Tab>
</Tabs>

## Terraform

Для развёртываний инфраструктуры как кода те же шаги сопоставляются с провайдерами `azurerm` и `azuread`.
