VPC 엔드포인트를 통해 AWS KMS에 연결 - AWS Key Management Service

VPC 엔드포인트를 통해 AWS KMS에 연결

인터넷을 통해 연결하지 않고 VPC의 프라이빗 엔드포인트를 통해 AWS KMS에 직접 연결할 수 있습니다. VPC 엔드포인트를 사용하는 경우 VPC와 AWS KMS 사이의 통신은 모두 AWS 네트워크에서 수행됩니다.

AWS KMS는 AWS PrivateLink로 구동되는 Amazon Virtual Private Cloud(Amazon VPC) 인터페이스 엔드포인트를 지원합니다. 각 VPC 엔드포인트는 하나 이상의 탄력적 네트워크 인터페이스(ENI) 및 VPC 서브넷의 프라이빗 IP 주소로 표현됩니다.

VPC 인터페이스 엔드포인트는 인터넷 게이트웨이, NAT 디바이스, VPN 연결 또는 AWS Direct Connect 연결 없이 VPC를 AWS KMS에 직접 연결합니다. VPC의 인스턴스는 AWS KMS와 통신하는 데 퍼블릭 IP 주소를 필요로 하지 않습니다.

지원되는 AWS 리전

AWS 리전는 Amazon VPCAWS KMS를 모두 이용할 수 있는 모든 AWS KMS 리전에서 VPC 엔드포인트를 지원합니다.

AWS KMS VPC 엔드포인트 고려 사항

AWS KMS에 대한 인터페이스 VPC 엔드포인트를 설정하기 전에 Amazon VPC 사용 설명서인터페이스 엔드포인트 속성 및 제한 사항 주제를 검토하세요.

VPC 엔드포인트에 대한 AWS KMS 지원에는 다음이 포함됩니다.

  • VPC 인터페이스 엔드포인트를 사용하여 VPC에서 모든 AWS KMS API 작업을 호출할 수 있습니다.

  • AWS KMS FIPS 엔드포인트에 대한 VPC 인터페이스 엔드포인트를 생성할 수 없습니다.

  • AWS CloudTrail 로그를 사용하여 VPC 엔드포인트를 통해 KMS 키 사용을 감사할 수 있습니다. 자세한 내용은 VPC 엔드포인트 로깅 섹션을 참조하세요.

AWS KMS용 VPC 엔드포인트 생성

Amazon VPC 콘솔 또는 Amazon VPC API를 사용하여 AWS KMS에 대한 VPC 엔드포인트를 생성할 수 있습니다. 자세한 내용은 Amazon VPC 사용 설명서인터페이스 엔드포인트 생성을 참조하세요.

AWS KMS용 VPC 엔드포인트를 생성하려면 다음 서비스 이름을 사용합니다.

com.amazonaws.region.kms

예를 들어 미국 서부(오레곤) 리전(us-west-2)에서 서비스 이름은 다음과 같습니다.

com.amazonaws.us-west-2.kms

