Claude Platform Docs
АдминистрированиеКлючи шифрования

Настройка AWS KMS для CMEK

Используйте AWS KMS, чтобы предоставить ключ шифрования для вашей организации.

Configure with the /claude-api skill in Claude Code
claude "/claude-api help me configure a customer-managed encryption key with AWS KMS"

В этом руководстве описывается настройка ключа AWS KMS в качестве «customer-managed encryption key» (ключа шифрования, управляемого клиентом), или CMEK для вашей организации Anthropic.

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

  • Учётная запись AWS с разрешениями на создание ключей KMS и установку политик ключей (kms:CreateKey и kms:PutKeyPolicy).
  • Ключ Admin API Anthropic для вашей организации.
  • Установленный и аутентифицированный AWS CLI.

Amazon Resource Name (ARN) для Anthropic

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

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

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

  1. Создайте ключ KMS с межаккаунтной политикой ключа

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

    1. Администратор root учётной записи: стандартный шаблон KMS. Ваша учётная запись сохраняет полный административный контроль.
    2. Шифрование и расшифровка для Anthropic: действия kms:Encrypt и kms:Decrypt, которые Anthropic использует для шифрования и расшифровки ключей данных, защищающих данные вашего рабочего пространства («envelope encryption» — конвертное шифрование).
    3. Describe для Anthropic: чтение метаданных, которое Anthropic выполняет при запуске. Оно предоставляется отдельно, поскольку у DescribeKey нет параметра EncryptionContext, поэтому условие EncryptionContext для этого действия всегда приводило бы к отказу.
    export YOUR_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
    
    aws kms create-key \
      --region <region> \
      --description "Anthropic CMEK" \
      --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\": \"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:compartment_uuid\": [
                  \"00000000-0000-0000-0000-000000000000\",
                  \"<compartment-uuid>\"
                ]
              }
            }
          },
          {
            \"Sid\": \"AllowAnthropicCMEKDescribe\",
            \"Effect\": \"Allow\",
            \"Principal\": {\"AWS\": \"arn:aws:iam::915198916910:role/anthropic-cmek-client-us\"},
            \"Action\": \"kms:DescribeKey\",
            \"Resource\": \"*\"
          }
        ]
      }"

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

    Условие EncryptionContext рекомендуется, но не является обязательным. Anthropic всегда включает идентификатор компартмента (compartment ID) вашего рабочего пространства в контекст шифрования, поэтому шифротекст в любом случае криптографически привязан к этому компартменту. Добавление условия обеспечивает эшелонированную защиту (defense-in-depth) на уровне IAM. Чтобы начать без него, опустите блок Condition в операторе AllowAnthropicCMEKCrypto и добавьте его позже с помощью kms:PutKeyPolicy.

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

    Мастер AWS KMS Create key на шаге Configure key с выбранными типом ключа Symmetric, использованием ключа Encrypt and decrypt и Single-Region key.
    Configure key (настройка ключа): symmetric (симметричный), encrypt and decrypt (шифрование и расшифровка), single-region key (однорегиональный ключ).
    Шаг AWS KMS Add labels с псевдонимом anthropic-cmek и описанием Anthropic CMEK.
    Добавьте псевдоним (alias) и описание (description) для ключа.
    Шаг AWS KMS Define key administrative permissions со списком ролей IAM, которые могут администрировать ключ.
    Define key administrative permissions (определение административных разрешений ключа) — необязательно. Ваша учётная запись сохраняет полный административный контроль.
    Шаг AWS KMS Define key usage permissions с идентификатором учётной записи Anthropic, введённым в разделе Other AWS accounts.
    Не добавляйте здесь идентификатор учётной записи Anthropic. Этот шаг мастера создаёт политику с избыточными разрешениями. Оставьте usage permissions (разрешения на использование) пустыми и отредактируйте JSON Key policy (политики ключа) после создания (см. предыдущую политику ключа).

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

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

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

    Создайте конфигурацию внешнего ключа через Admin API.

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

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

    {
      "type": "external_key",
      "id": "ekey_<id>",
      "display_name": "<friendly-name>"
    }
  2. Выполните валидацию ключа

    Запустите цикл шифрования и расшифровки с использованием вашего ключа.

    client = anthropic.Anthropic()
    
    validation = client.beta.organization.external_keys.validate("ekey_<id>")
    
    print(f"status: {validation.status}")
    print(f"error: {validation.error}")

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

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

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

    • Несоответствие контекста шифрования: Валидация не проходит, в то время как трафик данных работает (или наоборот), с непрозрачной ошибкой AccessDeniedException, когда условие kms:EncryptionContext:anthropic:compartment_uuid разрешает только одно из двух значений, которые отправляет Anthropic. Валидация отправляет UUID из одних нулей (00000000-0000-0000-0000-000000000000); рабочий трафик отправляет идентификатор компартмента привязанного рабочего пространства. Убедитесь, что в условии указаны оба. Чтобы полностью исключить условие как причину, временно удалите блок Condition из оператора AllowAnthropicCMEKCrypto и повторите валидацию.
    • Политики управления ресурсами (RCP): Если в вашей организации AWS есть RCP, запрещающая операции KMS, когда aws:PrincipalOrgID не совпадает с вашей организацией, она блокирует межаккаунтную роль Anthropic. В RCP необходимо исключение для этого ключа или для ARN роли Anthropic. Политики управления сервисами (SCP) здесь не применяются, поскольку они не оцениваются для внешних принципалов, выполняющих вызовы через политики на основе ресурсов.
    • Доступ предоставлен через IAM вместо политики ключа: Межаккаунтный доступ к KMS должен быть предоставлен в самой политике ключа, а не через политику IAM в вашей учётной записи. Проверьте с помощью aws kms get-key-policy --key-id <id> --policy-name default.
    • Несоответствие региона: Убедитесь, что регион ключа — один из тех, в которых Anthropic работает для настроенного вами географического уровня.
  3. Привяжите ключ к рабочему пространству

    После валидации ключа привяжите его к новому рабочему пространству, прежде чем отправлять какие-либо запросы в это рабочее пространство. Для рабочего пространства, которое уже получает запросы, вступление ключа в силу может занять до одного дня.

    client = anthropic.Anthropic()
    
    workspace = client.beta.organization.workspaces.update(
        "<workspace-id>", external_key_id="ekey_<id>"
    )
    
    print(f"id: {workspace.id}")
    print(f"external_key_id: {workspace.external_key_id}")

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

