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

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

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

Это руководство описывает настройку ключа [AWS KMS](https://aws.amazon.com/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>

<Note>
  **Claude Platform on AWS:** В [Claude Platform on AWS](https://platform.claude.com/docs/ru/build-with-claude/claude-platform-on-aws) ваша политика ключа предоставляет доступ принципалу службы AWS вместо роли IAM Anthropic, отдельного шага проверки нет, и вы регистрируете и прикрепляете ключ в Claude Console. Следуйте разделу [Настройка CMEK в Claude Platform on AWS](https://platform.claude.com/docs/ru/manage-claude/cmek-aws-kms#claude-platform-on-aws) на этой странице вместо шагов в следующих разделах.
</Note>

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

* Учётная запись AWS с разрешениями на создание ключей KMS и установку политик ключей (`kms:CreateKey` и `kms:PutKeyPolicy`).
* Ключ Admin API Anthropic для вашей организации.
* Установленный и аутентифицированный [AWS CLI](https://aws.amazon.com/cli/).

## Amazon Resource Name (ARN) для Anthropic

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

```text wrap
arn:aws:iam::915198916910:role/anthropic-cmek-client-us
```

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

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

<Steps>
  <Step title="Создайте ключ KMS с межаккаунтной политикой ключа">
    <Note>
      **Claude Platform on AWS:** Пропустите этот шаг. Ваша политика ключа предоставляет доступ принципалу службы AWS, и в ней нет условия организации. [Настройка CMEK в Claude Platform on AWS](https://platform.claude.com/docs/ru/manage-claude/cmek-aws-kms#claude-platform-on-aws) даёт эту политику.
    </Note>

    Политика ключа предоставляет роли IAM Anthropic межаккаунтный доступ. Требуются три оператора:

    1. **Корневой администратор учётной записи:** стандартный шаблон KMS. Ваша учётная запись сохраняет полный административный контроль.
    2. **Шифрование и дешифрование Anthropic:** действия `kms:Encrypt` и `kms:Decrypt`, которые Anthropic использует для шифрования и дешифрования ключей данных, защищающих данные вашего рабочего пространства (конвертное шифрование).
    3. **Описание Anthropic:** чтение метаданных, которое Anthropic выполняет при запуске. Оно предоставляется отдельно, потому что `DescribeKey` не имеет параметра `EncryptionContext`, поэтому условие `EncryptionContext` для этого действия всегда отклоняло бы его.

    Чтобы найти [идентификатор вашей учётной записи AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/console-account-id.html), выполните `aws sts get-caller-identity --query Account --output text`.

    В политике замените `<AWS_ACCOUNT_ID>` на идентификатор вашей учётной записи AWS и `<ORGANIZATION_UUID>` на идентификатор вашей организации. Условие `StringEquals` для `kms:EncryptionContext:anthropic:org_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>

    Сохраните политику как `key-policy.json`. Чтобы создать ключ в AWS Console вместо этого, вставьте политику туда, как описано далее в этом шаге.

    ```json key-policy.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "AccountRootAdmin",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::<AWS_ACCOUNT_ID>:root"
          },
          "Action": "kms:*",
          "Resource": "*"
        },
        {
          "Sid": "AllowAnthropicCMEKCrypto",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::915198916910:role/anthropic-cmek-client-us"
          },
          "Action": ["kms:Encrypt", "kms:Decrypt"],
          "Resource": "*",
          "Condition": {
            "StringEquals": {
              "kms:EncryptionContext:anthropic:org_uuid": ["<ORGANIZATION_UUID>"]
            }
          }
        },
        {
          "Sid": "AllowAnthropicCMEKDescribe",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::915198916910:role/anthropic-cmek-client-us"
          },
          "Action": "kms:DescribeKey",
          "Resource": "*"
        }
      ]
    }
    ```

    <Note>
      **Необязательно:** Чтобы ограничить ключ некоторыми из ваших рабочих пространств, используйте этот оператор `AllowAnthropicCMEKCrypto` вместо того, что в предыдущем JSON политики, с одним идентификатором отсека для каждого рабочего пространства. Добавьте идентификатор отсека рабочего пространства перед тем, как прикрепить к нему ключ. Для нового рабочего пространства создайте его без ключа, добавьте его идентификатор отсека, а затем прикрепите ключ.

      ```json
      {
        "Sid": "AllowAnthropicCMEKCrypto",
        "Effect": "Allow",
        "Principal": {
          "AWS": "arn:aws:iam::915198916910:role/anthropic-cmek-client-us"
        },
        "Action": ["kms:Encrypt", "kms:Decrypt"],
        "Resource": "*",
        "Condition": {
          "StringEquals": {
            "kms:EncryptionContext:anthropic:org_uuid": ["<ORGANIZATION_UUID>"]
          },
          "StringEqualsIfExists": {
            "kms:EncryptionContext:anthropic:compartment_uuid": ["<COMPARTMENT_UUID>"]
          }
        }
      }
      ```
    </Note>

    ```bash
    aws kms create-key \
      --region <REGION> \
      --description "Anthropic CMEK" \
      --key-usage ENCRYPT_DECRYPT \
      --policy file://key-policy.json
    ```

    Захватите `KeyMetadata.Arn` из вывода. Он понадобится вам при регистрации ключа на следующем шаге.

    <Warning>
      Если ключ уже настроен для CMEK и защищает существующие данные, вы должны добавить оператор, который позволяет Anthropic дешифровать эти данные, в дополнение к трём операторам в предыдущей политике. В его условии перечислите идентификатор отсека каждого рабочего пространства, к которому ключ прикреплён или был прикреплён.

      ```json
      {
        "Sid": "AllowAnthropicCMEKDecryptExistingData",
        "Effect": "Allow",
        "Principal": {
          "AWS": "arn:aws:iam::915198916910:role/anthropic-cmek-client-us"
        },
        "Action": "kms:Decrypt",
        "Resource": "*",
        "Condition": {
          "StringEquals": {
            "kms:EncryptionContext:anthropic:compartment_uuid": ["<COMPARTMENT_UUID>"]
          }
        }
      }
      ```
    </Warning>

    Anthropic проверяет ключ, когда вы его верифицируете или прикрепляете к рабочему пространству. Каждая проверка добавляет четыре ошибки отказа в доступе в CloudTrail. Это ожидаемо. Если вам нужно их отфильтровать, фильтруйте по всем трём следующим значениям. Первого одного недостаточно, потому что любой вызывающий может его установить:

    * `requestParameters.encryptionContext.associatedData`: `Y21lay12YWxpZGF0aW9u`
    * `userIdentity.accountId`: `915198916910`
    * `resources.ARN`: `arn:aws:kms:<REGION>:<AWS_ACCOUNT_ID>:key/<KEY_ID>`

    <Note>
      **Поиск идентификатора вашего отсека:** См. вкладку **Claude Platform** в разделе **Регистрация ключа в Anthropic**.
    </Note>

    Вы также можете создать ключ из AWS Console. Выберите симметричный ключ с использованием для шифрования и дешифрования, однорегиональный ключ и происхождение материала ключа KMS. Мастер создания ключа фиксирует политику ключа на шаге **Review**: Если вы добавите идентификатор учётной записи Anthropic `915198916910` в разрешения на использование ключа там, сгенерированная политика предоставит всей учётной записи Anthropic более широкие действия (такие как `kms:ReEncrypt*` и `kms:GenerateDataKey*`) без условия `EncryptionContext`, и проверка отклонит её. Чтобы не оставить ключ с избыточными разрешениями, завершите мастер только с административными разрешениями, затем откройте вкладку **Key policy** ключа и замените JSON политикой `key-policy.json`, показанной ранее в этом шаге.

    <Frame caption="Настройка ключа: симметричный, шифрование и дешифрование, однорегиональный ключ.">
      ![Мастер создания ключа AWS KMS на шаге Configure key: выбраны симметричный тип ключа, использование для шифрования и дешифрования и однорегиональный ключ.](https://platform.claude.com/docs/images/cmek/aws-configure-key.png)
    </Frame>

    <Frame caption="Добавьте псевдоним и описание для ключа.">
      ![Шаг Add labels в AWS KMS с псевдонимом anthropic-cmek и описанием Anthropic CMEK.](https://platform.claude.com/docs/images/cmek/aws-add-labels.png)
    </Frame>

    <Frame caption="Определите административные разрешения ключа (необязательно). Ваша учётная запись сохраняет полный административный контроль.">
      ![Шаг Define key administrative permissions в AWS KMS со списком ролей IAM, которые могут администрировать ключ.](https://platform.claude.com/docs/images/cmek/aws-admin-permissions.png)
    </Frame>

    <Frame caption="Не добавляйте идентификатор учётной записи Anthropic здесь. Этот шаг мастера создаёт политику с избыточными разрешениями. Оставьте разрешения на использование пустыми и отредактируйте JSON Key policy после создания (см. предыдущую политику ключа).">
      ![Шаг Define key usage permissions в AWS KMS с идентификатором учётной записи Anthropic, введённым в разделе Other AWS accounts.](https://platform.claude.com/docs/images/cmek/aws-usage-permissions.png)
    </Frame>
  </Step>
</Steps>

## Регистрация ключа в Anthropic

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

<Tabs>
  <Tab title="Claude Platform">
    <Note>
      **Claude Platform on AWS:** Принципал, политика ключа и процесс регистрации отличаются, и отдельного шага проверки нет. Следуйте разделу [Настройка CMEK в Claude Platform on AWS](https://platform.claude.com/docs/ru/manage-claude/cmek-aws-kms#claude-platform-on-aws) вместо этой вкладки.
    </Note>

    <Note>
      **Поиск идентификатора вашего отсека:** У каждого рабочего пространства есть идентификатор отсека, который ограничивает область его данных CMEK. Чтобы найти его в Claude Console, перейдите на страницу [Data retention](https://platform.claude.com/settings/privacy) (`platform.claude.com/settings/privacy`) и выберите рабочее пространство в раскрывающемся меню в верхней части страницы. Идентификатор находится в разделе **Encryption key**, в поле **Compartment ID**. Вы также можете прочитать поле `compartment_id`, возвращаемое эндпоинтом [Get Workspace](https://platform.claude.com/docs/ru/api/organization/workspaces/retrieve).
    </Note>

    Вы можете настроить ключ в 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**. Введите отображаемое имя, выберите **AWS KMS** и нажмите **Continue**. Вставьте ARN ключа в поле **KMS key ARN** и нажмите **Add**.

            Шаг с деталями ключа показывает идентификатор вашей организации. Добавьте его в [политику ключа](https://platform.claude.com/docs/ru/manage-claude/cmek-aws-kms#key-policy) перед тем, как нажать **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": "aws",
                    "kms_arn": "<key-arn-from-create-key-step>"
                  }
                }'
              ```

              ```bash CLI
              ant organization:external-keys create <<'YAML'
              display_name: "<friendly-name>"
              geo: us
              provider_config:
                type: aws
                kms_arn: "<key-arn-from-create-key-step>"
              YAML
              ```

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

              external_key = client.organization.external_keys.create(
                  display_name="<friendly-name>",
                  geo="us",
                  provider_config={"type": "aws", "kms_arn": "<key-arn-from-create-key-step>"},
              )

              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: "aws",
                  kms_arn: "<key-arn-from-create-key-step>"
                }
              });

              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 AwsExternalKeyConfig
                  {
                      KmsArn = "<key-arn-from-create-key-step>"
                  }
              });

              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{
              		OfAWS: &anthropic.AWSExternalKeyConfigParam{
              			KMSARN: "<key-arn-from-create-key-step>",
              		},
              	},
              })
              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.AwsExternalKeyConfig;
              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(AwsExternalKeyConfig.builder()
                          .kmsArn("<key-arn-from-create-key-step>")
                          .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' => 'aws',
                      'kmsARN' => '<key-arn-from-create-key-step>',
                  ],
              );

              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: :aws,
                  kms_arn: "<key-arn-from-create-key-step>"
                }
              )

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

            Если проверка не проходит, распространённые причины:

            * **Несоответствие контекста шифрования:** Если политика имеет условие `kms:EncryptionContext:anthropic:compartment_uuid`, убедитесь, что в нём перечислен идентификатор отсека каждого рабочего пространства, к которому прикреплён ключ. Проверка отправляет идентификатор отсека рабочего пространства, которое она проверяет. Более старый ключ, чей оператор отсека всё ещё разрешает `kms:Encrypt`, проверяется со значением из всех нулей (`00000000-0000-0000-0000-000000000000`), пока он не прикреплён, поэтому сохраните это значение в его списке.
            * **Политики управления ресурсами (RCP):** Если ваша организация AWS имеет RCP, которая отклоняет операции KMS, когда `aws:PrincipalOrgID` не соответствует вашей организации, она блокирует межаккаунтную роль Anthropic. RCP нуждается в исключении для этого ключа или для ARN роли Anthropic. Политики управления службами здесь не применяются, потому что они не оцениваются для внешних принципалов, вызывающих через политики на основе ресурсов.
            * **Доступ предоставлен через IAM вместо политики ключа:** Межаккаунтный доступ KMS должен предоставляться в самой политике ключа, а не через политику IAM в вашей учётной записи. Проверьте с помощью `aws kms get-key-policy --key-id <id> --policy-name default`.
            * **Несоответствие региона:** Убедитесь, что регион ключа — это тот, в котором 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_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**. Выберите **AWS** и нажмите **Continue**, затем вставьте Key ARN из предыдущего шага и нажмите **Add**. Anthropic проверяет ключ с помощью цикла шифрования и дешифрования. Как только он отображается как проверенный, ваша организация защищена CMEK с этого момента.

    Шаг с деталями ключа в этом процессе отображает ваш **Organization ID for the key policy** с кнопкой копирования. Подставьте это значение вместо `<ORGANIZATION_UUID>` в политике ключа. Вы можете открыть процесс, чтобы скопировать идентификатор перед созданием ключа.

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

