本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
秘密加密和解密 AWS Secrets Manager
Secrets Manager 使用包絡加密與 AWS KMS 金鑰和資料金鑰來保護每個密碼值。每當密碼中的密碼值發生變更時,Secrets Manager 就會要求新的資料金鑰 AWS KMS 來保護它。數據密鑰在密鑰下進行加密並存儲在密KMS鑰的元數據中。若要解密密碼,Secrets Manager 會先使用中 AWS KMS的金鑰來解密加密的資料KMS金鑰。
Secrets Manager 不會使用KMS金鑰直接加密密碼值。相反地,它會使用KMS金鑰來產生和加密 256 位元進階加密標準 (AES) 對稱資料金鑰,並使用資料金鑰來加密密碼值。Secret Manager 會使用純文字資料金鑰來加密外部的密碼值 AWS KMS,然後將其從記憶體中移除。它將加密的資料金鑰副本存放在秘密的中繼資料中。
主題
選擇一個 AWS KMS 密鑰
建立密碼時,您可以在 AWS 帳戶 和區域中選擇任何對稱加密客戶管理的金鑰,也可以使用用 AWS 受管金鑰 於 Secrets Manager (aws/secretsmanager
)。如果您選擇 AWS 受管金鑰 aws/secretsmanager
,但它還不存在,Secrets Manager 會建立它,並將其與密碼產生關聯。您可以為帳戶中的每個密碼使用相同的KMS金KMS鑰或不同金鑰。您可能想要使用不同的KMS金鑰來為一組密碼設定金鑰的自訂權限,或者如果您想要稽核這些金鑰的特定作業。Secrets Manager 僅支援對稱式加密KMS金鑰。如果您在外部KMS金鑰存放區中使用金鑰,則金鑰的密碼編譯作業可能需要更長的時間,而且不太可靠且耐用,因為要求必須在外部 AWS傳KMS輸。
如需變更秘密的加密金鑰的資訊,請參閱 變更的加密金鑰 AWS Secrets Manager 秘密。
當您變更加密金鑰時,Secrets Manager 會使用新金鑰重新加密AWSCURRENT
和AWSPREVIOUS
版本。AWSPENDING
為了避免將您鎖定在密碼之外,Secrets Manager 會使用先前的金鑰加密所有現有版本。這表示您可以使用先前的金鑰或新金鑰來解密AWSCURRENT
AWSPENDING
、和AWSPREVIOUS
版本。如果您沒有先前金鑰的kms:Decrypt
權限,當您變更加密金鑰時,Secrets Manager 無法解密密碼版本以重新加密它們。在這種情況下,現有版本不會重新加密。
為了使其只AWSCURRENT
能通過新的加密密鑰進行解密,請使用新密鑰創建一個新版本的密鑰。然後,為了能夠解密密鑰版本,您必須具有新密鑰的權限。AWSCURRENT
您可以拒絕對的權限, AWS 受管金鑰 aws/secretsmanager
並要求密碼使用客戶管理的金鑰加密。如需詳細資訊,請參閱 範例:拒絕加密秘密的特定 AWS KMS 金鑰。
若要尋找與密KMS碼相關聯的金鑰,請在主控台中檢視密碼或呼叫ListSecrets或DescribeSecret。當密碼與 Secrets Manager (aws/secretsmanager
) 相關聯時,這些作業不會傳回KMS金鑰識別碼。 AWS 受管金鑰
會加密哪些資料?
Secrets Manager 會加密機密值,但不會加密下列項目:
-
秘密名稱和說明
-
輪換設定
-
ARN與該密KMS鑰相關聯的密鑰
-
任何附加的 AWS 標籤
加密和解密程序
若要加密秘密中的秘密值,Secrets Manager 使用以下程序。
-
Secrets Manager 會使 AWS KMS GenerateDataKey用密KMS鑰的識別碼和 256 位元AES對稱金鑰的要求來呼叫作業。 AWS KMS 返回一個純文本數據密鑰和該數據密鑰下加密的複本。KMS
-
Secrets Manager 會使用純文字資料金鑰和進階加密標準 (AES) 演算法來加密之外的機密值。 AWS KMS使用完畢後,它會盡快從記憶體中移除這些純文字金鑰。
-
Secrets Manager 將加密的資料金鑰存放在秘密的中繼資料,以便可以用來解密秘密值。但是,沒有任何 Secrets Manager APIs 返回加密的密鑰或加密的數據密鑰。
若要解密加密秘密值:
-
Secrets Manager 會呼叫「 AWS KMS 解密」作業,並傳入加密的資料金鑰。
-
AWS KMS 使用密KMS鑰的密鑰來解密數據密鑰。它會傳回純文字資料金鑰。
-
Secrets Manager 使用純文字資料金鑰來解密秘密值。接著,它會盡快從記憶體中移除資料金鑰。
KMS金鑰的權限
當 Secrets Manager 在密碼編譯作業中使用KMS金鑰時,它會代表存取或更新密碼值的使用者執行。您可以在IAM策略或密鑰策略中授予權限。下列 Secrets Manager 作業需要 AWS KMS 權限。
若要允許金KMS鑰僅用於產生於 Secrets Manager 中的要求,您可以在權限原則中使用 kms: ViaService 條件金鑰與secretsmanager.
值。<Region>
.amazonaws.com
您也可以使用加密內容中的金鑰或值做為使用金KMS鑰進行密碼編譯作業的條件。例如,您可以在IAM或金鑰原則文件中使用字串條件運算子,或在授權中使用 grant 條件約束。KMS金鑰授權傳播最多可能需要五分鐘的時間。如需詳細資訊,請參閱CreateGrant。
Secrets Manager 如何使用您的KMS金鑰
Secrets Manager 會使用您的KMS金鑰呼叫下列 AWS KMS 作業。
- GenerateDataKey
-
Secrets Manager 會呼叫 AWS KMS GenerateDataKey作業以回應下列 Secrets Manager 作業。
-
CreateSecret— 如果新密碼包含秘密值,Secrets Manager 會要求新的資料金鑰加密。
-
PutSecretValue— Secrets Manager 要求新的資料金鑰來加密指定的密碼值。
-
ReplicateSecretToRegions— 要加密複製的密鑰,Secrets Manager 請求一個數據密KMS鑰複本區域中的密鑰。
-
UpdateSecret— 如果您變更密碼值或KMS金鑰,Secrets Manager 會要求新的資料金鑰來加密新的密碼值。
作RotateSecret業不會呼叫
GenerateDataKey
,因為它不會變更密碼值。不過,如果RotateSecret
調用的 Lambda 函數變更了秘密值,其對PutSecretValue
操作的呼叫會觸發GenerateDataKey
請求。 -
- 解密
-
Secrets Manager 會呼叫解密操作來回應以下 Secrets Manager 操作。
-
GetSecretValue和 BatchGetSecretValue— 秘密管理器將秘密值返回給調用者之前解密. 若要解密加密的密碼值,Secrets Manager 會呼叫「 AWS KMS 解密」作業來解密中的加密資料金鑰。接著,使用純文字資料金鑰來解密加密的秘密值。對於批次命令,Secrets Manager 可以重複使用解密的金鑰,因此並非所有呼叫都會產生
Decrypt
要求。 -
PutSecretValue和 UpdateSecret-大多數
PutSecretValue
和UpdateSecret
請求不會觸發Decrypt
操作。不過,當PutSecretValue
或UpdateSecret
請求嘗試變更現有秘密版本中的秘密值時,Secrets Manager 會解密現有的秘密值並將其與請求中的秘密值進行比較,確認它們相同。這個動作可確保 Secrets Manager 操作為等冪操作。若要解密加密的密碼值,Secrets Manager 會呼叫「 AWS KMS 解密」作業來解密中的加密資料金鑰。接著,使用純文字資料金鑰來解密加密的秘密值。 -
ReplicateSecretToRegions— Secrets Manager 會先解密主要區域中的秘密值,然後再使用複本區域中的KMS金鑰重新加密密密碼值。
-
- 加密
-
Secrets Manager 會呼叫 Encrypt 操作,回應以下 Secrets Manager 操作:
-
UpdateSecret— 如果您變更KMS金鑰,Secrets Manager 會使用新金鑰重新加密保護
AWSCURRENT
AWSPREVIOUS
、和AWSPENDING
秘密版本的資料金鑰。 -
ReplicateSecretToRegions— 秘密管理員使用複本區域中的金鑰在複寫期間重新加密資料KMS金鑰。
-
- DescribeKey
-
當您在 Secret Manager 主控台中建立或編輯密KMS碼時,Secrets Manager 會呼叫DescribeKey作業,以決定是否要列出金鑰。
- 驗證金鑰的KMS存取
-
當您建立或變更與密碼相關聯的KMS金鑰時,Secrets Manager 會使用指定的KMS金鑰呼叫
GenerateDataKey
和Decrypt
作業。這些呼叫會確認呼叫者有權使用KMS金鑰進行這些作業。Secrets Manager 會捨棄這些操作的結果,不會在任何密碼編譯操作中使用它們。您可以識別這些驗證呼叫,因為這些請求中
SecretVersionId
金鑰加密內容的值是RequestToValidateKeyAccess
。注意
在過去,Secrets Manager 驗證呼叫不包含加密內容。您可能會在較舊的 AWS CloudTrail 記錄檔中找到沒有加密內容的通話。
AWS 受管金鑰
(aws/secretsmanager
) 的金鑰政策
Secrets Manager (aws/secretsmanager
) 的金鑰原則授予使用者權限,只有當 Secrets Manager 代表使用者提出要求時,才能將KMS金鑰用於指定的作業。 AWS 受管金鑰 金鑰原則不允許任何使用者直接使用KMS金鑰。
此金鑰政策與所有 AWS 受管金鑰 的政策一樣,都是由服務建立。您無法變更金鑰政策,但可以隨時進行檢視。如需詳細資訊,請參閱檢視金鑰政策。
金鑰政策中的政策陳述式具有下列效果:
-
只有當要求來自 Secrets Manager 代表他們時,才允許帳戶中的使用者使用KMS金鑰進行密碼編譯作業。
kms:ViaService
條件金鑰會強制實施此限制。 -
允許 AWS 帳戶建立允許使用者檢視KMS金鑰屬性和撤銷授權的IAM策略。
-
雖然 Secrets Manager 不會使用授權來取得KMS金鑰的存取權,但原則也允許 Secre ts Manager 代表使用者建立KMS金鑰授權,並允許帳戶撤銷任何允許 Secrets Manager 使用KMS金鑰的授權。這些是 AWS 受管金鑰之政策文件的標準元素。
以下是 Secrets Manager 範 AWS 受管金鑰 例的金鑰原則。
{ "Id": "auto-secretsmanager-2", "Version": "2012-10-17", "Statement": [ { "Sid": "Allow access through AWS Secrets Manager for all principals in the account that are authorized to use AWS Secrets Manager", "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:CreateGrant", "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "kms:CallerAccount": "111122223333", "kms:ViaService": "secretsmanager.us-west-2.amazonaws.com" } } }, { "Sid": "Allow access through AWS Secrets Manager for all principals in the account that are authorized to use AWS Secrets Manager", "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": "kms:GenerateDataKey*", "Resource": "*", "Condition": { "StringEquals": { "kms:CallerAccount": "111122223333" }, "StringLike": { "kms:ViaService": "secretsmanager.us-west-2.amazonaws.com" } } }, { "Sid": "Allow direct access to key metadata to the account", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:root" ] }, "Action": [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ], "Resource": "*" } ] }
Secrets Manager 加密內容
加密內容是一組金鑰/值對,其中包含任意非私密資料。當您在加密資料的要求中包含加密內容時, AWS KMS 密碼編譯會將加密內容繫結至加密的資料。若要解密資料,您必須傳遞相同的加密內容。
在其GenerateDataKey和「解密」要求中 AWS KMS,Secrets Manager 會使用具有兩個名稱的加密內容 — 值配對來識別密碼及其版本,如下列範例所示。名稱不會改變,但組合的加密內容值對於每個秘密值都是不同的。
"encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1" }
您可以使用加密內容在稽核記錄和日誌 (例如和 Amazon CloudWatch Logs) 中識別這些加密操作,並做為政策和授權中授權的條件。AWS CloudTrail
Secrets Manager 加密內容包含兩個名稱值對。
-
機密 ARN — 第一個名稱 — 值配對可識別密碼。金鑰為
SecretARN
。該值是秘密的 Amazon 資源名稱(ARN)。"SecretARN": "
ARN of an Secrets Manager secret
"例如,如果密碼ARN的是
arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3
,則加密內容將包含以下配對。"SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3"
-
SecretVersionId— 第二個名稱 — 值配對可識別密碼的版本。金鑰為
SecretVersionId
。值為版本 ID。"SecretVersionId": "
<version-id>
"例如,如果秘密的版本 ID 是
EXAMPLE1-90ab-cdef-fedc-ba987SECRET1
,加密內容會包含下列對組。"SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1"
當您建立或變更密KMS碼的金鑰時,Secrets Manager 會傳送GenerateDataKey並解密 AWS KMS 要求,以驗證呼叫者是否有權使用KMS金鑰進行這些作業。它會捨棄回應;它不會將回應用於秘密值。
在這些驗證要求中,的值SecretARN
是秘密ARN的實際值,但SecretVersionId
值為RequestToValidateKeyAccess
,如下列範例加密內容所示。這個特殊值可協助您識別日誌和稽核線索中的驗證請求。
"encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "RequestToValidateKeyAccess" }
注意
在過去,Secrets Manager 驗證請求不包含加密內容。您可能會在較舊的 AWS CloudTrail 記錄檔中找到沒有加密內容的通話。
監控 Secrets Manager 與 AWS KMS
您可以使用 AWS CloudTrail 和 Amazon CloudWatch 日誌來追蹤 Secrets Manager 代表您傳送 AWS KMS 的請求。如需監控秘密使用情況的詳細資訊,請參閱 監控 AWS Secrets Manager 機密。
- GenerateDataKey
-
當您在密碼中建立或變更密碼值時,Secrets Manager 會傳送指 AWS KMS 定密KMS碼金鑰的GenerateDataKey要求。
記錄
GenerateDataKey
操作的事件類似於以下範例事件。請求由secretsmanager.amazonaws.com
呼叫。這些參數包括密KMS鑰的 Amazon 資源名稱 (ARN)、需要 256 位元金鑰的金鑰說明符,以及識別機密和版本的加密內容。{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2018-05-31T23:23:41Z" } }, "invokedBy": "secretsmanager.amazonaws.com" }, "eventTime": "2018-05-31T23:23:41Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "us-east-2", "sourceIPAddress": "secretsmanager.amazonaws.com", "userAgent": "secretsmanager.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "keySpec": "AES_256", "encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1" } }, "responseElements": null, "requestID": "a7d4dd6f-6529-11e8-9881-67744a270888", "eventID": "af7476b6-62d7-42c2-bc02-5ce86c21ed36", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }
- 解密
-
當您取得或變更密碼的密碼值時,Secrets Manager 會傳送「解密」要求 AWS KMS 來解密加密的資料金鑰。對於批次命令,Secrets Manager 可以重複使用解密的金鑰,因此並非所有呼叫都會產生
Decrypt
要求。記錄
Decrypt
操作的事件類似於以下範例事件。使用者是您 AWS 帳戶中存取資料表的主體。這些參數包括加密的資料表金鑰 (做為密文 Blob),以及識別資料表和帳戶的加密內容。 AWS AWS KMS 從密文中導出KMS密鑰的 ID。{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2018-05-31T23:36:09Z" } }, "invokedBy": "secretsmanager.amazonaws.com" }, "eventTime": "2018-05-31T23:36:09Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-east-2", "sourceIPAddress": "secretsmanager.amazonaws.com", "userAgent": "secretsmanager.amazonaws.com", "requestParameters": { "encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1" } }, "responseElements": null, "requestID": "658c6a08-652b-11e8-a6d4-ffee2046048a", "eventID": "f333ec5c-7fc1-46b1-b985-cbda13719611", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }
- 加密
-
當您變更與密KMS碼相關聯的金鑰時,Secrets Manager 會傳送 En crypt AWS KMS 要求
AWSCURRENT
,以使用新金鑰重新加AWSPENDING
密AWSPREVIOUS
、和密碼版本。當您將秘密複寫到其他區域時,Secrets Manager 也會傳送 Encrypt 請求給 AWS KMS。記錄
Encrypt
操作的事件類似於以下範例事件。使用者是您 AWS 帳戶中存取資料表的主體。{ "eventVersion": "1.08", "userIdentity": { "type": "IAMUser", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "creationDate": "2023-06-09T18:11:34Z", "mfaAuthenticated": "false" } }, "invokedBy": "secretsmanager.amazonaws.com" }, "eventTime": "2023-06-09T18:11:34Z", "eventSource": "kms.amazonaws.com", "eventName": "Encrypt", "awsRegion": "us-east-2", "sourceIPAddress": "secretsmanager.amazonaws.com", "userAgent": "secretsmanager.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-east-2:111122223333:key/EXAMPLE1-f1c8-4dce-8777-aa071ddefdcc", "encryptionAlgorithm": "SYMMETRIC_DEFAULT", "encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:ChangeKeyTest-5yKnKS", "SecretVersionId": "EXAMPLE1-5c55-4d7c-9277-1b79a5e8bc50" } }, "responseElements": null, "requestID": "129bd54c-1975-4c00-9b03-f79f90e61d60", "eventID": "f7d9ff39-15ab-47d8-b94c-56586de4ab68", "readOnly": true, "resources": [ { "accountId": "AWS Internal", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/EXAMPLE1-f1c8-4dce-8777-aa071ddefdcc" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "111122223333", "eventCategory": "Management" }