AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS)
AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) (Using server-side encryption with AWS KMS keys (SSE-KMS))
AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS)로 S3 객체 데이터를 암호화할 수 있어요. 기본적으로 버킷은 SSE-S3를 사용하지만, SSE-KMS를 사용하도록 구성할 수도 있어요.
출처: 문서
본문
중요 Amazon S3는 이제 Amazon S3 관리 키(SSE-S3)를 사용한 서버 측 암호화를 모든 버킷의 기본 암호화 수준으로 적용해요. 2023년 1월 5일부터 Amazon S3에 업로드되는 모든 새 객체는 추가 비용 없이 성능 영향 없이 자동으로 암호화돼요. S3 버킷 기본 암호화 구성과 새 객체 업로드에 대한 자동 암호화 상태는 CloudTrail 로그, S3 Inventory, S3 Storage Lens, Amazon S3 콘솔, 그리고 AWS CLI 및 AWS SDK의 추가 Amazon S3 API 응답 헤더에서 확인할 수 있어요. 자세한 내용은 기본 암호화 FAQ를 참고하세요.
서버 측 암호화는 데이터를 수신하는 애플리케이션이나 서비스가 대상 지점에서 데이터를 암호화하는 것을 말해요.
Amazon S3는 새 객체 업로드에 대해 Amazon S3 관리 키(SSE-S3)를 사용한 서버 측 암호화를 자동으로 활성화해요.
별도로 지정하지 않으면 버킷은 기본적으로 SSE-S3를 사용해 객체를 암호화해요. 그러나 버킷이 AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS)를 사용하도록 구성할 수도 있어요. 자세한 내용은 AWS KMS를 사용한 서버 측 암호화 지정하기(SSE-KMS)를 참고하세요.
AWS KMS는 안전하고 가용성이 높은 하드웨어와 소프트웨어를 결합해 클라우드 규모로 확장되는 키 관리 시스템을 제공하는 서비스예요. Amazon S3는 AWS KMS를 사용한 서버 측 암호화(SSE-KMS)로 S3 객체 데이터를 암호화해요. 또한 객체에 SSE-KMS가 요청되면 S3 체크섬(객체 메타데이터의 일부)이 암호화된 형태로 저장돼요. 체크섬에 대한 자세한 내용은 Amazon S3 객체 무결성 확인하기를 참고하세요.
KMS 키를 사용하면 AWS Management Console 또는 AWS KMS API로 AWS KMS를 사용해 다음을 수행할 수 있어요.
- KMS 키를 중앙에서 생성, 보기, 편집, 모니터링, 활성화/비활성화, 회전, 삭제 예약할 수 있어요.
- KMS 키를 사용하는 방법과 대상을 제어하는 정책을 정의할 수 있어요.
- KMS 키 사용이 올바른지 감사할 수 있어요. 감사는 AWS KMS API에서 지원되지만 AWS KMS 콘솔에서는 지원되지 않아요.
AWS KMS의 보안 제어는 암호화 관련 규정 준수 요구 사항을 충족하는 데 도움이 될 수 있어요. 이러한 KMS 키를 사용해 Amazon S3 버킷의 데이터를 보호할 수 있어요. S3 버킷과 함께 SSE-KMS 암호화를 사용할 때 AWS KMS 키는 버킷과 같은 리전에 있어야 해요.
AWS KMS 키 사용에는 추가 요금이 있어요. 자세한 내용은 AWS Key Management Service 개발자 안내서의 AWS KMS 키 개념과 AWS KMS 요금을 참고하세요.
IAM 사용자가 KMS 암호화 버킷에 접근하도록 허용하는 지침은 AWS re:Post Knowledge Center의 내 Amazon S3 버킷에 사용자 지정 AWS KMS 키를 사용한 기본 암호화가 있습니다. 사용자가 버킷에서 다운로드하고 업로드하도록 허용하려면 어떻게 해야 하나요?를 참고하세요.
권한
AWS KMS 키로 객체를 암호화하기 위한 PutObject 요청을 Amazon S3에 성공적으로 보내려면 키에 대한 kms:GenerateDataKey 권한이 필요해요. AWS KMS 키로 암호화된 객체를 다운로드하려면 해당 키에 대한 kms:Decrypt 권한이 필요해요. AWS KMS 키로 객체를 암호화하기 위한 멀티파트 업로드를 수행하려면 해당 키에 대한 kms:GenerateDataKey 및 kms:Decrypt 권한이 있어야 해요.
중요
- KMS 키 정책에서 부여된 권한을 신중히 검토하세요. 고객 관리 KMS 키 정책 권한은 관련 AWS KMS 키 작업에 접근해야 하는 IAM 보안 주체와 AWS 서비스로만 항상 제한하세요. 자세한 내용은 AWS KMS의 키 정책을 참고하세요.
- 버킷이 Amazon S3 서버 액세스 로깅의 대상으로 사용되는 경우 대상 버킷은 Amazon S3 관리 키(SSE-S3)를 사용해야 해요. 대상 버킷이 SSE-KMS 기본 암호화를 사용하면 Amazon S3가 접근할 수 없는 키로 암호화된 로그 객체를 전달할 수 있어요. 이 문제를 해결하려면 대상 버킷의 기본 암호화를 SSE-S3로 변경하세요. 자세한 내용은 Amazon S3 서버 액세스 로깅 활성화하기를 참고하세요.
AWS KMS 키
AWS KMS를 사용한 서버 측 암호화(SSE-KMS)를 사용할 때 기본 AWS 관리 키를 사용하거나 이미 생성한 고객 관리 키를 지정할 수 있어요. AWS KMS는 봉투 암호화를 지원해요. S3는 AWS KMS의 봉투 암호화 기능을 사용해 데이터를 더욱 보호해요. 봉투 암호화는 일반 텍스트 데이터를 데이터 키로 암호화한 다음 그 데이터 키를 KMS 키로 암호화하는 방식이에요. 봉투 암호화에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 봉투 암호화를 참고하세요.
고객 관리 키를 지정하지 않으면 Amazon S3는 SSE-KMS로 암호화된 객체를 버킷에 처음 추가할 때 AWS 계정에 AWS 관리 키를 자동으로 생성해요. 기본적으로 Amazon S3는 이 KMS 키를 SSE-KMS에 사용해요.
참고 AWS 관리 키를 사용하는 SSE-KMS로 암호화된 객체는 교차 계정으로 공유할 수 없어요. SSE-KMS 데이터를 교차 계정으로 공유해야 한다면 AWS KMS의 고객 관리 키를 사용해야 해요.
SSE-KMS에 고객 관리 키를 사용하려면 SSE-KMS를 구성하기 전에 대칭 암호화 고객 관리 키를 만들어요. 그런 다음 버킷에 SSE-KMS를 구성할 때 기존 고객 관리 키를 지정해요. 대칭 암호화 키에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 대칭 암호화 KMS 키를 참고하세요.
고객 관리 키를 만들면 더 많은 유연성과 제어 권한을 얻을 수 있어요. 예를 들어 고객 관리 키를 생성, 회전, 비활성화할 수 있어요. 데이터를 보호하는 데 사용하는 고객 관리 키에 대한 접근 제어를 정의하고 감사할 수도 있어요. 고객 관리 키와 AWS 관리 키에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 고객 키와 AWS 키를 참고하세요.
참고 외부 키 스토어에 저장된 고객 관리 키로 서버 측 암호화를 사용할 때는 표준 KMS 키와 달리 키 자료의 가용성과 내구성을 보장해야 할 책임이 있어요. 외부 키 스토어와 이것이 공동 책임 모델을 어떻게 바꾸는지에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 외부 키 스토어를 참고하세요.
교차 계정 작업을 위한 SSE-KMS 암호화 사용
교차 계정 작업에서 암호화를 사용할 때는 다음 사항을 유의하세요.
- 요청 시 또는 버킷의 기본 암호화 구성을 통해 AWS KMS 키 ARN 또는 별칭이 제공되지 않으면 업로드 계정의 AWS 관리 키(
aws/s3)가 암호화에 사용되고 복호화에 필요해요. - 업로드 및 접근하는 AWS Identity and Access Management(IAM) 보안 주체가 같은 AWS 계정에 있을 때 AWS 관리 키(
aws/s3)를 교차 계정 작업의 KMS 키로 사용할 수 있어요. - S3 객체에 교차 계정 접근을 부여하려면 고객 관리 키를 사용하세요. 고객 관리 키의 정책을 구성해 다른 계정의 접근을 허용할 수 있어요.
- 고객 관리 KMS 키를 지정할 때는 전체 자격(KMS 키 ARN)을 사용하는 것이 좋아요. KMS 키 별칭을 사용하면 AWS KMS가 요청자의 계정 내에서 키를 해석해요. 이 동작으로 인해 데이터가 버킷 소유자가 아니라 요청자가 소유한 KMS 키로 암호화될 수 있어요.
- 요청자가 암호화(Encrypt) 권한을 부여받은 키를 지정해야 해요. 자세한 내용은 AWS Key Management Service 개발자 안내서의 키 사용자가 암호화 작업에 KMS 키를 사용하도록 허용하기를 참고하세요.
AWS 관리 키와 고객 관리 키를 언제 사용해야 하는지에 대한 자세한 내용은 Amazon S3에서 객체를 암호화할 때 AWS 관리 키와 고객 관리 키 중 무엇을 사용해야 하나요?를 참고하세요.
SSE-KMS 암호화 워크플로
AWS 관리 키 또는 고객 관리 키로 데이터를 암호화하기로 선택하면 AWS KMS와 Amazon S3가 다음 봉투 암호화 작업을 수행해요.
- Amazon S3가 일반 텍스트 데이터 키와 지정된 KMS 키로 암호화된 키의 사본을 요청해요.
- AWS KMS가 데이터 키를 생성하고 이를 KMS 키로 암호화한 다음 일반 텍스트 데이터 키와 암호화된 데이터 키를 모두 Amazon S3로 보내요.
- Amazon S3가 데이터 키로 데이터를 암호화하고, 사용 후 가능한 한 빨리 일반 텍스트 키를 메모리에서 제거해요.
- Amazon S3가 암호화된 데이터 키를 암호화된 데이터와 함께 메타데이터로 저장해요.
데이터 복호화를 요청하면 Amazon S3와 AWS KMS가 다음 작업을 수행해요.
- Amazon S3가
Decrypt요청으로 암호화된 데이터 키를 AWS KMS로 보내요. - AWS KMS가 동일한 KMS 키로 암호화된 데이터 키를 복호화하고 일반 텍스트 데이터 키를 Amazon S3로 반환해요.
- Amazon S3가 일반 텍스트 데이터 키로 암호화된 데이터를 복호화하고 가능한 한 빨리 일반 텍스트 데이터 키를 메모리에서 제거해요.
중요 Amazon S3에서 서버 측 암호화에 AWS KMS 키를 사용할 때는 대칭 암호화 KMS 키를 선택해야 해요. Amazon S3는 대칭 암호화 KMS 키만 지원해요. 이러한 키에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 대칭 암호화 KMS 키를 참고하세요.
SSE-KMS 암호화 감사
SSE-KMS를 지정하는 요청을 식별하려면 Amazon S3 Storage Lens 지표의 모든 SSE-KMS 요청(All SSE-KMS requests) 및 모든 SSE-KMS 요청 비율(% all SSE-KMS requests) 지표를 사용할 수 있어요. S3 Storage Lens는 객체 스토리지 사용량과 활동에 대한 조직 전반의 가시성을 확보하는 데 사용할 수 있는 클라우드 스토리지 분석 기능이에요. SSE-KMS 활성화 버킷 수(SSE-KMS enabled bucket count) 및 **SSE-KMS 활성화 버킷 비율(% SSE-KMS enabled buckets)**을 사용해 기본 버킷 암호화에 SSE-KMS를 사용하는 버킷 수를 파악할 수도 있어요. 자세한 내용은 S3 Storage Lens로 스토리지 활동 및 사용량 평가하기를 참고하세요. 전체 지표 목록은 S3 Storage Lens 지표 용어집을 참고하세요.
SSE-KMS로 암호화된 데이터에 대한 AWS KMS 키 사용을 감사하려면 AWS CloudTrail 로그를 사용할 수 있어요. GenerateDataKey 및 Decrypt와 같은 암호화 작업에 대한 통찰력을 얻을 수 있어요. CloudTrail은 이벤트 이름, 사용자 이름, 이벤트 소스 등 검색을 필터링하는 데 도움이 되는 다양한 속성 값을 지원해요.
Amazon S3 Bucket Keys
AWS KMS(SSE-KMS)를 사용한 서버 측 암호화를 구성할 때 버킷이 SSE-KMS에 S3 Bucket Keys를 사용하도록 구성할 수 있어요. SSE-KMS에 버킷 수준 키를 사용하면 Amazon S3에서 AWS KMS로 가는 요청 트래픽을 줄여 AWS KMS 요청 비용을 최대 99%까지 절감할 수 있어요.
버킷을 새 객체에 대해 SSE-KMS에 S3 Bucket Key를 사용하도록 구성하면 AWS KMS가 버킷 수준 키를 생성하고, 이 키가 버킷의 객체에 대한 고유한 데이터 키를 만드는 데 사용돼요. 이 S3 Bucket Key는 Amazon S3 내에서 제한된 시간 동안 사용되어 Amazon S3가 암호화 작업을 완료하기 위해 AWS KMS에 요청을 보내는 필요를 더욱 줄여요. S3 Bucket Keys 사용에 대한 자세한 내용은 Amazon S3 Bucket Keys로 SSE-KMS 비용 절감하기를 참고하세요.
서버 측 암호화 요구
특정 Amazon S3 버킷의 모든 객체에 서버 측 암호화를 요구하려면 버킷 정책을 사용할 수 있어요. 예를 들어 다음 버킷 정책은 요청에 SSE-KMS를 사용한 서버 측 암호화를 요청하는 x-amz-server-side-encryption-aws-kms-key-id 헤더가 포함되지 않으면 모든 사용자의 업로드 객체(s3:PutObject) 권한을 거부해요.
- JSON:
{
"Version": "2012-10-17",
"Id": "PutObjectPolicy",
"Statement": [
{
"Sid": "DenyObjectsThatAreNotSSEKMS",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
"Condition": {
"Null": {
"s3:x-amz-server-side-encryption-aws-kms-key-id": "true"
}
}
}
]
}
버킷의 객체를 암호화하는 데 특정 AWS KMS 키를 사용하도록 요구하려면 s3:x-amz-server-side-encryption-aws-kms-key-id 조건 키를 사용할 수 있어요. KMS 키를 지정하려면 arn:aws:kms:region:acct-id:key/key-id 형식의 키 ARN을 사용해야 해요. AWS Identity and Access Management는 s3:x-amz-server-side-encryption-aws-kms-key-id 문자열이 존재하는지 검증하지 않아요.
참고 객체를 업로드할 때
x-amz-server-side-encryption-aws-kms-key-id헤더로 KMS 키를 지정하거나 기본 버킷 암호화 구성에 의존할 수 있어요.PutObject요청이x-amz-server-side-encryption헤더에aws:kms를 지정하지만x-amz-server-side-encryption-aws-kms-key-id헤더를 지정하지 않으면 Amazon S3는 AWS 관리 키를 사용하려는 것으로 간주해요. 어쨌든 Amazon S3가 객체 암호화에 사용하는 AWS KMS 키 ID는 정책의 AWS KMS 키 ID와 일치해야 하며, 그렇지 않으면 Amazon S3가 요청을 거부해요.
Amazon S3 특정 조건 키의 전체 목록은 서비스 권한 부여 참조의 Amazon S3 조건 키를 참고하세요.
암호화 컨텍스트
암호화 컨텍스트는 데이터에 대한 추가 컨텍스트 정보를 포함하는 키-값 쌍의 집합이에요. 암호화 컨텍스트는 암호화되지 않아요. 암호화 작업에 암호화 컨텍스트를 지정하면 Amazon S3는 복호화 작업에도 동일한 암호화 컨텍스트를 지정해야 해요. 그렇지 않으면 복호화가 실패해요. AWS KMS는 암호화 컨텍스트를 추가 인증 데이터(AAD)로 사용해 인증된 암호화를 지원해요. 암호화 컨텍스트에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 암호화 컨텍스트를 참고하세요.
기본적으로 Amazon S3는 객체 또는 버킷 ARN을 암호화 컨텍스트 쌍으로 사용해요.
- S3 Bucket Key를 활성화하지 않고 SSE-KMS를 사용하면 객체 ARN이 암호화 컨텍스트로 사용돼요.
arn:aws:s3:::object_ARN - SSE-KMS를 사용하고 S3 Bucket Key를 활성화하면 버킷 ARN이 암호화 컨텍스트로 사용돼요. S3 Bucket Keys에 대한 자세한 내용은 Amazon S3 Bucket Keys로 SSE-KMS 비용 절감하기를 참고하세요.
arn:aws:s3:::bucket_ARN
s3:PutObject 요청에서 x-amz-server-side-encryption-context 헤더를 사용해 추가 암호화 컨텍스트 쌍을 선택적으로 제공할 수 있어요. 그러나 암호화 컨텍스트는 암호화되지 않으므로 민감한 정보를 포함하지 않도록 해야 해요. Amazon S3는 이 추가 키 쌍을 기본 암호화 컨텍스트와 함께 저장해요. PUT 요청을 처리할 때 Amazon S3는 기본 암호화 컨텍스트 aws:s3:arn을 사용자가 제공한 것에 추가해요.
암호화 컨텍스트를 사용해 암호화 작업을 식별하고 분류할 수 있어요. 또한 기본 암호화 컨텍스트 ARN 값을 사용해 어떤 Amazon S3 ARN이 어떤 암호화 키와 함께 사용되었는지 확인함으로써 AWS CloudTrail에서 관련 요청을 추적할 수 있어요.
CloudTrail 로그 파일의 requestParameters 필드에서 암호화 컨텍스트는 다음 예시와 유사하게 보여요.
"encryptionContext": {
"aws:s3:arn": "arn:aws:s3:::amzn-s3-demo-bucket1/file_name"
}
선택적 S3 Bucket Keys 기능과 함께 SSE-KMS를 사용하면 암호화 컨텍스트 값은 버킷의 ARN이에요.
"encryptionContext": {
"aws:s3:arn": "arn:aws:s3:::amzn-s3-demo-bucket1"
}
AWS KMS 암호화 객체에 대한 요청 보내기
중요 AWS KMS 암호화 객체에 대한 모든 GET 및 PUT 요청은 SSL(Secure Sockets Layer) 또는 TLS(Transport Layer Security)를 사용해 이루어져야 해요. 요청은 AWS Signature Version 4(또는 AWS Signature Version 2)와 같은 유효한 자격 증명으로 서명해야 해요.
AWS Signature Version 4는 HTTP로 보내는 AWS 요청에 인증 정보를 추가하는 프로세스예요. 보안을 위해 대부분의 AWS 요청은 액세스 키 ID와 보안 액세스 키로 구성된 액세스 키로 서명해야 해요. 이 두 키를 일반적으로 보안 자격 증명이라고 해요. 자세한 내용은 요청 인증(AWS Signature Version 4) 및 Signature Version 4 서명 프로세스를 참고하세요.
중요 객체가 SSE-KMS를 사용하는 경우 GET 요청과 HEAD 요청에 암호화 요청 헤더를 보내지 마세요. 그렇지 않으면 HTTP 400 Bad Request 오류가 발생해요.