---
title: Настройка Google Cloud KMS для CMEK
url: https://platform.claude.com/docs/ru/manage-claude/cmek-google-cloud-kms
description: Используйте Google Cloud KMS для предоставления ключа шифрования для вашей организации.
---

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

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

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

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

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

* Проект Google Cloud с включённым биллингом.
* Включённый Cloud KMS API (`cloudkms.googleapis.com`).
* Разрешения на создание связок ключей (key rings) и ключей KMS, а также на установку политики IAM для них (`roles/cloudkms.admin` или эквивалент).
* Ключ Anthropic Admin API для вашей организации.
* Установленный и аутентифицированный [`gcloud` CLI](https://cloud.google.com/cli).
* Включённые для проекта **журналы аудита доступа к данным (Data Access audit logs)** Cloud KMS (IAM & Admin > Audit Logs > Cloud Key Management Service, с `DATA_READ` и `DATA_WRITE`). По умолчанию они отключены; без них операции шифрования и расшифровки Anthropic не создают записей в Cloud Logging.

## Адрес электронной почты сервисного аккаунта Anthropic

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

```text wrap
anthropic-cmek-client-us@gcp-anthropic-cmek-clients.iam.gserviceaccount.com
```

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

<Note>
  **Ограничение совместного доступа по домену:** Если ваш проект находится под организацией Google Cloud, которая применяет `constraints/iam.allowedPolicyMemberDomains`, следующие привязки IAM отклоняются, поскольку сервисный аккаунт Anthropic находится за пределами вашей организации. Вам нужно либо исключение на уровне проекта для этого ограничения, либо добавить идентификатор клиента Cloud Identity Anthropic (формат `C0xxxxxxxx`) в список разрешённых. При необходимости свяжитесь с Anthropic для получения идентификатора клиента.
</Note>

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

<Steps>
  <Step title="Создайте или выберите связку ключей">
    Пропустите этот шаг, если у вас уже есть связка ключей для повторного использования. Связки ключей являются региональными. Выберите однорегиональное расположение в США, такое как `us-east5`, которое соответствует географии Anthropic, которую вы настраиваете. Мультирегиональные расположения, такие как `us` и `global`, не поддерживаются.

    ```bash
    gcloud kms keyrings create <your-keyring-name> \
      --project=<your-project-id> \
      --location=<region>
    ```
  </Step>

  <Step title="Создайте криптографический ключ">
    Создайте симметричный ключ с назначением `ENCRYPT_DECRYPT`. Anthropic настоятельно рекомендует защиту HSM: ключи Cloud KMS HSM валидированы по FIPS 140-2 Level 3, а разница в стоимости по сравнению с программными ключами невелика.

    Опция `--labels` добавляет метку организации, `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
    gcloud kms keys create <KEY_NAME> \
      --project=<PROJECT_ID> \
      --location=<REGION> \
      --keyring=<KEYRING_NAME> \
      --purpose=encryption \
      --protection-level=hsm \
      --labels=anthropic-org-<ORGANIZATION_UUID>=true
    ```

    Для программной защиты вместо этого опустите `--protection-level=hsm`. Ничего больше в этом руководстве не меняется.

    Вы также можете создать ключ из Google Cloud Console. Откройте связку ключей, нажмите **Create key**, выберите **Generated key**, установите назначение и алгоритм на симметричное шифрование и расшифровку, и выберите **HSM** в разделе уровня защиты.

    <Frame caption="Создайте защищённый HSM симметричный ключ шифрования/расшифровки с меткой организации.">
      ![Страница Create key в Google Cloud KMS с защитой HSM, симметричным шифрованием/расшифровкой и меткой anthropic-org со значением true.](https://platform.claude.com/docs/images/cmek/gcp-create-key-label.png)
    </Frame>

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

    <Note>
      Чтобы добавить метку к ключу, у которого её нет, выполните `gcloud kms keys update <KEY_NAME> --project=<PROJECT_ID> --location=<REGION> --keyring=<KEYRING_NAME> --update-labels=anthropic-org-<ORGANIZATION_UUID>=true`. Это объединяет метку с любыми метками, которые уже есть у ключа.
    </Note>
  </Step>

  <Step title="Предоставьте сервисному аккаунту Anthropic доступ к ключу">
    Требуются две привязки IAM на уровне ключа. Обе ограничены одним криптографическим ключом, а не всем проектом или всей связкой ключей.

    Шифрование и расшифровка, которые Anthropic использует для шифрования и расшифровки ключей данных, защищающих данные вашего рабочего пространства (конвертное шифрование):

    ```bash
    gcloud kms keys add-iam-policy-binding <your-key-name> \
      --project=<your-project-id> \
      --location=<region> \
      --keyring=<your-keyring-name> \
      --member="serviceAccount:anthropic-cmek-client-us@gcp-anthropic-cmek-clients.iam.gserviceaccount.com" \
      --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
    ```

    Viewer, для чтения метаданных (`cryptoKeys.get`), которое Anthropic выполняет при запуске для валидации назначения и алгоритма ключа:

    ```bash
    gcloud kms keys add-iam-policy-binding <your-key-name> \
      --project=<your-project-id> \
      --location=<region> \
      --keyring=<your-keyring-name> \
      --member="serviceAccount:anthropic-cmek-client-us@gcp-anthropic-cmek-clients.iam.gserviceaccount.com" \
      --role=roles/cloudkms.viewer
    ```

    Из Console выберите ключ, откройте панель **Permissions**, нажмите **Grant access** и добавьте сервисный аккаунт с обеими ролями Cloud KMS CryptoKey Encrypter/Decrypter и Cloud KMS Viewer. Убедитесь, что вы находитесь на странице разрешений ключа, а не связки ключей или проекта, чтобы предоставление было ограничено только этим ключом.

    <Frame caption="Предоставьте сервисному аккаунту Anthropic обе роли, ограниченные ключом.">
      ![Диалоговое окно Grant access, в котором сервисному аккаунту Anthropic назначены роли Cloud KMS CryptoKey Encrypter/Decrypter и Viewer.](https://platform.claude.com/docs/images/cmek/gcp-grant-access.png)
    </Frame>
  </Step>

  <Step title="Запишите полное имя ресурса ключа">
    Вы передаёте его Anthropic при регистрации ключа. Формат:

    ```text wrap
    projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>
    ```

    Получите его с помощью:

    ```bash
    gcloud kms keys describe <your-key-name> \
      --project=<your-project-id> \
      --location=<region> \
      --keyring=<your-keyring-name> \
      --format="value(name)"
    ```

    Из Console откройте страницу сведений о ключе и нажмите **Copy resource name**.

    <Frame caption="Скопируйте полное имя ресурса ключа из меню действий.">
      ![Сведения о связке ключей Google Cloud с выделенным действием Copy resource name в меню действий ключа.](https://platform.claude.com/docs/images/cmek/gcp-copy-resource-name.png)
    </Frame>
  </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**. Введите отображаемое имя, выберите **Google Cloud KMS** и нажмите **Continue**. Вставьте полное имя ресурса ключа в поле **Key resource name** и нажмите **Add**.

            Шаг сведений о ключе показывает метку организации. Добавьте её к ключу, как описано в [шаге создания](https://platform.claude.com/docs/ru/manage-claude/cmek-google-cloud-kms#organization-label), прежде чем нажать **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": "gcp",
                    "key_name": "projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>"
                  }
                }'
              ```

              ```bash CLI
              ant organization:external-keys create <<'YAML'
              display_name: "<friendly-name>"
              geo: us
              provider_config:
                type: gcp
                key_name: "projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>"
              YAML
              ```

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

              external_key = client.organization.external_keys.create(
                  display_name="<friendly-name>",
                  geo="us",
                  provider_config={
                      "type": "gcp",
                      "key_name": "projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>",
                  },
              )

              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: "gcp",
                  key_name:
                    "projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>"
                }
              });

              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 GcpExternalKeyConfig
                  {
                      KeyName = "projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>"
                  }
              });

              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{
              		OfGCP: &anthropic.GCPExternalKeyConfigParam{
              			KeyName: "projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>",
              		},
              	},
              })
              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.ExternalKeyCreateParams;

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

                  var params = ExternalKeyCreateParams.builder()
                      .displayName("<friendly-name>")
                      .geo(ExternalKeyCreateParams.Geo.US)
                      .gcpProviderConfig("projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>")
                      .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' => 'gcp',
                      'keyName' => 'projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>',
                  ],
              );

              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: :gcp,
                  key_name: "projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>"
                }
              )

              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="Валидируйте ключ">
            Запустите цикл шифрования и расшифровки для вашего ключа.

            <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

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

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

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

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

            Если валидация не удаётся, распространённые причины:

            * **VPC Service Controls:** если периметр сервиса защищает Cloud KMS в вашем проекте, добавьте Anthropic в уровень доступа на периметре (или исключите проект ключа), чтобы Anthropic могла получить доступ к ключу.
            * **Ограничение совместного доступа по домену:** политика организации `constraints/iam.allowedPolicyMemberDomains` может удалить привязку сервисного аккаунта Anthropic (см. предыдущее примечание). Подтвердите наличие привязки с помощью `gcloud kms keys get-iam-policy <your-key-name> --project=<your-project-id> --location=<region> --keyring=<your-keyring-name>`.
            * **Отключённая или уничтоженная версия ключа:** подтвердите, что основная версия ключа включена, а не отключена, не запланирована к уничтожению и не уничтожена.
          </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_id = "<workspace-id>"
              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**. Выберите **Google Cloud**, вставьте полное имя ресурса ключа из предыдущего шага и нажмите **Continue**. Anthropic валидирует ключ с помощью цикла шифрования и расшифровки. Как только он отобразится как проверенный, ваша организация защищена CMEK с этого момента.

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

## Terraform

Для развёртываний по модели «инфраструктура как код» те же шаги сопоставляются с провайдером `google` и ресурсами `google_kms_key_ring`, `google_kms_crypto_key` и `google_kms_crypto_key_iam_member`.
