디렉터리 버킷에서 AWS KMS 키(SSE-KMS)를 사용한 서버 측 암호화

디렉터리 버킷에서 AWS KMS 키(SSE-KMS)를 사용한 서버 측 암호화 (Using server-side encryption with AWS KMS keys (SSE-KMS) in directory buckets)

AWS KMS의 보안 제어 기능은 암호화 관련 규정 준수 요구 사항을 충족하는 데 도움이 돼요. 디렉터리 버킷이 AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS)를 사용하도록 구성하고, 이 KMS 키로 Amazon S3 디렉터리 버킷의 데이터를 보호하도록 선택할 수 있어요. SSE-KMS에 대한 자세한 내용은 AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용하기 를 참고하세요.

출처: 문서

본문

권한

AWS KMS 키로 암호화된 객체를 Amazon S3에 업로드하거나 Amazon S3에서 다운로드하려면 해당 키에 대한 kms:GenerateDataKey와 kms:Decrypt 권한이 필요해요. 자세한 내용은 AWS Key Management Service Developer Guide의 키 사용자가 암호화 작업에 KMS 키를 사용하도록 허용 을 참고하세요. 멀티파트 업로드에 필요한 AWS KMS 권한에 대한 정보는 멀티파트 업로드 API 및 권한 을 참고하세요.

SSE-KMS용 KMS 키에 대한 자세한 내용은 AWS KMS(SSE-KMS)를 사용한 서버 측 암호화 지정 을 참고하세요.

AWS KMS 키

SSE-KMS 구성은 버킷의 수명 동안 디렉터리 버킷당 고객 관리 키(customer managed key) 1개만 지원해요. AWS 관리 키(aws/s3)는 지원되지 않아요. 또한 SSE-KMS에 고객 관리 키를 지정한 뒤에는 버킷의 SSE-KMS 구성용 고객 관리 키를 덮어쓸 수 없어요.

버킷의 SSE-KMS 구성에 지정한 고객 관리 키는 다음과 같이 확인할 수 있어요.

  • HeadObject API 작업 요청을 보내 응답에서 x-amz-server-side-encryption-aws-kms-key-id 값을 찾아요.

데이터에 새 고객 관리 키를 사용하려면 기존 객체를 새 고객 관리 키가 있는 새 디렉터리 버킷으로 복사하는 것을 권장해요.

디렉터리 버킷의 암호화에 AWS KMS 고객 관리 키를 지정할 때는 키 ID나 키 ARN만 사용해야 해요. KMS 키의 별칭(alias) 형식은 지원되지 않아요.

SSE-KMS용 KMS 키에 대한 자세한 내용은 AWS KMS 키 를 참고하세요.

교차 계정 작업에 SSE-KMS 사용하기

디렉터리 버킷에서 교차 계정 작업에 암호화를 사용할 때는 다음을 유의하세요.

  • S3 객체에 교차 계정 접근을 허용하려면 고객 관리 키의 정책을 구성해 다른 계정의 접근을 허용해야 해요.
  • 고객 관리 키를 지정할 때는 정규화된(full qualified) KMS 키 ARN을 사용해야 해요.

Amazon S3 Bucket Keys

S3 Bucket Keys는 디렉터리 버킷의 GET 및 PUT 작업에 항상 활성화되며 비활성화할 수 없어요. CopyObject, UploadPartCopy, Batch Operations의 Copy 작업, 또는 가져오기 작업으로 SSE-KMS 암호화 객체를 일반 용도 버킷과 디렉터리 버킷 사이(또는 디렉터리 버킷 사이)에서 복사할 때는 S3 Bucket Keys가 지원되지 않아요. 이 경우 Amazon S3는 KMS 암호화 객체에 대한 복사 요청이 있을 때마다 AWS KMS에 호출해요.

CopyObject와 UploadPartCopy를 제외한 Zonal 엔드포인트(객체 수준) API 작업은 낮은 지연 시간을 위해 CreateSession으로 요청을 인증하고 권한을 부여해요. 버킷의 기본 암호화가 원하는 암호화 구성으로 설정되어 있도록 하고, CreateSession 요청이나 PUT object 요청에서 버킷 기본 암호화를 덮어쓰지 않는 것을 권장해요. 그러면 새 객체가 원하는 암호화 설정으로 자동 암호화돼요. 디렉터리 버킷의 새 객체를 SSE-KMS로 암호화하려면 KMS 키(구체적으로는 고객 관리 키)와 함께 SSE-KMS를 디렉터리 버킷의 기본 암호화 구성으로 지정해야 해요. 그러면 Zonal 엔드포인트 API 작업용 세션이 생성될 때 세션 중에 새 객체가 SSE-KMS와 S3 Bucket Keys로 자동 암호화·복호화돼요. 디렉터리 버킷의 암호화 덮어쓰기 동작에 대한 자세한 내용은 새 객체 업로드에 AWS KMS를 사용한 서버 측 암호화 지정 을 참고하세요.

S3 Bucket Keys는 Amazon S3 내에서 제한된 기간 동안 사용되어, Amazon S3가 암호화 작업을 완료하기 위해 AWS KMS에 요청해야 하는 횟수를 더 줄여줘요. S3 Bucket Keys 사용에 대한 자세한 내용은 Amazon S3 Bucket Keys 와 Amazon S3 Bucket Keys로 SSE-KMS 비용 줄이기 를 참고하세요.

SSE-KMS 요구하기