## Настройка CMEK в Claude Platform on AWS

В [Claude Platform on AWS](https://platform.claude.com/docs/ru/build-with-claude/claude-platform-on-aws) CMEK использует только ключи AWS KMS, и настройка отличается от предыдущих разделов следующим образом:

* **Принципал:** Ваша политика ключа предоставляет доступ принципалу службы AWS `aws-external-anthropic.amazonaws.com`. Роль IAM и идентификатор учётной записи Anthropic не используются, поэтому [ARN для Anthropic](https://platform.claude.com/docs/ru/manage-claude/cmek-aws-kms#amazon-resource-name-arn-for-anthropic) не применяется.
* **Требования к ключу:** Ключ должен быть симметричным ключом KMS с использованием для шифрования и дешифрования, однорегиональным и в той же учётной записи и регионе AWS, что и рабочее пространство, к которому вы его прикрепляете. Межаккаунтные ключи не поддерживаются: ключ должен быть в учётной записи AWS, которая размещает вашу организацию. Мультирегиональные ключи (идентификаторы ключей, начинающиеся с `mrk-`) и ARN псевдонимов отклоняются при регистрации ключа; используйте ARN ключа.
* **Нет отдельного шага проверки:** Помимо этих проверок ARN ключа при регистрации, ключ проверяется, когда вы прикрепляете его к рабочему пространству. Вызов прикрепления выполняет цикл шифрования/дешифрования для ключа с идентификатором отсека этого рабочего пространства в качестве контекста шифрования, поэтому проблема с политикой ключа проявляется во время прикрепления, а не при регистрации. Поэтому условие `EncryptionContext` не нуждается в записи из всех нулей.
* **Где вы управляете ключами:** Регистрируйте и прикрепляйте ключи в Claude Console, войдя через AWS с ролью Admin. Эндпоинты внешних ключей также доступны в Claude Platform on AWS, авторизованные через [действия IAM](https://platform.claude.com/docs/ru/api/claude-platform-on-aws-iam-actions#encryption-keys); там ключ идентифицируется по его ARN ключа KMS, а не по идентификатору `ekey_`.

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

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

* Учётная запись AWS, которая размещает вашу организацию Claude Platform on AWS, с разрешениями на создание ключей KMS и установку политик ключей (`kms:CreateKey` и `kms:PutKeyPolicy`).
* Роль **Admin** в Claude Console для Claude Platform on AWS. См. [Использование Claude Console](https://platform.claude.com/docs/ru/build-with-claude/claude-platform-on-aws#using-the-claude-console).
* Для принципала IAM, с которым вы входите в Claude Console: помимо `aws-external-anthropic:AssumeConsole`, [действия IAM](https://platform.claude.com/docs/ru/api/claude-platform-on-aws-iam-actions#encryption-keys) для выполняемых там операций, поскольку регистрация, просмотр списка и прикрепление ключей проходят через шлюз AWS. Регистрация ключа — это `RegisterKey` (с `ListKeys` и `GetKey` для просмотра регистраций), а прикрепление — `UpdateWorkspace` или `CreateWorkspace`. Действия с внешними ключами (и `CreateWorkspace`) имеют область действия на уровне учётной записи, поэтому предоставляйте их для `Resource: "*"`; политика, ограниченная ARN рабочих пространств, их не включает.
* Для принципала IAM, который прикрепляет ключ к рабочему пространству (идентичность, с которой вы вошли в Claude Console): `kms:DescribeKey`, `kms:Encrypt` и `kms:Decrypt` для ключа. Доступ вашего принципала к ключу проверяется при прикреплении, в дополнение к принципалу службы.
* Необязательно, для селектора ключей в Claude Console: `kms:ListKeys` и `kms:DescribeKey` для принципала, с которым вы входите. Без них вставьте ARN ключа вместо этого.

### Создание ключа KMS

Политика ключа содержит три оператора: оператор корневого администратора вашей учётной записи; оператор, позволяющий принципалу службы Claude Platform on AWS шифровать, дешифровать и генерировать ключи данных; и отдельный оператор для `kms:DescribeKey`. Криптографический оператор содержит необязательное условие `EncryptionContext`, которое привязывает ключ к перечисленным вами рабочим пространствам. `DescribeKey` предоставляется отдельно, поскольку у него нет параметра `EncryptionContext`, поэтому условие `EncryptionContext` для этого действия всегда приводило бы к отказу.

Если вы планируете использовать показанное здесь необязательное условие `EncryptionContext`, сначала создайте рабочее пространство (без ключа), скопируйте его идентификатор отсека и подставьте его вместо `<compartment-uuid>`. Чтобы найти идентификатор в Claude Console, перейдите на страницу [Data retention](https://platform.claude.com/settings/privacy) (`platform.claude.com/settings/privacy`) и выберите рабочее пространство в раскрывающемся меню в верхней части страницы. Идентификатор находится в разделе **Encryption key**, в поле **Compartment ID**. Вы также можете прочитать его из поля `compartment_id`, возвращаемого эндпоинтом [Get Workspace](https://platform.claude.com/docs/ru/api/organization/workspaces/retrieve). Если вы не планируете использовать условие, удалите блок `Condition` из этого оператора.

```bash
export YOUR_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)

aws kms create-key \
  --region <workspace-region> \
  --description "Anthropic CMEK (Claude Platform on AWS)" \
  --key-usage ENCRYPT_DECRYPT \
  --policy "{
    \"Version\": \"2012-10-17\",
    \"Statement\": [
      {
        \"Sid\": \"AccountRootAdmin\",
        \"Effect\": \"Allow\",
        \"Principal\": {\"AWS\": \"arn:aws:iam::${YOUR_ACCOUNT}:root\"},
        \"Action\": \"kms:*\",
        \"Resource\": \"*\"
      },
      {
        \"Sid\": \"AllowClaudePlatformOnAWSCrypto\",
        \"Effect\": \"Allow\",
        \"Principal\": {\"Service\": \"aws-external-anthropic.amazonaws.com\"},
        \"Action\": [\"kms:Encrypt\", \"kms:Decrypt\", \"kms:GenerateDataKey\"],
        \"Resource\": \"*\",
        \"Condition\": {
          \"StringEquals\": {
            \"kms:EncryptionContext:anthropic:compartment_uuid\": [
              \"<compartment-uuid>\"
            ]
          }
        }
      },
      {
        \"Sid\": \"AllowClaudePlatformOnAWSDescribe\",
        \"Effect\": \"Allow\",
        \"Principal\": {\"Service\": \"aws-external-anthropic.amazonaws.com\"},
        \"Action\": \"kms:DescribeKey\",
        \"Resource\": \"*\"
      }
    ]
  }"
```

Захватите `KeyMetadata.Arn` из вывода. Он понадобится вам при регистрации ключа.

Условие `EncryptionContext` необязательно. Каждый вызов шифрования, дешифрования и генерации ключа данных, выполняемый для рабочего пространства, включая проверку во время прикрепления, передаёт идентификатор отсека этого рабочего пространства как `anthropic:compartment_uuid`, поэтому в условии перечисляются идентификаторы отсеков всех рабочих пространств, к которым вы прикрепляете ключ, и запись из одних нулей не нужна. Добавление условия также привязывает ключ к перечисленным рабочим пространствам на уровне IAM. Поскольку идентификатор отсека появляется только после создания рабочего пространства, порядок действий такой: создайте рабочее пространство, укажите его идентификатор отсека в условии (при создании ключа или позже с помощью `kms:PutKeyPolicy`), затем прикрепите ключ. Перед прикреплением ключа к каждому дополнительному рабочему пространству таким же образом добавьте идентификатор отсека этого рабочего пространства. Чтобы начать без условия, удалите блок `Condition` из оператора `AllowClaudePlatformOnAWSCrypto`; если вы добавите его позже, включите идентификаторы отсеков всех рабочих пространств, к которым ключ уже прикреплён.

Вы можете дополнительно ограничить оба оператора принципала службы условием `aws:SourceArn`. Служба передаёт [ARN рабочего пространства](https://platform.claude.com/docs/ru/api/claude-platform-on-aws-iam-actions#service-details) (`arn:aws:aws-external-anthropic:<region>:<account-id>:workspace/<workspace-id>`) в качестве исходного ARN при каждом вызове, который она выполняет с вашим ключом, поэтому `"ArnLike": {"aws:SourceArn": "arn:aws:aws-external-anthropic:*:<account-id>:workspace/*"}` ограничивает предоставленный доступ рабочими пространствами в вашей собственной учётной записи AWS, а список полных ARN рабочих пространств ограничивает его этими рабочими пространствами. Это условие не обязательно; условие `EncryptionContext` само по себе привязывает ключ к перечисленным вами рабочим пространствам.

Вы также можете создать ключ из AWS Console: выберите симметричный ключ с использованием для шифрования и дешифрования, однорегиональный ключ и происхождение материала ключа KMS, в регионе рабочего пространства. Оставьте разрешения на использование ключа пустыми в мастере создания ключа, затем откройте вкладку **Key policy** ключа и замените JSON политикой, показанной здесь.

### Регистрация и прикрепление ключа

<Steps>
  <Step title="Зарегистрируйте ключ">
    В Claude Console перейдите на страницу [Data retention](https://platform.claude.com/settings/privacy#encryption-keys) (`platform.claude.com/settings/privacy`). Если вы не видите **Encryption keys**, выберите **Organization** в раскрывающемся меню в верхней части страницы. В разделе **Encryption keys** нажмите **Add key**. Введите отображаемое имя, затем выберите ключ в селекторе ключей или выберите **Enter ARN manually** и вставьте ARN ключа, после чего нажмите **Add**. Ключ должен находиться в учётной записи AWS, в которой размещена ваша организация; межаккаунтные ключи не поддерживаются. Селектор показывает включённые, управляемые клиентом, симметричные, однорегиональные ключи в вашей учётной записи в одном из регионов вашей организации; для ключа, которого нет в списке, введите ARN. Ключи отображаются в списке, только если принципал, с которым вы вошли, может вызывать `kms:ListKeys` и `kms:DescribeKey`.
  </Step>

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

    Именно тогда ключ проверяется: вызов прикрепления проверяет доступ вашего принципала к ключу и выполняет цикл шифрования/дешифрования для него с идентификатором отсека рабочего пространства в качестве контекста шифрования, поэтому проблема либо с политикой ключа, либо с разрешениями вашего принципала проявляется как ошибка при этом вызове. Если прикрепление не проходит с ошибкой доступа KMS, проверьте следующее:

    * Политика ключа называет принципал службы `aws-external-anthropic.amazonaws.com` и предоставляет `kms:Encrypt`, `kms:Decrypt` и `kms:GenerateDataKey`, плюс `kms:DescribeKey` в отдельном операторе, который не имеет условия `EncryptionContext`.
    * Любое условие `EncryptionContext` включает идентификатор отсека этого рабочего пространства, а любое добавленное вами условие `aws:SourceArn` соответствует ARN этого рабочего пространства.
    * Ключ включён, однорегиональный и в той же учётной записи и регионе AWS, что и рабочее пространство.
    * Принципал, под которым вы вошли, имеет `kms:DescribeKey`, `kms:Encrypt` и `kms:Decrypt` для ключа.
    * Никакая политика управления службами или политика управления ресурсами в вашей организации AWS не препятствует принципалу службы или вашему принципалу использовать ключ.
    * Если политика выглядит правильно, а прикрепление всё равно не проходит, найдите отклонённое событие `kms:` в CloudTrail в учётной записи ключа (в нём указаны вызывающий принципал и, для криптографических вызовов, контекст шифрования), затем исправьте условие с помощью `kms:PutKeyPolicy` и повторите попытку.
  </Step>
</Steps>

## Terraform

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