密鑰策略是基於資源的策略,用於控制哪些阿里雲帳號、RAM使用者、RAM角色有許可權來管理或使用KMS密鑰,KMS執行個體中的每個密鑰必須有且只有一個密鑰策略。本文介紹密鑰策略的詳細資料。
密鑰策略與存取控制RAM的權限原則的關係
密鑰策略支援將當前阿里雲帳號(密鑰所屬的阿里雲帳號)下的RAM使用者、RAM角色設定為管理員或使用者,將其他阿里雲帳號下的RAM使用者、RAM角色設定為使用者。
除了在KMS上設定密鑰策略外,您也可以在存取控制RAM上設定基於身份的策略,用於指定阿里雲帳號、RAM使用者、RAM角色可以管理或使用哪些密鑰。具體操作,請參見為RAM使用者授權、為RAM角色授權、Key Management Service自訂權限原則參考。
當阿里雲帳號、RAM身份(RAM使用者或RAM角色)通過阿里雲控制台、OpenAPI或CLI發起KMS資源訪問請求時,都需要執行權限原則的判定流程,根據判定結果決定是否被允許訪問。具體請參見如下流程圖和說明。
判定結果遵循如下原則:
如果是當前阿里雲帳號下的RAM使用者、RAM角色:判定結果A或者判定結果B中,有一個是允許(Allow)且無Explicit Deny(顯式拒絕),即允許管理或使用該密鑰。
說明當前阿里雲帳號,即密鑰建立者的阿里雲帳號。您可以通過如下方式查看密鑰建立者:
通過控制台:登入Key Management Service控制台,在密钥管理頁面,進入密鑰詳情頁面,查看创建者。
通過OpenAPI:調用DescribeKey介面,響應訊息中的
Creator即建立者。
關於Explicit Deny(顯式拒絕)、Implicit Deny(隱式拒絕)的詳細介紹,請參見權限原則判定流程。
如果是其他阿里雲帳號下的RAM使用者、RAM角色:判定結果A和判定結果B,必須都是允許(Allow),才允許使用該密鑰。
通過上述判斷流程,您可以瞭解到:
如果您想允許當前阿里雲帳號下的RAM使用者、RAM角色管理或使用密鑰,只需在KMS側設定密鑰策略允許其管理或使用密鑰,或者在RAM側設定權限原則允許其管理或使用密鑰。
如果您想允許其他阿里雲帳號下的RAM使用者、RAM角色使用密鑰,不僅需要在KMS側設定密鑰策略允許其使用密鑰,同時還要在RAM側設定權限原則允許其使用密鑰。
注意事項
僅KMS執行個體中的密鑰支援通行金鑰策略。您可在建立密鑰時設定密鑰策略,也可在建立後進行修改,具體請參見建立密鑰、設定密鑰策略。
如果您授權給其他阿里雲帳號下的RAM使用者、RAM角色,會消耗KMS執行個體的訪問管理數量配額,按阿里雲帳號個數計算消耗的配額。如果您後續取消跨帳號的授權且該執行個體沒有其他資源分享給此帳號時,請等待約5分鐘再查看配額,配額會返還。
密鑰策略僅適用於通過KMS服務Endpoint存取金鑰時,對存取權限進行判定。如果您是通過KMS執行個體Endpoint存取金鑰,是否能訪問依賴於應用存取點AAP中配置的權限原則。
密鑰策略的內容長度不超過32768個位元組,且為JSON格式。
密鑰策略說明
完整的密鑰策略包含如下內容:
Version:密鑰策略的版本,目前版本僅支援設定為1。
Statement:密鑰策略的語句,每個密鑰策略包含一個或多個語句。每個語句包含以下幾個參數。
Sid
可選,表示自訂的語句標識符。內容長度小於等於128字元,支援的字元為:大寫英文字母(A-Z)、小寫英文字母(a-z)、數字(0-9),特殊字元( _/+=.@-)。
Effect
必選,表示是允許還是拒絕該策略語句中的許可權。取值為:
Allow或Deny。Principal
必選,表示權限原則的授權主體,支援設定為以下主體:
當前阿里雲帳號,即密鑰所屬的阿里雲帳號。
當前阿里雲帳號下的RAM使用者、RAM角色。
其他阿里雲帳號下的RAM使用者、RAM角色。
重要授權給其他阿里雲帳號下的RAM使用者、RAM角色後,您仍需在存取控制RAM側,使用該RAM使用者、RAM角色的阿里雲帳號為其授權使用該密鑰,RAM使用者、RAM角色才能使用該密鑰。
Action
必選,表示要允許或拒絕的API操作,內容必須以"kms:"開頭。操作許可權列表的範圍如下,如果您設定了列表外的操作,設定後也不會生效。
Resource
必選,取值只能是
*,表示本KMS密鑰。Condition
可選,表示授權生效的限制條件。Condition元素也稱為條件塊(Condition Block),它是由一個或多個條件子句構成。一個條件子句由條件操作類型、條件關鍵字和條件值組成。詳細資料,請參見權限原則基本元素。
格式為
"Condition": {"condition operator": {"condition key": "condition value"}}。
密鑰策略樣本
為阿里雲帳號(119285303511****)下的密鑰設定密鑰策略為例。樣本表示:
允許當前阿里雲帳號(119285303511****)對該密鑰的完整存取,即管理和使用密鑰。
允許當前阿里雲帳號(119285303511****)下的RAM使用者(key_ramuser1)管理密鑰。
允許當前阿里雲帳號(119285303511****)下的RAM使用者(key_ramuser2)、其他阿里雲帳號(190325303126****)下的RAM使用者(key_ramuser3)使用密鑰。
{
"Statement": [
{
"Action": [
"kms:*"
],
"Effect": "Allow",
"Principal": {
"RAM": [
"acs:ram::119285303511****:*"
]
},
"Resource": [
"*"
],
"Sid": "kms default key policy"
},
{
"Action": [
"kms:List*",
"kms:Describe*",
"kms:Create*",
"kms:Enable*",
"kms:Disable*",
"kms:Get*",
"kms:Set*",
"kms:Update*",
"kms:Delete*",
"kms:Cancel*",
"kms:TagResource",
"kms:UntagResource",
"kms:ImportKeyMaterial",
"kms:ScheduleKeyDeletion"
],
"Effect": "Allow",
"Principal": {
"RAM": [
"acs:ram::119285303511****:user/key_ramuser1"
]
},
"Resource": [
"*"
]
},
{
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:GenerateDataKey",
"kms:GenerateAndExportDataKey",
"kms:AsymmetricEncrypt",
"kms:AsymmetricDecrypt",
"kms:DescribeKey",
"kms:DescribeKeyVersion",
"kms:ListKeyVersions",
"kms:ListAliasesByKeyId",
"kms:TagResource"
],
"Effect": "Allow",
"Principal": {
"RAM": [
"acs:ram::119285303511****:user/key_ramuser2",
"acs:ram::190325303126****:user/key_ramuser3"
]
},
"Resource": [
"*"
]
}
],
"Version": "1"
}