Claude Platform Docs
관리자암호화 키

CMEK용 AWS KMS 구성

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 키를 Anthropic 조직의 customer-managed encryption key(고객 관리형 암호화 키), 즉 CMEK로 구성하는 과정을 안내합니다.

사전 요구 사항

  • KMS 키를 생성하고 키 정책을 설정할 수 있는 권한(kms:CreateKeykms:PutKeyPolicy)이 있는 AWS 계정.
  • 조직의 Anthropic Admin API 키.
  • 설치 및 인증이 완료된 AWS CLI.

Anthropic용 Amazon Resource Name(ARN)

Anthropic이 여러분의 암호화 키를 사용하도록 하려면, Anthropic의 IAM 역할에 데이터 암호화에 사용할 수 있는 KMS 키를 제공해야 합니다. Anthropic CMEK의 ARN은 다음과 같습니다:

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

암호화 키 설정

  1. 교차 계정 키 정책으로 KMS 키 생성

    키 정책은 Anthropic의 IAM 역할에 교차 계정 액세스 권한을 부여합니다. 세 개의 문(statement)이 필요합니다:

    1. 계정 루트 관리자: 표준 KMS 패턴입니다. 여러분의 계정이 전체 관리 제어 권한을 유지합니다.
    2. Anthropic 암호화 및 복호화: kms:Encryptkms:Decrypt 작업으로, Anthropic이 워크스페이스 데이터를 보호하는 데이터 키를 암호화하고 복호화하는 데 사용합니다(envelope encryption, 봉투 암호화).
    3. Anthropic describe: 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를 암호화 컨텍스트에 포함하므로, 암호문은 조건 유무와 관계없이 해당 compartment에 암호학적으로 바인딩됩니다. 조건을 추가하면 IAM 계층에서 심층 방어(defense-in-depth)를 제공합니다. 조건 없이 시작하려면 AllowAnthropicCMEKCrypto 문에서 Condition 블록을 생략하고 나중에 kms:PutKeyPolicy로 추가하세요.

    AWS Console에서 키를 생성할 수도 있습니다. 암호화 및 복호화 키 사용 용도의 대칭 키, 단일 리전 키, KMS 키 구성 요소 오리진을 선택하세요. Create-key 마법사는 Review 단계에서 키 정책을 커밋합니다. 해당 단계의 키 사용 권한에 Anthropic의 계정 ID 915198916910을 추가하면, 생성된 정책은 EncryptionContext 조건 없이 Anthropic 계정 전체에 더 광범위한 작업(예: kms:ReEncrypt*kms:GenerateDataKey*)을 부여하며, 이 정책에 대해서도 검증은 여전히 성공합니다. 과도하게 허용적인 키를 남기지 않으려면 관리 권한만으로 마법사를 완료한 다음, 키의 Key policy 탭을 열고 JSON을 앞서 보여드린 역할 범위 정책(anthropic-cmek-client-us 역할로 범위가 지정되고 EncryptionContext 조건이 포함된 세 개의 문)으로 교체하세요.

    Configure key 단계의 AWS KMS Create key 마법사. Symmetric 키 유형, Encrypt and decrypt 키 사용, Single-Region key가 선택되어 있습니다.
    Configure key(키 구성): symmetric(대칭), encrypt and decrypt(암호화 및 복호화), single-region key(단일 리전 키).
    별칭이 anthropic-cmek이고 설명이 Anthropic CMEK인 AWS KMS Add labels 단계.
    키의 alias(별칭)와 description(설명)을 추가합니다.
    키를 관리할 수 있는 IAM 역할을 나열하는 AWS KMS Define key administrative permissions 단계.
    Define key administrative permissions(키 관리 권한 정의, 선택 사항). 여러분의 계정이 전체 관리 제어 권한을 유지합니다.
    Other AWS accounts 아래에 Anthropic의 계정 ID가 입력된 AWS KMS Define key usage permissions 단계.
    여기에 Anthropic의 계정 ID를 추가하지 마세요. 이 마법사 단계는 과도하게 허용적인 정책을 생성합니다. usage permissions(사용 권한)를 비워 두고 생성 후 Key policy JSON을 편집하세요(앞의 키 정책 참조).

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

    응답에는 외부 키 ID가 포함됩니다:

    {
      "type": "external_key",
      "id": "ekey_<id>",
      "display_name": "<friendly-name>"
    }
  2. 키 검증

    키에 대해 암호화 및 복호화 왕복(round-trip)을 트리거합니다.

    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 }

    검증이 실패하는 경우 일반적인 원인은 다음과 같습니다:

    • 암호화 컨텍스트 불일치: kms:EncryptionContext:anthropic:compartment_uuid 조건이 Anthropic이 전송하는 두 값 중 하나만 허용하는 경우, 불투명한 AccessDeniedException과 함께 검증은 실패하지만 데이터 트래픽은 작동합니다(또는 그 반대). 검증은 모두 0인 UUID(00000000-0000-0000-0000-000000000000)를 전송하고, 실제 트래픽은 연결된 워크스페이스의 compartment ID를 전송합니다. 조건에 두 값이 모두 나열되어 있는지 확인하세요. 조건을 완전히 배제하려면 AllowAnthropicCMEKCrypto 문에서 Condition 블록을 일시적으로 제거하고 다시 검증하세요.
    • 리소스 제어 정책(RCP): AWS 조직에 aws:PrincipalOrgID가 여러분의 조직과 일치하지 않을 때 KMS 작업을 거부하는 RCP가 있으면, Anthropic의 교차 계정 역할이 차단됩니다. RCP에 이 키 또는 Anthropic의 역할 ARN에 대한 예외가 필요합니다. 서비스 제어 정책은 리소스 기반 정책을 통해 호출하는 외부 주체에 대해서는 평가되지 않으므로 여기에는 적용되지 않습니다.
    • 키 정책 대신 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}")

