BLOG
Amazon Simple Storage Service(Amazon S3)를 사용하는 고객들은 서버 객체 암호화(SSE)를 위해 S3-SManaged Encryption Keys (SSE-S3)를 많이들 이용합니다. SSE-S3를 통해 유휴 데이터를 보호하여 많은 고객의 보안 요구 사항을 충족시킬 수 있습니다. 그러나 일부 다른 고객의 경우 SSE-S3가 처음에 요구 사항을 충족했지만 시간이 지남에 따라 요구 사항이 변경되었을 수 있습니다. 예를 들어, 고객이 새로운 비즈니스를 시작하게 됨에 따라 다른 기준의 요구사항을 준수해야 할 수 있습니다. 다른 예로, 분석에 초점을 맞춘 고객은 민감하지 않은 데이터로 개념 증명을 실행하여 시작합니다. 분석 플랫폼에서 가치를 도출할 때 서로 다른 데이터 소스 및 이 데이터 집계에서 더 많은 데이터를 추가하고 분류를 변경합니다. 암호화 키에 액세스할 수 있는 사용자를 보다 효과적으로 제어하여 암호화 키를 처리하기 위한 추가 제어를 구현해야 할 수도 있습니다. 또한 별도의 로깅 및 감사 또는 스토리지 및 암호화의 개별 인증을 위한 PCI-DSS 준수 요구 사항을 지원할 수 있는 기능을 필요로 할 수 있습니다. AWS 관리 키와 고객 관리 키의 차이점에 대한 자세한 내용은 다음 링크의 블로그 게시물을 참고하세요.
보다 강력한 보안 및 규정 준수 요구 사항을 충족하기 위해 일부 고객은 암호화에 AWS Key Management Service (AWS KMS) 를 사용하는 암호화 모델을 SSE-S3에서 SSE-KMS 로 변경할 수 있습니다. 이를 통해 과대 허용 정책으로부터의 보호를 포함하여 몇 가지 추가 이점을 제공할 수 있습니다. 예를 들어 버킷 정책을 추가하면 개별 사용자나 역할 대신 데이터에 광범위하게 액세스할 수 있습니다. KMS 키를 사용하여 암호화를 구현하면 리소스 접근자는 데이터를 해독하기 위해 Amazon S3 정책 액세스 및 KMS 키에 대한 액세스가 필요합니다. 고객 관리 키와 함께 AWS KMS를 사용하는 고객은 다음과 같은 이점을 누릴 수 있으며 이러한 이점은 추가 규정 준수 요구 사항을 지원합니다.
- 액세스 권한을 취소하여 데이터에 대한 액세스를 불가능하게 하는 키 소유권을 유지
- 규정 준수 요구 사항에 따라 AWS KMS 콘솔에서 감사 가능한 고객 관리 형 CMK를 생성, 교체 및 비활성화
- AWS KMS의 보안 컨트롤을 통해 암호화 관련 규정 준수 요구 사항 충족
본 게시물에서는 다음 네 가지를 시연해드리도록 하겠습니다.
- 암호화에 KMS 키를 사용하도록 버킷에서 기본 암호화를 설정하는 방법
- 암호화에 KMS 키를 사용하도록 기존 개체를 변경하는 방법
- 과대 허용 정책에 대비하는 WS KMS를 사용한 추가 보호 기능
- 암호화를 위해 특정 KMS 키가 요청된 경우에만 업로드를 허용하는 버킷 정책을 설정하는 방법
위의 방법을 사용하면 위 목록의 이점 또는 요구 사항을 제공받을 수 있지만 암호화를 보다 효과적으로 제어할 수 있는 일부 장단점을 주의하셔야 합니다. AWS KMS는 초당 요청 (RPS) 할당량을 설정하여 빠르고 탄력적인 서비스를 제공할 수 있도록 합니다. 예를 들어 AWS KMS에 대한 기본 요청 수는 5,500 ~ 30,000 RPS(AWS 지역에 따라 다름)로 제한됩니다. AWS KMS 제한하는 방법과 한도 증가를 요청하는 방법에 대한 자세한 내용은 AWS KMS Limit을 확인해 주십시오. Custom Key store quota를 제외하고 AWS KMS request quotas는 조정 가능합니다. 할당량을 초과해야 하는 경우 서비스 할당량의 할당량 증가를 요청할 수 있습니다. Service Quotas console 또는 RequestServiceQuotaIncrease를 사용하세요. 자세한 내용은 서비스 할당량 사용자 안내서 에서 requesting a quota increase를 참고해주세요. 리전에서 AWS KMS에 대한 서비스 할당량을 사용할 수 없는 경우 AWS 지원 센터를 방문하여 사례를 생성해 주시기 바랍니다.
Customer managed keys와 AWS KMS를 사용하면 비용도 고려하셔야 합니다. 이러한 영향을 이해하기 위해 유럽 (런던) 리전의 S3 Standard에 저장된 10TB의 1GB 객체를 저장한다고 가정해 보겠습니다. 한 달에 걸쳐 같은 지역 내에서 2,000,000 회 개체를 다운로드하고 10,000 개를 업데이트 된 버전으로 덮어 씁니다.
- S3 비용 = 한 달에 $ 240.86
SSE-S3을 사용한 경우 총 비용입니다. 그러나 암호화를 SSE-KMS로 변경한 경우 한 달 동안 10,000 개의 암호화 요청과 2,000,000 개의 해독 요청을 고려해야 합니다.
- 하나의 AWS KMS CMK = $ 1
- 암호화 및 암호 해독 = $ 6
AWS SSE-KMS로의 전환 규모를 조정하기 위해 S3 Inventory Report 또는 새로운 Amazon Macie 를 사용하여 객체 수와 바이트 수를 식별할 수 있습니다. 마이그레이션에 대한 비용 모델을 작성하는 데 사용 가능합니다. 할당량이 사용자에게 미치는 영향을 이해하려면 AWS KMS 개발자 안내서 설명서를 참고하세요.
이 게시물 전체에서 AWS Command Line Interface (AWS CLI) 와 AWS Management Console을 함께 사용하여 AWS 서비스와 상호 작용합니다. AWS CLI를 아직 설치하지 않은 경우 이 안내서 에 따라 설치하세요.
이 게시물의 나머지 부분에서 명령이 표시되면 환경에 맞게 매개 변수를 변경해야 합니다. 여기에는 버킷 이름 “kms-encryption-demo”및 ARN 또는 “<create-access-key 명령의 액세스 키>”와 같은 특정 참조가 포함됩니다. 이 블로그 게시물의 코드는 암호화 키 변경을 스크립팅하는 방법의 예로 제공됩니다. 이러한 변경 사항을 프로덕션 환경에서 사용하기 전에 신중하게 테스트하고 숙지하시기를 추천드립니다.
이 첫 번째 단계에서는 새 버킷을 만들고 객체를 업로드하여 다른 암호화 시나리오에서 S3 콘텐츠에 액세스하는 차이점을 보여줍니다.
기본 버킷 암호화 설정
처음에는 SSE-S3 암호화가 활성화 된 버킷을 생성하고 파일을 업로드하려고 합니다.
AWS CLI에서 다음 명령을 실행하세요. (필요에 맞게 편집하셔도 좋습니다.)
aws s3 mb s3://kms–encryption–demo
aws s3api put–bucket–encryption —bucket kms–encryption–demo —server–side–encryption–configuration ‘
{
“Rules”: [{
“ApplyServerSideEncryptionByDefault”: {
“SSEAlgorithm”: “AES256”
}
}]
}‘
echo ‘Lots of data‘ > test-1.log
echo ‘Even more data‘ > test-2.log
echo ‘The most data’ > test–3.log
aws s3 cp test–1.log s3://kms–encryption–demo/
마지막으로, 서버 측 암호화를 확인하기 위해 업로드 한 객체를 쿼리하세요. 다음 명령으로 수행하세요.
aws s3api head–object —bucket kms–encryption–demo —key test–1.log
AWS CLI에서 수신한 응답을 보면 객체에 S3 서버 측 암호화가 설정되어 있음을 알 수 있습니다. “AES256″으로 설정된 ServerSideEncryption 필드를 보면 이를 확인할 수 있습니다.
AWS KMS 키 생성
AWS KMS는 사용하기 쉬운 키 관리 서비스입니다. AWS KMS를 사용하면 광범위한 AWS 서비스와 함께 사용하여 데이터를 암호화 및 해독 할 수있는 키를 쉽게 생성, 관리 및 제어 할 수 있습니다.
다음 단계에서는 새 키를 만듭니다. 그런 다음 KMS 키를 사용하도록 버킷의 기본 암호화를 설정 한 다음 새 파일을 업로드하여 새 키로 암호화되었는지 확인합니다. 이를 위해 먼저 이 글에 따라 KMS 키를 작성하세요.
AWS KMS를 구성할 때 다음 값을 사용하세요.
- 별명: kms-demo
- 설명: AWS KMS Demo
- 고급 옵션: 기본값 유지
- 태그: 비워 두세요.
- 주요 관리자 권한: 사용자 이름 또는 그룹
- 주요 사용 권한 사용자 이름 또는 그룹
새 키를 사용하도록 버킷에서 기본 암호화 설정
키가 생성되면 S3에게 이전에 생성한 버킷에 키를 사용하도록 지정해야 합니다. AWS CLI에서 다음 명령을 실행하여 수행하세요.
aws s3api put–bucket–encryption —bucket kms–encryption–demo —server–side–encryption–configuration ‘{
“Rules”: [
{
“ApplyServerSideEncryptionByDefault”: {
“SSEAlgorithm”: “aws:kms”,
“KMSMasterKeyID”: “arn:aws:kms:eu-west-2:1111111111111:key/90258e51-2441-3332-ff43-62a87177c8ac”
}
}
]
}‘
새 파일을 업로드하고 객체에 적용된 암호화를 확인하세요.
이제 다음 명령을 실행하여 새 파일을 버킷에 업로드하고 사용중인 암호화를 확인하세요.
aws s3 cp test–2.log s3://kms–encryption–demo/
aws s3api head–object —bucket kms–encryption–demo —key test–1.log
aws s3api head–object —bucket kms–encryption–demo —key test–2.log
AWS CLI에서 수신한 응답을 보면 첫 번째 객체에 동일한 SSE 암호화 세트가 있음을 알 수 있습니다. 또한 두 번째 개체의 값 “SSEKMSKeyId”가 앞에서 만든 KMS 키로 설정되어 있음을 알 수 있습니다.
새로운 사용자로 기존 파일 액세스 테스트
AWS KMS가 제공하는 세분화된 권한을 보여주기 위해 S3 버킷 및 객체에 대한 전체 액세스 권한을 가진 새 사용자를 생성하고 두 파일 모두에 액세스하세요.
AWS CLI에서 다음 명령을 실행하여 수행하세요.
aws iam create–user —user–name kms–demo
echo ‘{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Action”: [
“s3:*”
],
“Resource”: [
“arn:aws:s3:::kms-encryption-demo”,
“arn:aws:s3:::kms-encryption-demo/*”
]
}
]}‘ > policy.json
aws iam create–policy —policy–name kms–demo —policy–document file://policy.jsonaws iam attach–user–policy —user–name kms–demo —policy–arn <ARN returned from the create policy command, e.g. <arn:aws:iam::11111111111:policy/kms–demo >aws iam create–access–key —user–name kms–demoexport AWS_ACCESS_KEY_ID=<access key from the create–access–key command>export AWS_SECRET_ACCESS_KEY=<secret key from the create–access–key command>
aws s3api get–object —bucket kms–encryption–demo —key test–1.log.
aws s3api get–object —bucket kms–encryption–demo —key test–2.log .
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_KEY
이러한 명령을 완료한 후 기본 S3 암호화가 사용되므로 kms-demo 사용자가 여전히 test-1.log에 액세스할 수 있음을 알 수 있습니다. 그러나 동일한 사용자가 두 번째 파일 (test-2.log)에 액세스하려고 하면 개체를 해독하기 위해 KMS 키에 액세스 할 수 없으므로 “AccessDenied”가 표시됩니다.
암호화에 AWS KMS 키를 사용하도록 버킷의 모든 객체 업데이트
버킷의 모든 객체를 변경하기 위해 AWS CLI를 사용할 수 있습니다. amls 또는 태그와 같은 다른 메타 데이터를 복사하면 이를 명시적으로 지정해야 할 수도 있습니다. 자세한 내용은 여기에서 AWS CLI 사용 방법에 대한 자세한 블로그 게시물이 있으며 이를 수행하는 방법의 예는 다음과 같습니다.
aws s3 cp s3://kms-encryption-demo/ s3://kms-encryption-demo/ –recursive –sse-kms-key-id arn:aws:kms:eu-west-2:1111111111111:key/90258e51-2441-3332-ff43-62a87177c8ac –sse aws:kms
S3 버킷에 수백만 개의 항목이 있으면 완료하는 데 시간이 걸릴 수 있습니다. S3 배치 작업을 사용하여 관리 작업을 오프로드 할 수 있습니다. 이를 달성하는 방법에 대한 자세한 내용은 이 블로그 게시물에서 확인할 수 있습니다.
이 블로그 게시물의 시작 부분에 있는 비용 예에서 설명한 것처럼 이 작업 수행과 관련된 추가 비용이 있으며 수십억 개의 개체에서 상당한 비용이 발생할 수 있습니다. AWS KMS 암호화 및 검색 시 AWS KMS 암호 해독을 위해 객체를 가져오고 넣는 데 드는 요금입니다. 개체를 SSE-S3에서 SSE-KMS로 변환하기 전에 특정 사용 사례에 대해 발생할 비용을 이해하기 위해 비용 모델링을 수행하는 것이 좋습니다.
AWS KMS 키 암호화 강제 실행
이 마지막 섹션에서는 사용자가 초기 단계에서 설정된 기본 AWS KMS 암호화를 중단시키지 못하도록 버킷 정책을 설정합니다. AWS CLI에서 다음 명령을 실행하여 수행하세요.
echo ‘{
“Version”: “2012-10-17”,
“Id”: “PutObjPolicy”,
“Statement”: [
{
“Sid”: “RequireKMSEncryption”,
“Effect”: “Deny”,
“Principal”: “*”,
“Action”: “s3:PutObject”,
“Resource”: “arn:aws:s3:::kms-encryption-demo/*”,
“Condition”: {
“StringNotLikeIfExists”: {
“s3:x-amz-server-side-encryption-aws-kms-key-id”: “arn:aws:kms:eu-west-2:11111111111:key/d0344c2d-1b23-47ff-917a-3bea854ad3f9”
}
}
}
]
}‘ > bucket_policy.json
aws s3api put-bucket-policy –bucket kms-encryption-demo –policy file://bucket_policy.json
aws s3 cp test-3.log s3://kms-encryption-demo/ –sse
올바른 암호화없이 파일을 업로드하려고 시도하면 암호화 유형이 올바르지 않기 때문에 업로드가 거부됩니다.
이전 작업에서 “test-3.log” 및 지정된 SSE-S3 암호화를 업로드하고자 시도했지만 생성된 KMS 키를 사용한 암호화만 허용하는 정책을 버킷에 연결했기 때문에 이 시도는 실패했습니다.
동일한 작업을 시도하지만 암호화 유형을 지정하지 않으면 문서를 업로드할 수 있습니다.
aws s3 cp test–3.log s3://kms–encryption–demo/
aws s3api head–object —bucket kms–encryption–demo —key test–3.log
객체에 대한 최종 검사를 수행하면 이번에 올바른 암호화가 설정되었음을 알 수 있습니다.
정리
지속적인 청구가 발생하지 않도록 하려면 이 학습서에서 작성한 자원을 정리해야 합니다. AWS CLI에서 다음 명령을 실행하여 수행하세요.
aws kms schedule–key–deletion —key–id d0344c2d–1b23–47ff–917a–3bea854ad3f9 —pending–window–in–days 7
aws iam detach–user–policy —user–name kms–demo —policy–arn arn:
aws:iam::11111111111:policy/kms–demoaws iam delete–user —user–name kms–demo
aws iam delete–policy —policy–arn arn:
aws:iam::11111111111:policy/kms–demo
aws s3 rb s3://kms–encryption–demo –force
결론
이 게시물에서 다음을 시연드렸습니다:
- 버킷에서 기본 암호화를 설정하여 새 객체 업로드를 자동으로 암호화하는 방법
- 과대 허용 액세스 정책에 대해 SSE-KMS가 제공하는 추가 보호
- AWS CLI를 사용하여 소수의 객체에 대한 암호화를 업데이트하고 배치 작업으로 이를 위한 리소스를 지정하는 방법
- 특정 유형의 암호화가 지정된 경우에만 객체 업로드를 허용하는 방법
S3 암호화를 SSE-KMS로 변경하는 방법을 보여주는 이 블로그 게시물에서 설명된 방법을 통해 규정 준수 요구 사항을 충족할 수 있습니다. 이는 데이터 보안에 대한 보다 엄격한 정책을 준수해야 하므로 시간이 지남에 따라 규정 준수 요구 사항이 변경되는 고객에게 도움이 될 수 있습니다. 이는 사용자에게 S3뿐만 아니라 AWS KMS 키에 대한 권한도 필요하기 때문입니다. 이는 Well Architected 보안 기둥에 설명된 대로 심층 방어 접근 방식과 일치합니다.
이러한 방법은 보안 상태를 개선하는 데 사용할 수 있는 추가 제어 기능 중 일부입니다. AWS Config 및 AWS Organizations (SCP 정책) 와 같은 서비스에서 이러한 방법을 사용하면 S3 버킷에 대해 원하는 정책을 모니터링하고 시행하는 데 도움이 되는 추가 제어를 구현할 수 있습니다.
** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.