На Claude Platform on AWS CMEK использует только ключи AWS KMS, и настройка отличается от предыдущих разделов следующим образом:

  • Принципал: Ваша политика ключа предоставляет доступ сервисному принципалу AWS aws-external-anthropic.amazonaws.com. Роль IAM и идентификатор учётной записи Anthropic не используются, поэтому ARN для Anthropic не применяется.
  • Требования к ключу: Ключ должен быть симметричным ключом KMS с использованием для шифрования и расшифровки, однорегиональным и находиться в той же учётной записи AWS и регионе, что и рабочее пространство, к которому вы его привязываете. Межаккаунтные ключи не поддерживаются: ключ должен находиться в учётной записи AWS, в которой размещена ваша организация. Мультирегиональные ключи (идентификаторы ключей, начинающиеся с mrk-) и ARN псевдонимов отклоняются при регистрации ключа; используйте ARN ключа.
  • Нет отдельного шага валидации: Помимо этих проверок ARN ключа при регистрации, ключ проходит валидацию при привязке к рабочему пространству. Вызов привязки выполняет цикл шифрования/расшифровки с использованием ключа с идентификатором компартмента этого рабочего пространства в качестве контекста шифрования, поэтому проблема с политикой ключа проявляется во время привязки, а не при регистрации. В отличие от политики Claude Platform, приведённой ранее на этой странице, условию EncryptionContext поэтому не нужна запись из одних нулей.
  • Где вы управляете ключами: Регистрируйте и привязывайте ключи в Claude Console, войдя через AWS с ролью Admin. Конечные точки внешних ключей также доступны на Claude Platform on AWS с авторизацией через действия IAM; там ключ идентифицируется по ARN ключа KMS, а не по идентификатору ekey_.

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

  • Учётная запись AWS, в которой размещена ваша организация Claude Platform on AWS, с разрешениями на создание ключей KMS и установку политик ключей (kms:CreateKey и kms:PutKeyPolicy).
  • Роль Admin в Claude Console для Claude Platform on AWS. См. Использование Claude Console.
  • Для принципала IAM, с которым вы входите в Claude Console: помимо aws-external-anthropic:AssumeConsole, действия IAM для операций, которые вы там выполняете, поскольку страница Encryption keys и привязка ключа проходят через шлюз AWS. Регистрация ключа — это RegisterKeyListKeys и GetKey для просмотра регистраций), а привязка — UpdateWorkspace или CreateWorkspace. Действия с внешними ключами (и CreateWorkspace) имеют область действия учётной записи, поэтому предоставляйте их на Resource: "*"; политика, ограниченная ARN рабочих пространств, их не включает.
  • Для принципала IAM, который привязывает ключ к рабочему пространству (идентичность, с которой вы вошли в Claude Console): kms:DescribeKey, kms:Encrypt и kms:Decrypt для ключа. Доступ вашего принципала к ключу проверяется при привязке, в дополнение к доступу сервисного принципала.
  • Необязательно, для средства выбора ключа в Claude Console: kms:ListKeys и kms:DescribeKey для принципала, с которым вы входите. Без них вместо этого вставьте ARN ключа.

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

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

