透過 VPC 端點連線至 AWS KMS - AWS Key Management Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

透過 VPC 端點連線至 AWS KMS

您可以透過 Virtual Private Cloud (VPC) 內的私有端點直接連線至 AWS KMS。使用介面 VPC 端點時,VPC 和 AWS KMS 之間的通訊完全在 AWS 網路中執行。

AWS KMS 現在支援採用 AWS PrivateLink 技術的 Amazon Virtual Private Cloud (Amazon VPC) 端點。每個 VPC 端點皆會由一個或多個具私有 IP 地址彈性網路界面 (ENI) 來表示,而該界面位於 VPC 子網路中。

界面 VPC 端點可以直接將 VPC 連接至 AWS KMS,無需透過網際網路閘道、NAT 裝置、VPN 連接或 AWS Direct Connect 連線。VPC 中的執行個體不需要公有 IP 地址,即能與 AWS KMS 通訊。

區域

AWS KMS 在支援 AWS KMS 的所有 AWS 區域 中支援 VPC 端點和 VPC 端點政策。

AWS KMS VPC 端點的考量事項

在設定 AWS KMS 的介面 VPC 端點之前,請務必檢閱《AWS PrivateLink 使用者指南》中的介面端點屬性和限制主題。

AWS KMS 支援的 VPC 端點包括下列項目。

  • 您可以使用 VPC 端點從 VPC 中呼叫所有 AWS KMS API 操作

  • 您可建立連接至 AWS KMS 區域端點或 AWS KMSFIPS 端點的介面 VPC 端點。

  • 您可以使用 AWS CloudTrail 日誌,來稽核透過 VPC 端點使用 KMS 金鑰的情況。如需詳細資訊,請參閱 記錄您的 VPC 端點

為 AWS KMS 建立一個 VPC 端點

您可使用 Amazon VPC 主控台或 Amazon VPC API 來為 AWS KMS 建立 VPC 端點。如需詳細資訊,請參閱 《AWS PrivateLink 指南》中的建立介面端點

  • 若要建立 AWS KMS 的 VPC 端點,請使用下列服務名稱:

    com.amazonaws.region.kms

    例如,在美國西部 (奧勒岡) 區域 (us-west-2),服務名稱為:

    com.amazonaws.us-west-2.kms
  • 若要建立連接 AWS KMS FIPS 端點 的 VPC 端點,請採用下列服務名稱:

    com.amazonaws.region.kms-fips

    例如,在美國西部 (奧勒岡) 區域 (us-west-2),服務名稱為:

    com.amazonaws.us-west-2.kms-fips

若要更輕鬆使用 VPC 端點,您可以為 VPC 端點啟用私有 DNS 名稱。如果您選擇 Enable DNS Name (啟用 DNS 名稱) 選項,標準 AWS KMS DNS 主機名稱會解析為您的 VPC 端點。例如,https://kms.us-west-2.amazonaws.com 會解析為連接至服務名稱 com.amazonaws.us-west-2.kms 的 VPC 端點。

此選項可讓您更輕鬆使用 VPC 端點。依預設,AWS 開發套件和 AWS CLI 會使用標準 AWS KMS DNS 主機名稱,因此您不需要在應用程式和命令中指定 VPC 端點 URL。

如需詳細資訊,請參閱《AWS PrivateLink 指南》中的透過介面端點存取服務

連線到 AWS KMS VPC 端點

您可以使用 AWS、AWS CLI 或 AWS Tools for PowerShell 軟體開發套件,透過 VPC 端點連線至 AWS KMS。若要指定 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 主機名稱會解析為您的 VPC 端點。根據預設,AWS CLI 和軟體開發套件會使用此主機名稱,因此您不需要變更您的指令碼和應用程式,就可以開始使用該 VPC 端點連接到 AWS KMS 區域端點。

若要使用私有主機名稱,您 VPC 的 enableDnsHostnamesenableDnsSupport 屬性必須設為 true。若要設定這些屬性,請使用ModifyVpcAttribute作業。如需詳細資訊,請參閱《Amazon VPC 使用者指南》中的檢視和更新 VPC 的 DNS 屬性

控制對 VPC 端點的存取

為此,控制 AWS KMS 對 VPC 端點的存取,將 VPC 端點政策連接到您的 VPC 端點。端點政策會決定委託人是否可以使用 VPC 端點呼叫 AWS KMS 資源上的 AWS KMS 操作。

您可以在建立端點時建立 VPC 端點政策,並且可以隨時變更 VPC 端點政策。使用 VPC 管理主控台或CreateVpcEndpoint或作ModifyVpcEndpoint業。您也可以建立和變更 VPC 端點政策,方法是使用 AWS CloudFormation 範本。如需有關如何使用 VPC 管理主控台的說明,請參閱《AWS PrivateLink 指南》中的建立介面端點修改介面端點

注意

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 端點原則可能會允許主體使用端點呼叫特DisableKey定 KMS 金鑰。但是,如果委託人沒有來自金鑰政策、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 端點政策,以防止外部帳戶中的委託人使用 VPC 端點呼叫本機帳戶中任何金鑰的任何 AWS KMS 操作。

下列範例使用 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 服務所送來的請求可能會失敗。如需協助,請參閱 在政策中使用 VPC 端點條件搭配 AWS KMS 許可

此外,當請求來自 Amazon VPC 端點時,aws:sourceIP 條件索引鍵無效。若要限制對 VPC 端點的請求,請使用 aws:sourceVpceaws:sourceVpc 條件金鑰。如需詳細資訊,請參閱《AWS PrivateLink 指南》中的VPC 端點和 VPC 端點服務的身分與存取管理

您可以使用這些全域條件金鑰來控制對 AWS KMS keys (KMS 金鑰)、別名的存取,以及不依賴於任何特定資源的作業。CreateKey

例如,以下範例金鑰政策只在請求使用指定 VPC 端點時,才允許使用者執行某些密碼編譯操作。使用者對 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 金鑰的存取權。

以下範例金鑰政策只在命令來自 vpc-12345678 時,才允許這些命令管理 KMS 金鑰。此外,它只在命令來自 vpc-2b2b2b2b 時,才允許命令將 KMS 金鑰用於密碼編譯操作。如果應用程式在一個 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 端點的操作。若使用 VPC 端點對 AWS KMS 提出請求,則用來記錄請求的 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" }