키 정책의 AWS 서비스에 대한 권한
다수의 AWS 서비스는 AWS KMS keys를 사용하여 관리하는 리소스를 보호합니다. 서비스가 AWS 소유 키 또는 AWS 관리형 키를 사용하는 경우, 서비스가 이러한 KMS 키에 대한 키 정책을 설정하고 유지 관리합니다.
그러나 고객 관리형 키와 함께 AWS 서비스를 사용하는 경우, 사용자가 키 정책을 설정하고 유지 관리합니다. 이 키 정책은 사용자를 대신하여 리소스를 보호하는 데 필요한 최소 권한을 서비스에 허용해야 합니다. 서비스에 필요한 권한만 제공하는 최소 권한의 원칙을 따르는 것이 좋습니다. 서비스에 필요한 권한이 무엇인지 파악하고 AWS 전역 조건 키 및 AWS KMS 조건 키를 사용하여 권한을 구체화하면 이 작업을 효과적으로 수행할 수 있습니다.
고객 관리형 키에서 서비스에 필요한 권한을 찾으려면 서비스에 대한 암호화 문서를 참조하세요. 예를 들어 Amazon Elastic Block Store(Amazon EBS)에 필요한 권한은 Linux 인스턴스용 Amazon EC2 사용 설명서 및 Windows 인스턴스용 Amazon EC2 사용 설명서의 IAM 사용자의 권한을 참조하세요. Secrets Manager에 필요한 권한은 AWS Secrets Manager 사용 설명서의 KMS 키 사용 권한 부여를 참조하세요.
최소 권한 구현
AWS 서비스에 KMS 키를 사용할 수 있는 권한을 부여하는 경우 서비스가 사용자를 대신하여 액세스해야 하는 리소스에 대해서만 권한이 유효한지 확인합니다. 이 최소 권한 전략은 요청이 AWS 서비스 간에 전달될 때 KMS 키의 무단 사용을 방지하는 데 도움이 됩니다.
최소 권한 전략을 구현하려면 AWS KMS 암호화 컨텍스트 조건 키 및 글로벌 소스 ARN 또는 소스 계정 조건 키를 사용하는 것이 좋습니다.
암호화 컨텍스트 조건 키 사용
AWS KMS 리소스 사용 시 최소 권한을 구현하는 가장 효과적인 방법은 kms:EncryptionContext:context-key 또는 kms:EncryptionContextKeys 조건 키를 보안 주체가 AWS KMS 암호화 작업을 호출할 수 있도록 허용하는 정책에 포함하는 것입니다. 이러한 조건 키는 리소스가 암호화될 때 암호문에 바인딩된 암호화 컨텍스트에 권한을 연결하기 때문에 특히 효과적입니다.
암호화 컨텍스트 조건 키는 정책문의 작업이 CreateGrant이거나 EncryptionContext
파라미터(예: GenerateDataKey 또는 Decrypt와 같은 작업)를 가져오는 AWS KMS 대칭 해독 작업인 경우에만 사용합니다. (지원되는 작업 목록은 kms:EncryptionContext:context-key 또는 kms:EncryptionContextKeys 섹션 참조) 이러한 조건 키를 사용하여 DescribeKey와 같은 다른 작업을 허용하는 경우 권한이 거부됩니다.
리소스를 암호화할 때 서비스에서 사용하는 암호화 컨텍스트로 값을 설정합니다. 이 정보는 일반적으로 서비스 문서의 보안 장에서 확인할 수 있습니다. 예를 들어AWS Proton에 대한 암호화 컨텍스트는 AWS Proton 리소스 및 관련 템플릿을 식별합니다. AWS Secrets Manager 암호화 컨텍스트는 보안 암호와 해당 버전을 식별합니다. Amazon Location에 대한 암호화 컨텍스트는 추적기 또는 컬렉션을 식별합니다.
다음 예제 키 정책문은 Amazon Location Service에서 승인된 사용자를 대신하여 권한 부여를 생성하도록 허용합니다. 이 정책문은 kms:ViaService, kms:CallerAccount 및 kms:EncryptionContext:context-key
조건 키를 사용하여 권한을 제한해 특정 추적기 리소스에 권한을 연결합니다.
{ "Sid": "Allow Amazon Location to create grants on behalf of authorized users", "Effect": "Allow", "Principal": { "AWS": "
arn:aws:iam::111122223333:role/LocationTeam
" }, "Action": "kms:CreateGrant", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "geo.us-west-2.amazonaws.com", "kms:CallerAccount": "111122223333
", "kms:EncryptionContext:aws:geo:arn": "arn:aws:geo:us-west-2:111122223333:tracker/SAMPLE-Tracker
" } } }
aws:SourceArn
또는 aws:SourceAccount
조건 키 사용
키 정책 문의 보안 주체가 AWS 서비스 보안 주체인 경우, kms:EncryptionContext:context-key
조건 키에 추가로 aws:SourceArn 또는 aws:SourceAccount 전역 조건 키를 사용하는 것이 좋습니다. ARN 및 계정 값은 요청이 다른 AWS 서비스에서 AWS KMS로 올 때만 권한 부여 컨텍스트에 포함됩니다. 이러한 조건 조합은 최소 권한을 구현하고 잠재적 혼동된 대리자 시나리오를 방지합니다. 서비스 보안 주체는 일반적으로 키 정책에서 보안 주체로 사용되지 않지만 일부 AWS 서비스(예:AWS CloudTrail) 필요합니다.
aws:SourceArn
또는 aws:SourceAccount
전역 조건 키를 사용하려면 값을 Amazon 리소스 이름(ARN) 또는 암호화되는 리소스의 계정으로 설정합니다. 예를 들어, 추적을 암호화하기 위해 AWS CloudTrail 권한을 부여하는 키 정책문에서 aws:SourceArn
의 값을 추적의 ARN으로 설정합니다. 가능하면 더 구체적인 aws:SourceArn
을 사용합니다. 값을 ARN 또는 와일드카드 문자가 있는 ARN 패턴으로 설정합니다. 리소스의 ARN을 모르면 aws:SourceAccount
를 대신 사용합니다.
리소스 ARN에 AWS KMS 키 정책에 허용되지 않는 문자가 포함된 경우 해당 리소스 ARN을 aws:SourceArn
조건 키의 값에 사용할 수 없습니다. 대신 aws:SourceAccount
조건 키를 사용합니다. 키 정책 문서 규칙에 대한 자세한 내용은 키 정책 형식 섹션을 참조하세요.
다음 예제 키 정책에서 권한을 가져오는 보안 주체는 AWS CloudTrail 서비스 주체인 cloudtrail.amazonaws.com
입니다. 최소 권한을 구현하기 위해 이 정책은 aws:SourceArn
및 kms:EncryptionContext:context-key
조건 키를 사용합니다. 정책문은 CloudTrail이 KMS 키를 사용하여 추적을 암호화하는 데 사용하는 데이터 키를 생성하도록 허용합니다. aws:SourceArn
및 kms:EncryptionContext:context-key
조건은 독립적으로 평가됩니다. 지정된 작업에 KMS 키를 사용하기 위한 요청은 두 조건을 모두 충족해야 합니다.
서비스의 권한을 예제 계정(111122223333) 및 us-west-2
리전의 finance
추적으로 제한하기 위해, 이 정책문은 aws:SourceArn
조건 키를 특정 추적의 ARN에 대해 설정합니다. 조건문은 ArnEquals 연산자를 사용하여 일치하는 경우 ARN의 모든 요소가 독립적으로 평가되도록 합니다. 또한 예제에서는 kms:EncryptionContext:context-key
조건 키를 사용하여 권한을 특정 계정 및 리전의 추적으로 제한합니다.
이 키 정책을 사용하기 전에 예제 계정 ID, 리전 및 추적 이름을 계정의 유효한 값으로 바꿉니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Allow CloudTrail to encrypt logs", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "kms:GenerateDataKey", "Resource": "*", "Condition": { "ArnEquals": { "aws:SourceArn": [ "arn:aws:cloudtrail:
us-west-2
:111122223333
:trail/finance
" ] }, "StringLike": { "kms:EncryptionContext:aws:cloudtrail:arn": [ "arn:aws:cloudtrail:*:111122223333
:trail/*" ] } } } ] }