Если вы планируете использовать необязательное условие EncryptionContext, показанное здесь, сначала создайте рабочее пространство (без ключа) и скопируйте его идентификатор компартмента из Claude Console в разделе Workspace > Security, в блоке Encryption key (поле Compartment ID), или из поля compartment_id, возвращаемого конечной точкой Get Workspace. Подставьте его вместо <compartment-uuid>. В противном случае удалите запись StringEquals из блока Condition этого оператора и оставьте запись ArnLike.

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\": {
          \"ArnLike\": {
            \"aws:SourceArn\": \"arn:aws:aws-external-anthropic:*:${YOUR_ACCOUNT}:workspace/*\"
          },
          \"StringEquals\": {
            \"kms:EncryptionContext:anthropic:compartment_uuid\": [
              \"<compartment-uuid>\"
            ]
          }
        }
      },
      {
        \"Sid\": \"AllowClaudePlatformOnAWSDescribe\",
        \"Effect\": \"Allow\",
        \"Principal\": {\"Service\": \"aws-external-anthropic.amazonaws.com\"},
        \"Action\": \"kms:DescribeKey\",
        \"Resource\": \"*\",
        \"Condition\": {
          \"ArnLike\": {
            \"aws:SourceArn\": \"arn:aws:aws-external-anthropic:*:${YOUR_ACCOUNT}:workspace/*\"
          }
        }
      }
    ]
  }"

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

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

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

Регистрация и привязка ключа

  1. Зарегистрируйте ключ

    В Claude Console откройте Settings > Encryption keys и нажмите Add key. Введите отображаемое имя, затем выберите ключ в средстве выбора ключа или выберите Enter ARN manually и вставьте ARN ключа, и нажмите Add. Ключ должен находиться в учётной записи AWS, в которой размещена ваша организация; межаккаунтные ключи не поддерживаются. Средство выбора отображает включённые, управляемые клиентом, симметричные, однорегиональные ключи в вашей учётной записи в одном из регионов вашей организации; для ключа, которого нет в списке средства выбора, введите ARN. Оно отображает ключи только в том случае, если принципал, с которым вы вошли, может вызывать kms:ListKeys и kms:DescribeKey.

  2. Привяжите ключ к рабочему пространству

    Привяжите ключ к новому рабочему пространству, прежде чем отправлять какие-либо запросы в это рабочее пространство. Для рабочего пространства, которое уже получает запросы, вступление ключа в силу может занять до одного дня. В Claude Console откройте рабочее пространство и в разделе Security выберите ключ в поле Encryption key, сохраните и подтвердите. Вы также можете выбрать ключ при создании рабочего пространства в Claude Console, но только если ваша политика ключа ещё не указывает конкретные рабочие пространства (нет условия EncryptionContext, и используется шаблон aws:SourceArn для всей учётной записи, а не отдельные ARN рабочих пространств), поскольку идентификатор рабочего пространства и идентификатор компартмента назначаются при создании. После привязки ключ рабочего пространства изменить нельзя.

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

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

Terraform

Для развёртываний в формате «infrastructure-as-code» (инфраструктура как код) те же шаги соответствуют провайдеру aws с ресурсами aws_kms_key и aws_kms_alias.

Was this page helpful?