AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용
중요
이제 Amazon S3가 Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)를 Amazon S3 내 모든 버킷 암호화의 기본 수준으로 적용합니다. 2023년 1월 5일부터 Amazon S3로의 모든 새 객체 업로드는 추가 비용 없이 성능에 영향을 미치지 않고 자동으로 암호화됩니다. S3 버킷 기본 암호화 구성에 및 신규 객체 업로드에 대한 자동 암호화 상태는 AWS CloudTrail 로그, S3 인벤토리, S3 스토리지 렌즈, Amazon S3 콘솔에서 사용할 수 있으며, AWS Command Line Interface 및 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 체크섬(객체 메타데이터의 일부)이 암호화된 형식으로 저장됩니다. 체크섬에 대한 자세한 내용은 객체 무결성 확인 페이지를 참조하십시오.
KMS 키를 사용하는 경우 AWS Management Console
-
KMS 키를 중앙에서 생성, 조회, 편집, 모니터링, 활성화/비활성화, 순환, 예약 삭제할 수 있습니다.
-
KMS 키를 사용할 수 있는 방법 및 주체를 제어하는 정책을 정의합니다.
-
KMS 키 사용량을 감사하여 올바르게 사용되고 있는지 입증합니다. 감사는 AWS KMSAWS Management Console
이 아닌 AWS KMS API가 지원합니다.
AWS KMS 내 보안 관리가 암호화 관련 규정 준수 요구 사항을 충족하는 데 도움이 될 수 있습니다. 이러한 KMS 키를 사용하여 Amazon S3 버킷에서 데이터를 보호할 수 있습니다. S3 버킷에 SSE-KMS 암호화를 사용할 때 AWS KMS keys는 버킷과 동일한 리전에 있어야 합니다.
AWS KMS keys 사용에 따르는 추가 요금이 있습니다. 자세한 내용은 AWS Key Management Service 개발자 가이드의 AWS KMS key 개념 및 AWS KMS 요금
권한
AWS KMS key을 사용하여 암호화된 객체를 Amazon S3에 업로드하려면 키에 대한 kms:GenerateDataKey
권한이 필요합니다. AWS KMS key을 사용하여 암호화된 객체를 다운로드하려면 kms:Decrypt
권한이 필요합니다. –멀티파트 업로드에 필요한 AWS KMS 권한에 대한 자세한 내용은 멀티파트 업로드 API 및 권한 섹션을 참조하십시오.
중요
KMS 키 정책에 부여된 권한을 주의 깊게 검토하세요. 고객 관리형 KMS 키 정책 권한은 항상 관련 AWS KMS 키 작업에 액세스해야 하는 IAM 보안 주체 및 AWS 서비스로 제한하세요. 자세한 내용은 AWS KMS에서 키 정책을 참조하세요.
주제
AWS KMS keys
AWS KMS를 통한 서버 측 암호화(SSE-KMS)를 사용하는 경우 기본 AWS 관리형 키를 사용하거나 이미 생성한 고객 관리형 키를 지정할 수 있습니다. AWS KMS는 봉투 암호화를 사용합니다. S3는 봉투 암호화에 AWS KMS 기능을 사용하여 데이터를 추가로 보호합니다. 봉투 암호화는 데이터 키로 일반 텍스트 데이터를 암호화한 후 KMS 키로 데이터 키를 암호화하는 방법입니다. 봉투 암호화에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서에서 봉투 암호화를 참조하십시오.
고객 관리형 키를 지정하지 않으면 Amazon S3에서는 SSE-KMS로 암호화된 객체를 버킷에 처음 추가할 때 AWS 계정에 AWS 관리형 키를 자동으로 생성합니다. 기본적으로 Amazon S3에서는 SSE-KMS에 이 KMS를 사용합니다.
참고
SSE-KMS에 고객 관리형 키를 사용하려는 경우 SSE-KMS를 구성하기 전에 대칭 암호화 고객 관리형 키를 생성합니다. 그런 다음 버킷에 대해 SSE-KMS를 구성할 때 기존 고객 관리형 키를 지정합니다. 대칭 암호화 키에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 대칭 암호화 KMS 키를 참조하십시오.
고객 관리형 키를 생성하면 보다 유연하게 제어할 수 있습니다. 예를 들어, 고객 관리형 키를 생성, 교체 및 사용 중지할 수 있습니다. 또한 액세스 제어를 정의하고 데이터를 보호하는 데 사용하는 고객 관리형 키를 감사할 수 있습니다. 고객 관리형 및 AWS 관리형 키에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 고객 키 및 AWS 키를 참조하십시오.
참고
외부 키 스토어에 저장된 고객 관리형 키로 서버 측 암호화를 사용하면, 표준 KMS 키를 사용할 때와는 달리, 키 구성 요소의 가용성과 내구성을 직접 담보할 책임이 있습니다. 외부 키 스토어와 이들이 공유 책임 모델을 전환하는 방법에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 External key stores(외부 키 스토어)를 참조하십시오.
크로스 계정 작업에 SSE-KMS 암호화 사용
크로스 계정 작업에 암호화를 사용하는 경우 다음 사항에 유의하세요.
-
요청 시 또는 버킷의 기본 암호화 구성을 통해 AWS KMS key Amazon 리소스 이름(ARN) 또는 별칭이 제공되지 않은 경우 AWS 관리형 키(
aws/s3
)가 사용됩니다. -
KMS 키와 동일한 AWS 계정에 있는 AWS Identity and Access Management(IAM) 보안 주체를 사용하여 S3 객체를 업로드하거나 액세스하는 경우 AWS 관리형 키(
aws/s3
)를 사용할 수 있습니다. -
S3 객체에 크로스 계정 액세스 권한을 부여하려면 고객 관리형 키를 사용합니다. 다른 계정으로부터의 액세스를 허용하도록 고객 관리형 키의 정책을 구성할 수 있습니다.
-
고객 관리형 KMS 키를 지정하는 경우 정규화된 KMS 키 ARN을 사용하는 것이 좋습니다. KMS 키 별칭을 대신 사용하는 경우 AWS KMS가 요청자의 계정 내에서 키를 해독합니다. 이 동작으로 인해 버킷 소유자가 아닌 요청자에게 속한 KMS로 데이터가 암호화될 수 있습니다.
-
사용자(요청자)에게
Encrypt
권한이 부여된 키를 지정해야 합니다. 자세한 내용은 AWS Key Management Service 개발자 안내서의 키 사용자가 암호화 작업에 KMS를 사용하도록 허용을 참조하세요.
고객 관리형 키와 AWS 관리형 KMS 키를 사용해야 하는 상황에 대한 자세한 내용은 Amazon S3의 객체를 암호화하기 위해 AWS 관리형 키와 고객 관리형 KMS 키 중 무엇을 사용해야 합니까?
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 key을 사용하는 경우 대칭 암호화 KMS 키를 선택해야 합니다. Amazon S3는 대칭 암호화 KMS 키만 지원합니다. 이들 키에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 대칭 암호화 KMS 키를 참조하십시오.
SSE-KMS 암호화 감사
SSE-KMS를 지정하는 요청을 식별하려면 Amazon S3 스토리지 렌즈 지표 내에서 All SSE-KMS requests(모든 SSE-KMS 요청) 및 % all SSE-KMS requests(모든 SSE-KMS 요청 비율) 지표를 사용하면 됩니다. S3 스토리지 렌즈는 조직 전반에서 객체 스토리지 사용 및 활동에 대한 가시성을 확보하는 데 사용할 수 있는 클라우드 스토리지 분석 기능입니다. SSE-KMS 활성화 버킷 수 및 SSE-KMS 활성화 버킷 비율을 사용하여 기본 버킷 암호화에 대한 SSE-KMS 활성화 버킷 수를 파악할 수도 있습니다. 자세한 내용은 S3 스토리지 렌즈를 사용한 스토리지 활동 및 사용량 평가를 참조하십시오. 지표의 전체 목록은 S3 스토리지 렌즈 지표 용어집을 참조하십시오.
AWS CloudTrail 로그를 사용하여 SSE-KMS 암호화 데이터의 AWS KMS 키 사용을 감사할 수 있습니다. GenerateDataKey 및 Decrypt와 같은 암호화 작업에 대한 인사이트를 얻을 수 있습니다. CloudTrail은 이벤트 이름, 사용자 이름, 이벤트 소스 등 검색 필터링을 위한 다양한 속성 값을 지원합니다.
Amazon S3 버킷 키
AWS KMS(SSE-KMS)를 통한 서버 측 암호화를 구성할 때 SSE-KMS용 S3 버킷 키를 사용하도록 버킷을 구성할 수 있습니다. SSE-KMS용 버킷 수준 키를 사용하면 Amazon S3에서 AWS KMS로 가는 요청 트래픽을 줄여 AWS KMS 요청 비용을 최대 99%까지 줄일 수 있습니다.
새 객체에서 SSE-KMS용 S3 버킷 키를 사용하도록 버킷을 구성하면 AWS KMS는 버킷의 객체에 대해 고유한 데이터 키를 만드는 데 사용되는 버킷 수준 키를 생성합니다. 이 S3 버킷 키는 Amazon S3 내에서 제한된 기간 동안 사용되므로 Amazon S3가 암호화 작업을 완료하기 위해 AWS KMS에 요청할 필요성이 추가적으로 줄어듭니다. S3 버킷 키 사용에 대한 자세한 내용은 Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감 단원을 참조하십시오.
서버 측 암호화 필요
특정 Amazon S3 버킷의 모든 객체에 대한 서버 측 암호화를 요구하려면 버킷 정책을 사용하면 됩니다. 예를 들어, 다음 버킷 정책은 요청에 SSE-KMS를 사용한 서버 측 암호화를 요청하는 s3:PutObject
헤더가 포함되지 않을 경우 모든 사용자에게 객체 업로드(x-amz-server-side-encryption-aws-kms-key-id
) 권한을 거부합니다.
{ "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 key를 사용하도록 하려면 s3:x-amz-server-side-encryption-aws-kms-key-id
조건 키를 사용합니다. arn:aws:kms:
형식의 Amazon 리소스 이름(ARN) 키를 사용해야 합니다. AWS Identity and Access Management은 문자열이 존재하는지 유효성을 검사하지 않습니다.region
:acct-id
:key/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는 객체 또는 버킷의 Amazon 리소스 이름(ARN)을 암호화 컨텍스트 쌍으로 사용합니다.
-
S3 버킷 키를 활성화하지 않고 SSE-KMS를 사용하는 경우 객체 ARN이 암호화 컨텍스트로 사용됩니다.
arn:aws:s3:::
object_ARN
-
S3 버킷 키를 활성화하고 SSE-KMS를 사용하는 경우 버킷 ARN이 암호화 컨텍스트로 사용됩니다. S3 버킷 키에 대한 자세한 내용은 Amazon S3 버킷 키를 사용하여 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 버킷 키 기능과 함께 SSE-KMS를 사용하는 경우 암호화 컨텍스트 값은 버킷의 ARN입니다.
"encryptionContext": { "aws:s3:arn": "arn:aws:s3:::
" }
amzn-s3-demo-bucket1
AWS KMS 암호화된 객체에 대한 요청 전송
중요
AWS KMS 암호화된 객체에 대한 모든 GET
및 PUT
요청은 Secure Sockets Layer(SSL) 또는 전송 계층 보안(TLS)을 사용하여 이루어져야 합니다. 또한 AWS 서명 버전 4(또는 AWS 서명 버전 2)와 같은 유효한 보안 인증 정보를 사용하여 요청에 서명해야 합니다.
AWS Signature 버전 4는 HTTP로 전송된 AWS 요청에 인증 정보를 추가하는 프로세스입니다. 보안을 위해 대부분의 AWS 요청은 액세스 키 ID와 비밀 액세스 키로 구성된 액세스 키로 서명해야 합니다. 이 두 키는 일반적으로 보안 자격 증명이라고 합니다. 자세한 내용은 요청 인증(AWS 서명 버전 4) 및 서명 버전 4 서명 프로세스를 참조하십시오.
중요
객체가 SSE-KMS를 사용하는 경우 GET
요청 및 HEAD
요청에 암호화 요청 헤더를 전송하면 안 됩니다. 그러면 HTTP 400 Bad Request
오류가 발생합니다.