저장 데이터 암호화
저장 데이터 암호화 (Encryption at rest)
Amazon ECR이 저장 데이터를 어떻게 암호화하는지, SSE-S3·SSE-KMS·DSSE-KMS 옵션, AWS KMS 통합 동작 방식, 필요한 IAM 권한과 트러블슈팅 방법을 함께 살펴볼게요.
출처: 문서
본문
중요 (Important) 이중 계층 서버 측 암호화(Dual-layer server-side encryption with AWS KMS, DSSE-KMS)는 AWS GovCloud (US) 리전에서만 사용할 수 있어요.
Amazon ECR은 이미지를 Amazon ECR이 관리하는 Amazon S3 버킷에 저장해요. 기본적으로 Amazon ECR은 Amazon S3 관리형 암호화 키를 사용한 서버 측 암호화(server-side encryption)를 사용하며, 이는 AES-256 암호화 알고리즘으로 저장 데이터를 암호화해요. 이는 사용자가 취할 조치가 필요 없으며 추가 비용 없이 제공돼요. 자세한 내용은 Amazon Simple Storage Service User Guide의 Protecting Data Using Server-Side Encryption with Amazon S3-Managed Encryption Keys (SSE-S3)를 참고하세요.
Amazon ECR 리포지토리의 암호화를 더 세밀하게 제어하려면 AWS Key Management Service(AWS KMS)에 저장된 KMS 키를 사용한 서버 측 암호화를 사용할 수 있어요. AWS KMS로 데이터를 암호화할 때, Amazon ECR이 관리하는 기본 AWS 관리형 키(default AWS managed key)를 사용하거나 사용자 자신의 KMS 키(고객 관리형 키, customer managed key)를 지정할 수 있어요. 자세한 내용은 Amazon Simple Storage Service User Guide의 Protecting Data Using Server-Side Encryption with KMS keys Stored in AWS KMS (SSE-KMS)를 참고하세요.
AWS KMS를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)를 선택해 Amazon ECR 이미지에 두 계층의 암호화를 적용할 수도 있어요. DSSE-KMS 옵션은 SSE-KMS와 비슷하지만 한 계층 대신 두 개의 개별 계층을 적용해요. 자세한 내용은 Using dual-layer server-side encryption with AWS KMS keys (DSSE-KMS)를 참고하세요.
각 Amazon ECR 리포지토리에는 리포지토리가 생성될 때 설정되는 암호화 구성(encryption configuration)이 있어요. 각 리포지토리에 서로 다른 암호화 구성을 사용할 수 있어요. 자세한 내용은 Creating an Amazon ECR private repository to store images를 참고하세요.
AWS KMS 암호화가 활성화된 리포지토리를 생성하면 KMS 키를 사용해 리포지토리의 내용을 암호화해요. 또한 Amazon ECR은 Amazon ECR 리포지토리를 grantee principal로 하여 KMS 키에 AWS KMS grant를 추가해요.
Amazon ECR이 AWS KMS와 통합되어 리포지토리를 암호화하고 복호화하는 방식을 개괄적으로 살펴보면 다음과 같아요:
-
리포지토리를 생성할 때 Amazon ECR은 AWS KMS에
DescribeKey호출을 보내 암호화 구성에 지정된 KMS 키의 Amazon Resource Name(ARN)을 검증하고 검색해요. -
Amazon ECR은 AWS KMS에 두 개의
CreateGrant요청을 보내 KMS 키에 grant를 만들어, Amazon ECR이 데이터 키(data key)를 사용해 데이터를 암호화하고 복호화할 수 있게 해요. -
이미지를 푸시할 때 AWS KMS에
GenerateDataKey요청을 보내, 이미지 레이어와 매니페스트(manifest)를 암호화하는 데 사용할 KMS 키를 지정해요. -
AWS KMS는 새 데이터 키를 생성하고 이를 지정된 KMS 키로 암호화한 다음, 암호화된 데이터 키를 이미지 레이어 메타데이터와 이미지 매니페스트와 함께 저장하도록 보내요.
-
이미지를 풀할 때 암호화된 데이터 키를 지정한
Decrypt요청을 AWS KMS에 보내요. -
AWS KMS는 암호화된 데이터 키를 복호화하고 복호화된 데이터 키를 Amazon S3로 보내요.
-
데이터 키는 이미지 레이어가 풀되기 전에 해당 레이어를 복호화하는 데 사용돼요.
-
리포지토리가 삭제되면 Amazon ECR은 AWS KMS에 두 개의
RetireGrant요청을 보내 리포지토리를 위해 생성된 grant를 해지(retire)해요.
고려 사항 (Considerations)
Amazon ECR과 함께 AWS KMS 기반 암호화(SSE-KMS 또는 DSSE-KMS)를 사용할 때 다음 사항을 고려해야 해요.
-
KMS 암호화로 Amazon ECR 리포지토리를 생성하면서 KMS 키를 지정하지 않으면, Amazon ECR은 기본적으로 별칭(alias)이
aws/ecr인 AWS 관리형 키를 사용해요. 이 KMS 키는 KMS 암호화가 활성화된 리포지토리를 처음 생성할 때 계정에 생성돼요. -
리포지토리 암호화 구성(Repository Encryption Configuration)은 리포지토리가 생성된 후에는 변경할 수 없어요.
-
사용자 자신의 KMS 키로 KMS 암호화를 사용할 때, 키는 리포지토리와 같은 리전에 존재해야 해요.
-
Amazon ECR이 사용자를 대신해 생성하는 grant는 해지(revoke)하면 안 돼요. Amazon ECR에 계정의 AWS KMS 키를 사용할 권한을 주는 grant를 해지하면, Amazon ECR은 이 데이터에 접근할 수 없고 리포지토리에 푸시되는 새 이미지를 암호화하거나 풀 때 복호화할 수 없어요. Amazon ECR에 대한 grant를 해지하면 변경이 즉시 적용돼요. 액세스 권한을 해지하려면 grant를 해지하는 대신 리포지토리를 삭제해야 해요. 리포지토리가 삭제되면 Amazon ECR이 사용자를 대신해 grant를 해지해요.
-
AWS KMS 키 사용에는 비용이 수반돼요. 자세한 내용은 AWS Key Management Service pricing을 참고하세요.
-
이중 계층 서버 측 암호화 사용에도 비용이 수반돼요. 자세한 내용은 Amazon ECR pricing을 참고하세요.
필수 IAM 권한 (Required IAM permissions)
AWS KMS를 사용한 서버 측 암호화로 Amazon ECR 리포지토리를 생성하거나 삭제할 때, 필요한 권한은 사용하는 특정 KMS 키에 따라 달라져요.
Amazon ECR용 AWS 관리형 키 사용 시 필수 IAM 권한
기본적으로 Amazon ECR 리포지토리에 AWS KMS 암호화가 활성화되었지만 KMS 키가 지정되지 않은 경우, Amazon ECR용 AWS 관리형 키가 사용돼요. Amazon ECR용 AWS 관리형 KMS 키로 리포지토리를 암호화할 때에는 리포지토리를 생성할 권한이 있는 모든 보안 주체(principal)가 리포지토리의 AWS KMS 암호화도 활성화할 수 있어요. 다만 리포지토리를 삭제하는 IAM 보안 주체는 kms:RetireGrant 권한이 있어야 해요. 이를 통해 리포지토리가 생성될 때 AWS KMS 키에 추가된 grant를 해지할 수 있어요.
다음 예제 IAM 정책을 사용자에게 인라인 정책(inline policy)으로 추가하면, 암호화가 활성화된 리포지토리를 삭제하는 데 필요한 최소 권한을 보장할 수 있어요. 리포지토리를 암호화하는 데 사용된 KMS 키는 resource 파라미터로 지정할 수 있어요.
{
"Version": "2012-10-17",
"Id": "ecr-kms-permissions",
"Statement": [
{
"Sid": "AllowAccessToRetireTheGrantsAssociatedWithTheKey",
"Effect": "Allow",
"Action": [
"kms:RetireGrant"
],
"Resource": "arn:aws:kms:us-west-2:111122223333:key/b8d9ae76-080c-4043-92EXAMPLE"
}
]
}
고객 관리형 키 사용 시 필수 IAM 권한
고객 관리형 키를 사용해 AWS KMS 암호화가 활성화된 리포지토리를 생성할 때, 리포지토리를 생성하는 사용자나 역할의 KMS 키 정책(key policy)과 IAM 정책 모두에 필수 권한이 필요해요. 자신의 KMS 키를 생성할 때 AWS KMS가 생성하는 기본 키 정책을 사용하거나 자신만의 정책을 지정할 수 있어요. 고객 관리형 키가 계정 소유자에 의해 관리 가능한 상태로 유지되도록, KMS 키의 키 정책은 계정의 루트 사용자(root user)에게 모든 AWS KMS 작업을 허용해야 해요. 키 정책에 추가 범위 권한을 추가할 수 있지만, 최소한 루트 사용자에게는 KMS 키를 관리할 권한이 부여되어야 해요. KMS 키를 Amazon ECR에서 시작된 요청에만 사용하도록 허용하려면, 값이 ecr.<region>.amazonaws.com 인 kms:ViaService 조건 키를 사용할 수 있어요.
다음 예제 키 정책은 KMS 키를 소유한 AWS 계정(루트 사용자)에 KMS 키에 대한 전체 액세스 권한을 부여해요. 이 예제 키 정책에 대한 자세한 내용은 AWS Key Management Service Developer Guide의 Allows access to the AWS account and enables IAM policies를 참고하세요.
{
"Version": "2012-10-17",
"Id": "ecr-key-policy",
"Statement": [
{
"Sid": "EnableIAMUserPermissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:root"
},
"Action": "kms:*",
"Resource": "*"
}
]
}
리포지토리를 생성하는 IAM 사용자, IAM 역할 또는 AWS 계정은 필요한 Amazon ECR 권한 외에도 kms:CreateGrant, kms:RetireGrant, kms:DescribeKey 권한이 있어야 해요.
참고 (Note) kms:RetireGrant 권한은 리포지토리를 생성하는 사용자나 역할의 IAM 정책에 추가되어야 해요. kms:CreateGrant 와 kms:DescribeKey 권한은 KMS 키의 키 정책이나 리포지토리를 생성하는 사용자·역할의 IAM 정책 중 하나에 추가할 수 있어요. AWS KMS 권한이 작동하는 방식에 대한 자세한 내용은 AWS Key Management Service Developer Guide의 AWS KMS API permissions: Actions and resources reference를 참고하세요.
다음 예제 IAM 정책을 사용자에게 인라인 정책으로 추가하면, 암호화가 활성화된 리포지토리를 생성하고 작업이 끝나면 삭제하는 데 필요한 최소 권한을 보장할 수 있어요. 리포지토리를 암호화하는 데 사용된 AWS KMS 키는 resource 파라미터로 지정할 수 있어요.
{
"Version": "2012-10-17",
"Id": "ecr-kms-permissions",
"Statement": [
{
"Sid": "AllowAccessToCreateAndRetireTheGrantsAssociatedWithTheKeyAsWellAsDescribeTheKey",
"Effect": "Allow",
"Action": [
"kms:CreateGrant",
"kms:RetireGrant",
"kms:DescribeKey"
],
"Resource": "arn:aws:kms:us-west-2:111122223333:key/b8d9ae76-080c-4043-92EXAMPLE"
}
]
}
리포지토리 생성 시 콘솔에서 KMS 키를 나열할 수 있도록 사용자에게 허용
Amazon ECR 콘솔을 사용해 리포지토리를 생성할 때, 리포지토리의 암호화를 활성화할 때 사용자가 리전의 고객 관리형 KMS 키를 나열할 수 있도록 권한을 부여할 수 있어요. 다음 IAM 정책 예제는 콘솔을 사용할 때 KMS 키와 별칭을 나열하는 데 필요한 권한을 보여줘요.
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": [
"kms:ListKeys",
"kms:ListAliases",
"kms:DescribeKey"
],
"Resource": "*"
}
}
Amazon ECR과 AWS KMS의 상호작용 모니터링
AWS CloudTrail을 사용해 Amazon ECR이 사용자를 대신해 AWS KMS로 보내는 요청을 추적할 수 있어요. CloudTrail 로그의 로그 항목에는 더 쉽게 식별할 수 있도록 암호화 컨텍스트 키(encryption context key)가 포함돼요.
Amazon ECR 암호화 컨텍스트 (Amazon ECR encryption context)
암호화 컨텍스트(encryption context)는 임의의 비밀 아닌 데이터를 포함하는 키-값 쌍(key–value pairs)의 집합이에요. 데이터를 암호화하는 요청에 암호화 컨텍스트를 포함하면, AWS KMS는 암호화 컨텍스트를 암호화된 데이터에 암호화적으로 바인딩(cryptographically bind)해요. 데이터를 복호화하려면 동일한 암호화 컨텍스트를 전달해야 해요.
Amazon ECR은 AWS KMS에 보내는 GenerateDataKey 및 Decrypt 요청에서 리포지토리와 사용 중인 Amazon S3 버킷을 식별하는 두 개의 이름-값 쌍을 가진 암호화 컨텍스트를 사용해요. 이는 다음 예제에서 확인할 수 있어요. 이름은 변하지 않지만, 결합된 암호화 컨텍스트 값은 각 값마다 달라져요.
"encryptionContext": {
"aws:s3:arn": "arn:aws:s3:::us-west-2-starport-manifest-bucket/EXAMPLE1-90ab-cdef-fedc-ba987BUCKET1/sha256:a7766145a775d39e53a713c75b6fd6d318740e70327aaa3ed5d09e0ef33fc3df",
"aws:ecr:arn": "arn:aws:ecr:us-west-2:111122223333:repository/repository-name"
}
암호화 컨텍스트를 사용해 AWS CloudTrail 및 Amazon CloudWatch Logs 같은 감사 기록과 로그에서 이 암호화 작업을 식별하고, 정책과 grant에서 인증을 위한 조건으로 사용할 수 있어요.
Amazon ECR 암호화 컨텍스트는 두 개의 이름-값 쌍으로 구성돼요.
- aws:s3:arn – 첫 번째 이름-값 쌍은 버킷을 식별해요. 키는
aws:s3:arn이고 값은 Amazon S3 버킷의 Amazon Resource Name(ARN)이에요.
"aws:s3:arn": "ARN of an Amazon S3 bucket"
예를 들어 버킷의 ARN이 arn:aws:s3:::us-west-2-starport-manifest-bucket/EXAMPLE1-90ab-cdef-fedc-ba987BUCKET1/sha256:a7766145a775d39e53a713c75b6fd6d318740e70327aaa3ed5d09e0ef33fc3df 라면, 암호화 컨텍스트는 다음 쌍을 포함해요.
"arn:aws:s3:::us-west-2-starport-manifest-bucket/EXAMPLE1-90ab-cdef-fedc-ba987BUCKET1/sha256:a7766145a775d39e53a713c75b6fd6d318740e70327aaa3ed5d09e0ef33fc3df"
- aws:ecr:arn – 두 번째 이름-값 쌍은 리포지토리의 Amazon Resource Name(ARN)을 식별해요. 키는
aws:ecr:arn이고 값은 리포지토리의 ARN이에요.
"aws:ecr:arn": "ARN of an Amazon ECR repository"
예를 들어 리포지토리의 ARN이 arn:aws:ecr:us-west-2:111122223333:repository/repository-name 이라면, 암호화 컨텍스트는 다음 쌍을 포함해요.
"aws:ecr:arn": "arn:aws:ecr:us-west-2:111122223333:repository/repository-name"
트러블슈팅 (Troubleshooting)
콘솔로 Amazon ECR 리포지토리를 삭제할 때, 리포지토리는 성공적으로 삭제됐지만 Amazon ECR이 리포지토리를 위해 KMS 키에 추가한 grant를 해지하지 못하면 다음 오류를 받게 돼요.
The repository [{repository-name}] has been deleted successfully but the grants created by the kmsKey [{kms_key}] failed to be retired
이런 경우 리포지토리에 대한 AWS KMS grant를 직접 해지할 수 있어요.
리포지토리에 대한 AWS KMS grant를 수동으로 해지하려면
- 리포지토리에 사용된 AWS KMS 키에 대한 grant를 나열해요.
key-id값은 콘솔에서 받은 오류에 포함돼 있어요.list-keys명령을 사용해 계정의 특정 리전에 있는 AWS 관리형 키와 고객 관리형 KMS 키를 모두 나열할 수도 있어요.
aws kms list-grants \
--key-id b8d9ae76-080c-4043-9237-c815bfc21dfc
--region us-west-2
출력에는 리포지토리의 Amazon Resource Name(ARN)이 포함된 EncryptionContextSubset 가 포함돼요. 이를 사용해 키에 추가된 grant 중에서 해지하려는 grant를 판별할 수 있어요. 다음 단계에서 grant를 해지할 때 GrantId 값이 사용돼요.
- 리포지토리를 위해 AWS KMS 키에 추가된 각 grant를 해지해요.
GrantId값을 이전 단계 출력의 grant ID로 바꿔요.
aws kms retire-grant \
--key-id b8d9ae76-080c-4043-9237-c815bfc21dfc \
--grant-id GrantId \
--region us-west-2