Claude Platform on AWS에서 CMEK 설정

Claude Platform on AWS에서 CMEK는 AWS KMS 키만 사용하며, 설정은 앞의 섹션과 다음과 같은 점에서 다릅니다:

  • 주체: 키 정책은 AWS 서비스 주체 aws-external-anthropic.amazonaws.com에 액세스 권한을 부여합니다. Anthropic의 IAM 역할과 계정 ID는 사용되지 않으므로 Anthropic용 ARN은 적용되지 않습니다.
  • 키 요구 사항: 키는 암호화 및 복호화 용도의 대칭 KMS 키여야 하며, 단일 리전이어야 하고, 연결하는 워크스페이스와 동일한 AWS 계정 및 리전에 있어야 합니다. 교차 계정 키는 지원되지 않습니다. 키는 조직을 호스팅하는 AWS 계정에 있어야 합니다. 다중 리전 키(mrk-로 시작하는 키 ID)와 별칭 ARN은 키 등록 시 거부됩니다. 키 ARN을 사용하세요.
  • 별도의 검증 단계 없음: 등록 시 키 ARN에 대한 이러한 확인 외에, 키는 워크스페이스에 연결할 때 검증됩니다. 연결 호출은 해당 워크스페이스의 compartment ID를 암호화 컨텍스트로 사용하여 키에 대해 암호화/복호화 라운드를 수행하므로, 키 정책 문제는 등록 시가 아니라 연결 시에 드러납니다. 따라서 이 페이지 앞부분의 Claude Platform 정책과 달리 EncryptionContext 조건에 모두 0인 항목이 필요하지 않습니다.
  • 키 관리 위치: Admin 역할로 AWS를 통해 로그인한 Claude Console에서 키를 등록하고 연결합니다. 외부 키 엔드포인트는 Claude Platform on AWS에서도 사용할 수 있으며 IAM 작업을 통해 권한이 부여됩니다. 여기서 키는 ekey_ ID가 아닌 KMS 키 ARN으로 식별됩니다.

