本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
許可疑難排解 AWS KMS
授權存取KMS金鑰時, 會 AWS KMS 評估下列項目:
-
附加至金鑰的金鑰政策。 KMS金鑰政策一律會在擁有KMS金鑰的 AWS 帳戶 和 區域中定義。
-
連接至提出請求的使用者或角色的所有IAM政策。IAM 管理委託人對KMS金鑰之使用的政策一律會在委託人的 中定義 AWS 帳戶。
-
套用至KMS金鑰的所有授予。
-
其他可能適用於 KMS金鑰使用請求的政策類型,例如AWS Organizations 服務控制政策和VPC端點政策 。這些政策是選用的,依預設允許所有動作,但您可以使用其來限制許可,否則會將許可授予主體。
AWS KMS 會一起評估這些政策機制,以判斷是否允許或拒絕對KMS金鑰的存取。若要這麼做, AWS KMS 會使用類似下列流程圖所示的程序。以下流程圖提供政策評估程序的視覺化呈現。
此流程圖分為兩個部分。這兩個部分應有其先後順序,但評估通常會同時進行。
-
使用授權會根據KMS金鑰政策、IAM政策、授予和其他適用的政策來決定您是否獲允許使用金鑰。
-
金鑰信任決定您是否應該信任允許您使用的KMS金鑰。一般而言,您信任 中的資源 AWS 帳戶。但是, AWS 帳戶 如果您帳戶中的授予或IAM政策允許您使用KMS金鑰,您也可以放心在不同的 中使用KMS金鑰。
您可以使用此流程圖來探索為什麼允許或拒絕呼叫者使用KMS金鑰的許可。您也可以使用它來評估政策和授予。例如,流程圖顯示,在金鑰政策、IAM政策或授予中,透過明確DENY
陳述式或沒有明確ALLOW
陳述式,可以拒絕呼叫者存取。
流程圖可以說明一些常見許可案例。
範例 1:拒絕使用者存取其 中的KMS金鑰 AWS 帳戶
Alice 是 111122223333 AWS 帳戶中的IAM使用者。她被拒絕存取相同 中的KMS金鑰 AWS 帳戶。為什麼 Alice 無法使用 KMS金鑰?
在此情況下,Alice 會被拒絕存取KMS金鑰,因為沒有授予她必要許可的金鑰政策、IAM政策或授予。KMS 金鑰的金鑰政策允許 AWS 帳戶 使用IAM政策來控制KMS對金鑰的存取,但沒有IAM政策允許 Alice 使用KMS金鑰。
請考量此範例的相關政策。
-
Alice 想要使用的KMS金鑰具有預設金鑰政策 。此政策允許 AWS 帳戶擁有KMS金鑰的 使用IAM政策來控制對KMS金鑰的存取。此金鑰政策滿足 ALLOW呼叫者帳戶使用IAM政策來控制對流程圖中金鑰?條件的存取的金鑰政策。
{ "Version" : "2012-10-17", "Id" : "key-test-1", "Statement" : [ { "Sid" : "Delegate to IAM policies", "Effect" : "Allow", "Principal" : { "AWS" : "arn:aws:iam::111122223333:root" }, "Action" : "kms:*", "Resource" : "*" } ] }
-
不過,沒有金鑰政策、IAM政策或授予授予 Alice 使用KMS金鑰的許可。因此,Alice 被拒絕使用 KMS金鑰的許可。
範例 2:使用者擔任的角色具有在不同 中使用KMS金鑰的許可 AWS 帳戶
Bob 是帳戶 1 (111122223333) 的使用者。允許他在密碼編譯操作 中使用 帳戶 2 中的KMS金鑰 (444455556666)。如何實現?
提示
評估跨帳戶許可時,請記住金鑰帳戶中已指定KMS金鑰政策。IAM 政策是在來電者的帳戶中指定,即使來電者位於不同的帳戶中也是如此。如需提供跨帳戶KMS金鑰存取權的詳細資訊,請參閱 允許其他帳戶中的使用者使用KMS金鑰。
-
帳戶 2 中KMS金鑰的金鑰政策允許帳戶 2 使用IAM政策來控制對KMS金鑰的存取。
-
帳戶 2 中KMS金鑰的金鑰政策允許帳戶 1 在密碼編譯操作中使用KMS金鑰。不過,帳戶 1 必須使用IAM政策來授予其主體存取KMS金鑰的權限。
-
帳戶 1 中的IAM政策允許
Engineering
角色使用帳戶 2 中的KMS金鑰進行密碼編譯操作。 -
Bob (帳戶 1 的使用者) 具有採用
Engineering
角色的許可。 -
Bob 可以信任此KMS金鑰,因為即使該金鑰不在他的帳戶中,他帳戶中IAM的政策仍授予他使用此KMS金鑰的明確許可。
考慮讓帳戶 1 中的使用者 Bob 使用帳戶 2 中KMS金鑰的政策。
-
KMS 金鑰的金鑰政策允許 帳戶 2 (444455556666,擁有KMS金鑰的帳戶) 使用IAM政策來控制對KMS金鑰的存取。此金鑰政策也允許帳戶 1 (111122223333) 在密碼編譯操作中使用KMS金鑰 (在政策陳述式的
Action
元素中指定)。不過,在帳戶 1 定義允許主體存取KMS金鑰IAM的政策之前,帳戶 1 中的任何人都無法使用帳戶 2 中的KMS金鑰。在流程圖中,帳戶 2 中的此金鑰政策符合ALLOW呼叫者帳戶使用IAM政策來控制對金鑰的存取嗎?條件。
{ "Id": "key-policy-acct-2", "Version": "2012-10-17", "Statement": [ { "Sid": "Permission to use IAM policies", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow account 1 to use this KMS key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:root" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncryptFrom", "kms:ReEncryptTo", "kms:GenerateDataKey", "kms:GenerateDataKeyWithoutPlaintext", "kms:DescribeKey" ], "Resource": "*" } ] }
-
呼叫者 AWS 帳戶 (帳戶 1,111122223333) 中的IAM政策授予主體許可,以使用帳戶 2 中的KMS金鑰 (444455556666) 執行密碼編譯操作。
Action
元素為主體指派了與帳戶 2 中金鑰政策提供給帳戶 1 相同的許可。若要將這些許可提供給帳戶 1 中的Engineering
角色,此內嵌政策會內嵌於Engineering
角色。像這樣的跨帳戶IAM政策只有在帳戶 2 中KMS金鑰的金鑰政策授予帳戶 1 使用KMS金鑰的許可時才會生效。此外,帳戶 1 賦予其主體執行動作的許可僅限金鑰政策賦予該帳戶的許可。
在流程圖中,這符合政策是否IAM允許呼叫者執行此動作?條件。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncryptFrom", "kms:ReEncryptTo", "kms:GenerateDataKey", "kms:GenerateDataKeyWithoutPlaintext", "kms:DescribeKey" ], "Resource": [ "arn:aws:kms:us-west-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab" ] } ] }
-
最後一個必要元素是帳戶 1 中
Engineering
角色的定義。該角色的AssumeRolePolicyDocument
可讓 Bob採用Engineering
角色。{ "Role": { "Arn": "arn:aws:iam::111122223333:role/Engineering", "CreateDate": "2019-05-16T00:09:25Z", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": { "Principal": { "AWS": "arn:aws:iam::111122223333:user/bob" }, "Effect": "Allow", "Action": "sts:AssumeRole" } }, "Path": "/", "RoleName": "Engineering", "RoleId": "AROA4KJY2TU23Y7NK62MV" } }