VPC 엔드포인트를 더 쉽게 사용하려면 VPC 엔드포인트에 프라이빗 DNS 호스트 이름을 사용하도록 설정합니다. 프라이빗 DNS 이름 활성화 옵션을 선택하면 표준 AWS KMS VPC 호스트 이름(https://kms.<region>.amazonaws.com)이 VPC 엔드포인트로 확인됩니다.

이 옵션을 선택하면 VPC 엔드포인트를 더 쉽게 사용할 수 있습니다. AWS SDK 및 AWS CLI는 기본적으로 표준 AWS KMS DNS 호스트 이름을 사용하므로 애플리케이션 및 명령에 VPC 엔드포인트 URL을 지정할 필요가 없습니다.

자세한 내용은 Amazon VPC 사용 설명서인터페이스 엔드포인트를 통해 서비스 액세스를 참조하세요.

AWS KMS VPC 엔드포인트에 연결

AWS KMS SDK, AWS 또는 AWS CLI을 사용하여 VPC 엔드포인트를 통해 AWS Tools for PowerShell에 연결할 수 있습니다. VPC 엔드포인트를 지정하려면 해당 DNS 이름을 사용합니다.

예를 들어 이 list-keys 명령은 endpoint-url 파라미터를 사용해 VPC 엔드포인트를 지정합니다. 이러한 명령을 사용하려면 VPC 엔드포인트 ID 예제를 본인 계정의 ID로 바꿉니다.

$ aws kms list-keys --endpoint-url https://vpce-1234abcdf5678c90a-09p7654s-us-east-1a.ec2.us-east-1.vpce.amazonaws.com

VPC 엔드포인트를 만들 때 프라이빗 호스트 이름을 사용하도록 설정한 경우 CLI 명령 또는 애플리케이션 구성에 VPC 엔드포인트 URL을 지정할 필요가 없습니다. 표준 AWS KMS DNS 호스트 이름(https://kms.<region>.amazonaws.com)이 VPC 엔드포인트로 확인됩니다. AWS CLI와 SDK는 기본적으로 이 호스트 이름을 사용하므로 스크립트 및 애플리케이션에서 아무것도 변경하지 않고 VPC 엔드포인트 사용을 시작할 수 있습니다.

프라이빗 호스트 이름을 사용하려면 VPC의 enableDnsHostnamesenableDnsSupport 속성을 true로 설정해야 합니다. 이러한 속성을 설정하려면 ModifyVpcAttribute 작업을 사용합니다.

VPC 엔드포인트에 대한 액세스 제어

AWS KMS의 VPC 엔드포인트에 대한 액세스를 제어하려면 VPC 엔드포인트 정책을 VPC 엔드포인트에 연결하세요. 엔드포인트 정책은 보안 주체가 VPC 엔드포인트를 사용하여 AWS KMS 리소스에서 AWS KMS 작업을 호출할 수 있는지 여부를 결정합니다.

엔드포인트를 생성할 때 VPC 엔드포인트 정책을 생성할 수 있으며, 언제든지 VPC 엔드포인트 정책을 변경할 수 있습니다. VPC 관리 콘솔이나 CreateVpcEndpoint 또는 ModifyVpcEndpoint 작업을 사용합니다. AWS CloudFormation 템플릿을 사용하여 VPC 엔드포인트 정책을 생성하고 변경할 수도 있습니다. VPC 관리 콘솔 사용에 대한 도움말은 Amazon VPC 사용 설명서인터페이스 엔드포인트 생성인터페이스 엔드포인트 수정을 참조하십시오.

참고

AWS KMS는 2020년 7월부터 VPC 엔드포인트 정책을 지원합니다. 해당 날짜 이전에 생성된 AWS KMS의 VPC 엔드포인트에는 기본 VPC 엔드포인트 정책이 있지만 언제든지 변경할 수 있습니다.

JSON 정책 문서 작성 및 형식 지정에 대한 도움말은 IAM 사용 설명서IAM JSON 정책 참조를 참조하세요.

VPC 엔드포인트 정책 정보

VPC 엔드포인트를 사용하는 AWS KMS 요청이 성공하려면 보안 주체에게 다음 두 소스의 권한이 필요합니다.

  • 키 정책, IAM 정책 또는 권한 부여는 보안 주체에 리소스(KMS 키 또는 별칭)에 대한 작업을 호출할 수 있는 권한을 부여해야 합니다.

  • VPC 엔드포인트 정책은 보안 주체에 엔드포인트를 사용하여 요청을 수행할 권한을 부여해야 합니다.

예를 들어 키 정책은 보안 주체에 특정 KMS 키에서 Decrypt를 호출할 권한을 부여합니다. 그러나 VPC 엔드포인트 정책에서 해당 보안 주체가 엔드포인트를 사용하여 해당 KMS 키에서 Decrypt를 호출하는 것을 허용하지 않을 수 있습니다.

또는 VPC 엔드포인트 정책에서 보안 주체가 엔드포인트를 사용하여 KMS 키에서 DisableKey를 호출할 수 있도록 합니다 그러나 보안 주체가 키 정책, IAM 정책 또는 권한 부여의 권한을 가지고 있지 않으면 요청이 실패합니다.

기본 VPC 엔드포인트 정책

모든 VPC 엔드포인트에는 VPC 엔드포인트 정책이 있지만 정책을 지정할 필요는 없습니다. 정책을 지정하지 않으면 기본 엔드포인트 정책은 엔드포인트의 모든 리소스에 대한 모든 보안 주체의 모든 작업을 허용합니다.

그러나 AWS KMS 리소스의 경우 키 정책, IAM 정책 또는 권한 부여에서 작업을 호출할 수 있는 권한도 있어야 합니다. 따라서 실제로 기본 정책에서는 보안 주체가 리소스에 대한 작업을 호출할 권한이 있는 경우 엔드포인트를 사용하여 해당 작업을 호출할 수도 있다고 말합니다.

{ "Statement": [ { "Action": "*", "Effect": "Allow", "Principal": "*", "Resource": "*" } ] }

보안 주체가 허용된 작업의 하위 집합에 대해서만 VPC 엔드포인트를 사용할 수 있도록 허용하려면 VPC 엔드포인트 정책을 생성하거나 수정합니다.

VPC 엔드포인트 정책 생성

VPC 엔드포인트 정책은 보안 주체가 VPC 엔드포인트를 사용하여 리소스에 대한 작업을 수행할 권한이 있는지 여부를 결정합니다. AWS KMS 리소스의 경우 보안 주체에 키 정책, IAM 정책 또는 권한 부여에서 작업을 수행할 수 있는 권한도 있어야 합니다.

각 VPC 엔드포인트 정책문에는 다음 요소가 필요합니다.

  • 작업을 수행할 수 있는 보안 주체.

  • 수행할 수 있는 작업

  • 작업을 수행할 수 있는 리소스

정책문은 VPC 엔드포인트를 지정하지 않습니다. 대신 정책이 연결되는 모든 VPC 엔드포인트에 적용됩니다. 자세한 내용은 Amazon VPC 사용 설명서VPC 엔드포인트를 통해 서비스에 대한 액세스 제어를 참조하세요.

다음은 AWS KMS에 대한 VPC 엔드포인트 정책의 예제입니다. VPC 엔드포인트에 연결된 경우 이 정책은 ExampleUser가 VPC 엔드포인트를 사용하여 지정된 KMS 키에서 지정된 작업을 호출하도록 허용합니다. 이와 같은 정책을 사용하기 전에 예제 보안 주체와 키 ARN을 계정의 유효한 값으로 바꿉니다.

{ "Statement":[ { "Sid": "AllowDecryptAndView", "Principal": {"AWS": "arn:aws:iam::111122223333:user/ExampleUser"}, "Effect":"Allow", "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:ListAliases", "kms:ListKeys" ], "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ] }

AWS CloudTrail는 VPC 엔드포인트를 사용하는 모든 작업을 기록합니다. 그러나 CloudTrail 로그에는 다른 계정의 보안 주체가 요청한 작업이나 다른 계정의 KMS 키에 대한 작업이 포함되지 않습니다.

따라서 외부 계정의 보안 주체가 VPC 엔드포인트를 사용하여 로컬 계정의 키에 대한 AWS KMS 작업을 호출하지 못하도록 하는 VPC 엔드포인트 정책을 생성할 수 있습니다.

다음 예제에서는 aws:PrincipalAccount 전역 조건 키를 사용하여 보안 주체가 로컬 계정에 있지 않는 한 모든 KMS 키의 모든 작업에 대해 모든 보안 주체에 대한 액세스를 거부합니다. 이와 같은 정책을 사용하기 전에 예제 계정 ID를 유효한 것으로 교체하세요.

{ "Statement": [ { "Sid": "AccessForASpecificAccount", "Principal": {"AWS": "*"}, "Action": "kms:*", "Effect": "Deny", "Resource": "arn:aws:kms:*:111122223333:key/*", "Condition": { "StringNotEquals": { "aws:PrincipalAccount": "111122223333" } } } ] }

VPC 엔드포인트 정책 보기

엔드포인트에 대한 VPC 엔드포인트 정책을 보려면 VPC 관리 콘솔 또는 DescribeVpcEndpoints 작업을 사용합니다.

다음 AWS CLI 명령은 지정된 VPC 엔드포인트 ID를 가진 엔드포인트에 대한 정책을 가져옵니다.

이 명령을 사용하기 앞서 예제 엔드포인트 ID를 계정의 유효한 ID로 바꿉니다.

$ aws ec2 describe-vpc-endpoints \ --query 'VpcEndpoints[?VpcEndpointId==`vpce-1234abcdf5678c90a`].[PolicyDocument]' --output text

정책 설명에 VPC 엔드포인트 사용

요청이 VPC에서 오거나 VPC 엔드포인트를 사용하는 경우 AWS KMS 리소스 및 작업에 대한 액세스를 제어할 수 있습니다. 이렇게 하려면 키 정책 또는 IAM 정책에서 다음 전역 조건 키 중 하나를 사용합니다.

  • aws:sourceVpce 조건 키를 사용해 VPC 엔드포인트를 기반으로 액세스 권한을 부여하거나 액세스를 제한합니다.

  • aws:sourceVpc 조건 키를 사용해 프라이빗 엔드포인트를 호스팅하는 VPC를 기반으로 액세스를 부여하거나 제한합니다.

참고

VPC 엔드포인트를 기반으로 키 정책과 IAM 정책을 작성할 때 주의해야 합니다. 정책문에서 특정 VPC 또는 VPC 엔드포인트의 요청을 요구하는 경우, 사용자를 대신하여 AWS KMS 리소스를 사용하는 통합 AWS 서비스의 요청은 실패할 수 있습니다. 도움말은 AWS KMS 권한으로 정책에서 VPC 엔드포인트 조건 사용를 참조하세요.

또한 요청이 Amazon VPC 엔드포인트에서 이루어지는 경우 aws:sourceIP 조건 키는 유효하지 않습니다. 요청을 VPC 엔드포인트로 제한하려면 aws:sourceVpce 또는 aws:sourceVpc 조건 키를 사용합니다. 자세한 정보는 Amazon VPC 사용 설명서VPC 엔드포인트 - 엔드포인트 사용 제어를 참조하세요.

이러한 전역 조건 키를 사용하여 AWS KMS keys(KMS 키), 별칭, 그리고 특정 리소스에 의존하지 않는 CreateKey와 같은 작업에 대한 액세스를 제어할 수 있습니다.

예를 들어 다음 샘플 키 정책은 요청이 지정된 VPC 엔드포인트를 사용하는 경우에만 사용자가 KMS 키로 일부 암호화 작업을 수행하도록 허용합니다. 사용자가 AWS KMS에 요청하면 요청의 VPC 엔드포인트 ID가 정책의 aws:sourceVpce 조건 키 값과 비교됩니다. 두 값이 일치하지 않는 경우 요청이 거부됩니다.

이와 같은 정책을 사용하려면 자리 표시자 AWS 계정 ID 및 VPC 엔드포인트 ID를 계정에 유효한 값으로 바꿉니다.

{ "Id": "example-key-1", "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM policies", "Effect": "Allow", "Principal": {"AWS":["111122223333"]}, "Action": ["kms:*"], "Resource": "*" }, { "Sid": "Restrict usage to my VPC endpoint", "Effect": "Deny", "Principal": "*", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*" ], "Resource": "*", "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpce-1234abcdf5678c90a" } } } ] }

또한 aws:sourceVpc 조건 키를 사용하여 VPC 엔드포인트가 있는 VPC를 기반으로 KMS 키에 대한 액세스를 제한할 수 있습니다.

다음 샘플 키 정책은 KMS 키가 vpc-12345678에서 이루어진 경우에만 KMS 키를 관리하는 명령을 허용합니다. 또한 KMS 키를 사용하는 명령이 vpc-2b2b2b2b에서 이루어진 경우에만 암호화 작업에 사용할 수 있습니다. 애플리케이션이 하나의 VPC에서 실행 중이지만 관리 용도로 VPC를 하나 더 사용하는 경우, 이와 같은 정책을 사용할 수 있습니다.

이와 같은 정책을 사용하려면 자리 표시자 AWS 계정 ID 및 VPC 엔드포인트 ID를 계정에 유효한 값으로 바꿉니다.

{ "Id": "example-key-2", "Version": "2012-10-17", "Statement": [ { "Sid": "Allow administrative actions from vpc-12345678", "Effect": "Allow", "Principal": {"AWS": "111122223333"}, "Action": [ "kms:Create*","kms:Enable*","kms:Put*","kms:Update*", "kms:Revoke*","kms:Disable*","kms:Delete*", "kms:TagResource", "kms:UntagResource" ], "Resource": "*", "Condition": { "StringEquals": { "aws:sourceVpc": "vpc-12345678" } } }, { "Sid": "Allow key usage from vpc-2b2b2b2b", "Effect": "Allow", "Principal": {"AWS": "111122223333"}, "Action": [ "kms:Encrypt","kms:Decrypt","kms:GenerateDataKey*" ], "Resource": "*", "Condition": { "StringEquals": { "aws:sourceVpc": "vpc-2b2b2b2b" } } }, { "Sid": "Allow read actions from everywhere", "Effect": "Allow", "Principal": {"AWS": "111122223333"}, "Action": [ "kms:Describe*","kms:List*","kms:Get*" ], "Resource": "*", } ] }

VPC 엔드포인트 로깅

AWS CloudTrail는 VPC 엔드포인트를 사용하는 모든 작업을 기록합니다. AWS KMS 요청에 VPC 엔드포인트를 사용하면 요청을 기록하는 AWS CloudTrail 로그 항목에 VPC 엔드포인트 ID가 표시됩니다. 엔드포인트 ID를 사용하여 AWS KMS VPC 엔드포인트의 사용을 감사할 수 있습니다.

그러나 CloudTrail 로그에는 다른 계정의 보안 주체가 요청한 작업이나 다른 계정의 KMS 키 및 별칭에 대한 AWS KMS 작업 요청이 포함되지 않습니다. 또한 VPC를 보호하기 위해 VPC 엔드포인트 정책에 의해 거부되었지만 그렇지 않으면 허용되었을 요청은 AWS CloudTrail에 기록되지 않습니다.

예를 들어, 이 샘플 로그 항목은 VPC 엔드포인트를 사용한 GenerateDataKey 요청을 기록합니다. 로그 항목 끝에 vpcEndpointId 필드가 나타납니다.

{ "eventVersion":"1.05", "userIdentity": { "type": "IAMUser", "principalId": "EX_PRINCIPAL_ID", "arn": "arn:aws:iam::111122223333:user/Alice", "accessKeyId": "EXAMPLE_KEY_ID", "accountId": "111122223333", "userName": "Alice" }, "eventTime":"2018-01-16T05:46:57Z", "eventSource":"kms.amazonaws.com", "eventName":"GenerateDataKey", "awsRegion":"eu-west-1", "sourceIPAddress":"172.01.01.001", "userAgent":"aws-cli/1.14.23 Python/2.7.12 Linux/4.9.75-25.55.amzn1.x86_64 botocore/1.8.27", "requestParameters":{ "keyId":"1234abcd-12ab-34cd-56ef-1234567890ab", "numberOfBytes":128 }, "responseElements":null, "requestID":"a9fff0bf-fa80-11e7-a13c-afcabff2f04c", "eventID":"77274901-88bc-4e3f-9bb6-acf1c16f6a7c", "readOnly":true, "resources":[{ "ARN":"arn:aws:kms:eu-west-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId":"111122223333", "type":"AWS::KMS::Key" }], "eventType":"AwsApiCall", "recipientAccountId":"111122223333", "vpcEndpointId": "vpce-1234abcdf5678c90a" }