사전 요구 사항

  • Claude Platform on AWS 조직을 호스팅하는 AWS 계정으로, KMS 키를 생성하고 키 정책을 설정할 수 있는 권한(kms:CreateKeykms:PutKeyPolicy)이 있어야 합니다.
  • Claude Platform on AWS용 Claude Console의 Admin 역할. Claude Console 사용을 참조하세요.
  • Claude Console에 로그인하는 IAM 주체의 경우: aws-external-anthropic:AssumeConsole 외에, Encryption keys 페이지와 키 연결이 AWS 게이트웨이를 거치므로 거기서 수행하는 작업에 대한 IAM 작업이 필요합니다. 키 등록은 RegisterKey(등록을 보려면 ListKeysGetKey)이고, 연결은 UpdateWorkspace 또는 CreateWorkspace입니다. 외부 키 작업(및 CreateWorkspace)은 계정 범위이므로 Resource: "*"에 부여하세요. 워크스페이스 ARN으로 제한된 정책에는 포함되지 않습니다.
  • 워크스페이스에 키를 연결하는 IAM 주체(Claude Console에 로그인한 ID)의 경우: 키에 대한 kms:DescribeKey, kms:Encrypt, kms:Decrypt. 연결 시 서비스 주체의 액세스 외에 여러분 주체의 키 액세스도 확인됩니다.
  • 선택 사항, Claude Console의 키 선택기용: 로그인하는 주체에 대한 kms:ListKeyskms:DescribeKey. 이 권한이 없으면 대신 키 ARN을 붙여넣으세요.

KMS 키 생성

키 정책에는 세 개의 문이 있습니다. 계정의 루트 관리자 문, Claude Platform on AWS 서비스 주체가 암호화, 복호화 및 데이터 키 생성을 할 수 있게 하는 문, 그리고 kms:DescribeKey를 위한 별도의 문입니다. 두 서비스 주체 문 모두 권장되는 aws:SourceArn 조건을 포함합니다. 서비스는 특정 워크스페이스를 대신하여 키를 호출하고 해당 워크스페이스의 ARN을 소스 ARN으로 전달하므로, 표시된 패턴은 권한 부여를 여러분 자신의 AWS 계정에 있는 워크스페이스로 제한합니다. DescribeKey에는 EncryptionContext 매개변수가 없어 해당 작업에 EncryptionContext 조건을 걸면 항상 거부되므로 별도로 부여합니다.

여기에 표시된 선택적 EncryptionContext 조건을 사용할 계획이라면, 먼저 워크스페이스를 (키 없이) 생성하고 Claude Console의 Workspace > Security에서 Encryption key 아래(Compartment ID 필드)에서, 또는 Get Workspace 엔드포인트가 반환하는 compartment_id 필드에서 compartment ID를 복사하세요. <compartment-uuid>를 해당 값으로 대체하세요. 그렇지 않으면 해당 문의 Condition 블록에서 StringEquals 항목을 삭제하고 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 조건도 선택 사항입니다. 연결 시 확인을 포함하여 워크스페이스에 대해 수행되는 모든 암호화, 복호화 및 데이터 키 호출은 해당 워크스페이스의 compartment ID를 anthropic:compartment_uuid로 전달하므로, 조건에는 키를 연결하는 각 워크스페이스의 compartment ID를 나열하며 모두 0인 항목은 필요하지 않습니다. 이를 추가하면 IAM 계층에서도 키가 나열한 워크스페이스에 바인딩됩니다. compartment ID는 워크스페이스가 존재해야만 존재하므로 순서는 다음과 같습니다. 워크스페이스를 생성하고, 해당 compartment ID를 조건에 넣고(키 생성 시 또는 나중에 kms:PutKeyPolicy로), 그런 다음 키를 연결합니다. 각 추가 워크스페이스에 키를 연결하기 전에 같은 방식으로 해당 워크스페이스의 compartment ID를 추가하세요. 조건 없이 시작하려면 AllowClaudePlatformOnAWSCrypto 문의 Condition 블록에서 StringEquals 항목을 삭제하세요. 나중에 추가하는 경우 키가 이미 연결된 모든 워크스페이스의 compartment ID를 포함하세요.