특정 디렉터리 버킷의 모든 객체에 SSE-KMS를 요구하려면 버킷 정책을 사용할 수 있어요. 예를 들어 CreateSession API 작업으로 새 객체 업로드(PutObject, CopyObject, CreateMultipartUpload) 권한을 부여할 때, CreateSession 요청이 SSE-KMS를 요청하는 x-amz-server-side-encryption-aws-kms-key-id 헤더를 포함하지 않으면 다음 버킷 정책은 모든 사람에게 객체 업로드 권한(s3express:CreateSession)을 거부해요.

{
   "Version":"2012-10-17",
   "Id":"UploadObjectPolicy",
   "Statement":[{
         "Sid":"DenyObjectsThatAreNotSSEKMS",
         "Effect":"Deny",
         "Principal":"*",
         "Action":"s3express:CreateSession",
         "Resource":"arn:aws:s3express:us-east-1:111122223333:bucket/amzn-s3-demo-bucket--usw2-az1--x-s3",
         "Condition":{
            "Null":{
               "s3express:x-amz-server-side-encryption-aws-kms-key-id":"true"
            }
         }
      }
   ]
}

버킷의 객체를 암호화하는 데 특정 AWS KMS 키를 사용하도록 요구하려면 s3express:x-amz-server-side-encryption-aws-kms-key-id 조건 키를 사용할 수 있어요. KMS 키를 지정할 때는 arn:aws:kms:region:acct-id:key/key-id 형식의 키 Amazon Resource Name(ARN)을 사용해야 해요. AWS Identity and Access Management는 s3express:x-amz-server-side-encryption-aws-kms-key-id의 문자열이 실제로 존재하는지 검증하지 않아요. Amazon S3가 객체 암호화에 사용하는 AWS KMS 키 ID는 정책의 AWS KMS 키 ID와 일치해야 하며, 그렇지 않으면 Amazon S3가 요청을 거부해요.

새 객체 업로드에 SSE-KMS를 사용하는 방법에 대한 자세한 내용은 디렉터리 버킷에서 새 객체 업로드에 AWS KMS(SSE-KMS)를 사용한 서버 측 암호화 지정 을 참고하세요.

디렉터리 버킷의 특정 조건 키 전체 목록은 IAM으로 Regional 엔드포인트 API 작업 권한 부여 를 참고하세요.

암호화 컨텍스트

디렉터리 버킷에서 암호화 컨텍스트(encryption context)는 데이터에 대한 상황 정보를 포함하는 키-값 쌍의 집합이에요. 추가 암호화 컨텍스트 값은 지원되지 않아요. 암호화 컨텍스트에 대한 자세한 내용은 암호화 컨텍스트 를 참고하세요.

기본적으로 디렉터리 버킷에 SSE-KMS를 사용하면 Amazon S3는 버킷 Amazon Resource Name(ARN)을 암호화 컨텍스트 쌍으로 사용해요.

arn:aws:s3express:region:account-id:bucket/bucket-base-name--zone-id--x-s3

IAM 정책이나 AWS KMS 키 정책이 암호화 컨텍스트로 버킷 ARN을 사용하도록 확인하세요.

선택적으로 CreateSession 같은 Zonal 엔드포인트 API 요청의 x-amz-server-side-encryption-context 헤더로 명시적인 암호화 컨텍스트 쌍을 제공할 수 있어요. 이 헤더의 값은 키-값 쌍으로 암호화 컨텍스트를 포함하는 UTF-8로 인코딩된 JSON의 Base64 인코딩 문자열이에요. 디렉터리 버킷의 경우 암호화 컨텍스트는 기본 암호화 컨텍스트인 버킷 Amazon Resource Name(ARN)과 일치해야 해요. 또한 암호화 컨텍스트는 암호화되지 않으므로 민감한 정보를 포함하지 않도록 해야 해요.

암호화 컨텍스트를 사용해 암호화 작업을 식별하고 분류할 수 있어요. 또한 기본 암호화 컨텍스트 ARN 값을 사용해 어떤 디렉터리 버킷 ARN이 어떤 암호화 키와 함께 사용되었는지 확인함으로써 AWS CloudTrail에서 관련 요청을 추적할 수 있어요.

CloudTrail 로그 파일의 requestParameters 필드에서 디렉터리 버킷에 SSE-KMS를 사용하면 암호화 컨텍스트 값은 버킷의 ARN이에요.

"encryptionContext": {
    "aws:s3express:arn": "arn:aws:s3:::arn:aws:s3express:region:account-id:bucket/bucket-base-name--zone-id--x-s3"
}

또한 디렉터리 버킷에서 SSE-KMS로 객체를 암호화하면 AWS KMS CloudTrail 이벤트는 객체 ARN 대신 버킷 ARN을 기록해요.

AWS KMS 암호화 객체에 대한 요청 보내기

디렉터리 버킷은 HTTPS(TLS)로만 접근할 수 있어요. 또한 디렉터리 버킷은 AWS Signature Version 4(SigV4)로 요청에 서명해요. AWS KMS 암호화 객체에 대한 요청을 보내는 방법에 대한 자세한 내용은 AWS KMS 암호화 객체에 대한 요청 보내기 를 참고하세요.

객체가 SSE-KMS를 사용한다면 GET 요청과 HEAD 요청에는 암호화 요청 헤더를 보내지 마세요. 그렇지 않으면 HTTP 400 Bad Request 오류가 발생해요.

디렉터리 버킷에서 SSE-KMS 암호화 감사하기

SSE-KMS로 암호화된 데이터에 대한 AWS KMS 키 사용을 감사하려면 AWS CloudTrail 로그를 사용할 수 있어요. GenerateDataKey, Decrypt 같은 암호화 작업에 대한 통찰을 얻을 수 있어요. CloudTrail은 이벤트 이름, 사용자 이름, 이벤트 소스 등 검색을 필터링할 수 있는 다양한 속성 값을 지원해요.

더 알아보기 (Learn more)