AWS Console에서 키를 생성할 수도 있습니다. 워크스페이스의 리전에서 암호화 및 복호화 키 사용 용도의 대칭 키, 단일 리전 키, KMS 키 구성 요소 오리진을 선택하세요. Create-key 마법사에서 키 사용 권한을 비워 둔 다음, 키의 Key policy 탭을 열고 JSON을 여기에 표시된 정책으로 교체하세요.

키 등록 및 연결

  1. 키 등록

    Claude Console에서 Settings > Encryption keys를 열고 Add key를 클릭하세요. 표시 이름을 입력한 다음, 키 선택기에서 키를 선택하거나 Enter ARN manually를 선택하여 키 ARN을 붙여넣고 Add를 클릭하세요. 키는 조직을 호스팅하는 AWS 계정에 있어야 하며, 교차 계정 키는 지원되지 않습니다. 선택기는 조직의 리전 중 하나에 있는 여러분 계정의 활성화된 고객 관리형 대칭 단일 리전 키를 나열합니다. 선택기에 나열되지 않는 키는 ARN을 입력하세요. 로그인한 주체가 kms:ListKeyskms:DescribeKey를 호출할 수 있는 경우에만 키가 나열됩니다.

  2. 워크스페이스에 키 연결

    해당 워크스페이스에 요청을 보내기 전에 새 워크스페이스에 키를 연결하세요. 이미 요청을 받고 있는 워크스페이스의 경우 키가 적용되기까지 최대 하루가 걸릴 수 있습니다. Claude Console에서 워크스페이스를 열고 Security 아래의 Encryption key에서 키를 선택한 후 저장하고 확인하세요. Claude Console에서 워크스페이스를 생성할 때 키를 선택할 수도 있지만, 워크스페이스의 ID와 compartment ID는 생성 시 할당되므로 키 정책이 아직 특정 워크스페이스를 지정하지 않은 경우(EncryptionContext 조건이 없고, 개별 워크스페이스 ARN이 아닌 계정 전체 aws:SourceArn 패턴인 경우)에만 가능합니다. 연결된 후에는 워크스페이스의 키를 변경할 수 없습니다.

    이때 키가 검증됩니다. 연결 호출은 여러분 주체의 키 액세스를 확인하고 워크스페이스의 compartment ID를 암호화 컨텍스트로 사용하여 키에 대해 암호화/복호화 라운드를 수행하므로, 키 정책이나 여러분 주체의 권한 문제는 해당 호출의 오류로 드러납니다. 연결이 KMS 액세스 오류로 실패하면 다음을 확인하세요:

    • 키 정책이 aws-external-anthropic.amazonaws.com 서비스 주체를 지정하고 kms:Encrypt, kms:Decrypt, kms:GenerateDataKey를 부여하며, EncryptionContext 조건이 없는 별도의 문에서 kms:DescribeKey를 부여하는지.
    • aws:SourceArn 조건이 이 워크스페이스의 ARN(여러분의 계정 ID, 그리고 특정 ARN을 나열한 경우 워크스페이스)과 일치하고, EncryptionContext 조건이 있다면 이 워크스페이스의 compartment ID를 포함하는지.
    • 키가 활성화되어 있고, 단일 리전이며, 워크스페이스와 동일한 AWS 계정 및 리전에 있는지.
    • 로그인한 주체가 키에 대한 kms:DescribeKey, kms:Encrypt, kms:Decrypt를 가지고 있는지.
    • AWS 조직의 서비스 제어 정책이나 리소스 제어 정책이 서비스 주체 또는 여러분의 주체가 키를 사용하는 것을 막지 않는지.
    • 정책이 올바르게 보이는데도 연결이 계속 실패하면, 키 계정의 CloudTrail에서 거부된 kms: 이벤트를 찾은 다음(호출 주체와, 암호화 호출의 경우 암호화 컨텍스트가 표시됨), aws:SourceArn 조건을 일시적으로 제거하고 다시 시도하여 소스 ARN 불일치와 암호화 컨텍스트 불일치를 구분하세요.

Terraform

코드형 인프라(infrastructure-as-code) 배포의 경우, 동일한 단계가 aws_kms_keyaws_kms_alias 리소스를 사용하는 aws 프로바이더에 매핑됩니다.

Was this page helpful?