秘密加密和解密 AWS Secrets Manager - AWS Secrets Manager

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

秘密加密和解密 AWS Secrets Manager

Secrets Manager 使用包絡加密與 AWS KMS 金鑰資料金鑰來保護每個密碼值。每當密碼中的密碼值發生變更時,Secrets Manager 就會要求新的資料金鑰 AWS KMS 來保護它。資料金鑰將在 KMS 金鑰下加密,並會存放在秘密的中繼資料中。若要解密密碼,秘密管理員會先使用 KMS 金鑰解密加密的資料金鑰。 AWS 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 金鑰,KMS 金鑰上的密碼編譯作業可能需要更長的時間,且較不可靠和耐用,因為請求必須在 AWS外傳輸。

如需變更秘密的加密金鑰的資訊,請參閱 變更密碼的加密金鑰 AWS Secrets Manager

當您變更加密金鑰時,Secrets Manager 會使用新金鑰重新加密AWSCURRENTAWSPREVIOUS版本。AWSPENDING為了避免將您鎖定在密碼之外,Secrets Manager 會使用先前的金鑰加密所有現有版本。這表示您可以使用先前的金鑰或新金鑰來解密AWSCURRENTAWSPENDING、和AWSPREVIOUS版本。

為了使其只AWSCURRENT能通過新的加密密鑰進行解密,請使用新密鑰創建一個新版本的密鑰。然後,為了能夠解密密鑰版本,您必須具有新密鑰的權限。AWSCURRENT

您可以拒絕對的權限, AWS 受管金鑰 aws/secretsmanager並要求密碼使用客戶管理的金鑰加密。如需詳細資訊,請參閱 範例:拒絕特定 AWS KMS 金鑰以加密密碼

若要尋找與密碼相關聯的 KMS 金鑰,請在主控台中檢視密碼,或呼叫ListSecretsDescribeSecret。當密碼與秘 Secrets Manager (aws/secretsmanager) 相關聯時,這些作業不會傳回 KMS 金鑰識別碼。 AWS 受管金鑰

會加密哪些資料?

Secrets Manager 會加密機密值,但不會加密下列項目:

  • 秘密名稱和說明

  • 輪換設定

  • 與秘密相關聯的 KMS 金鑰 ARN

  • 任何附加的 AWS 標籤

加密和解密程序

若要加密秘密中的秘密值,Secrets Manager 使用以下程序。

  1. Secrets Manager 會使用 KMS 金鑰的識別碼來呼叫 AWS KMS GenerateDataKey作業,以及 256 位元 AES 對稱金鑰的要求。 AWS KMS 傳回純文字資料金鑰,以及在 KMS 金鑰下加密的該資料金鑰副本。

  2. Secrets Manager 會使用純文字資料金鑰和進階加密標準 (AES) 演算法來加密之外的機密值。 AWS KMS使用完畢後,它會盡快從記憶體中移除這些純文字金鑰。

  3. Secrets Manager 將加密的資料金鑰存放在秘密的中繼資料,以便可以用來解密秘密值。不過,沒有 Secrets Manager API 會傳回加密的秘密或加密的資料金鑰。

若要解密加密秘密值:

  1. Secrets Manager 會呼叫「 AWS KMS 解密」作業,並傳入加密的資料金鑰。

  2. AWS KMS 使用 KMS 金鑰做為密碼來解密資料金鑰。它會傳回純文字資料金鑰。

  3. Secrets Manager 使用純文字資料金鑰來解密秘密值。接著,它會盡快從記憶體中移除資料金鑰。

KMS 金鑰的許可

Secrets Manager 在密碼編譯操作中使用 KMS 金鑰時,等於是代表正在存取或更新秘密值的使用者執行動作。您可以在 IAM 政策或金鑰政策中授予許可。下列 Secrets Manager 作業需要 AWS KMS 權限。

若要允許 KMS 金鑰僅用於來自 Secrets Manager 的要求,您可以在權限原則中使用公里:ViaService 條件金鑰secretsmanager.<Region>.amazonaws.com值。

您也可以使用加密內容中的金鑰或值作為條件金鑰,以便將 KMS 金鑰用於密碼編譯操作。例如,您可以在 IAM 或金鑰政策文件中使用字串條件運算子,或在授權中使用授權限制。KMS 金鑰授予傳播可能需時 5 分鐘。如需詳細資訊,請參閱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 金鑰,Secret Manager 會要求新的資料金鑰來加密新的密碼值。

RotateSecret業不會呼叫GenerateDataKey,因為它不會變更密碼值。不過,如果 RotateSecret 調用的 Lambda 函數變更了秘密值,其對 PutSecretValue 操作的呼叫會觸發 GenerateDataKey 請求。

解密

Secrets Manager 會呼叫解密操作來回應以下 Secrets Manager 操作。

  • GetSecretValueBatchGetSecretValue— 秘密管理器將秘密值返回給調用者之前解密. 若要解密加密的密碼值,Secrets Manager 會呼叫「 AWS KMS 解密」作業來解密中的加密資料金鑰。接著,使用純文字資料金鑰來解密加密的秘密值。對於批次命令,Secrets Manager 可以重複使用解密的金鑰,因此並非所有呼叫都會產生 Decrypt 要求。

  • PutSecretValueUpdateSecret-大多數PutSecretValueUpdateSecret請求不會觸發Decrypt操作。不過,當 PutSecretValueUpdateSecret 請求嘗試變更現有秘密版本中的秘密值時,Secrets Manager 會解密現有的秘密值並將其與請求中的秘密值進行比較,確認它們相同。這個動作可確保 Secrets Manager 操作為等冪操作。若要解密加密的密碼值,Secrets Manager 會呼叫「 AWS KMS 解密」作業來解密中的加密資料金鑰。接著,使用純文字資料金鑰來解密加密的秘密值。

  • ReplicateSecretToRegions— Secrets Manager 先解密主要區域中的秘密值,然後再使用複本區域中的 KMS 金鑰重新加密密密碼值。

加密

Secrets Manager 會呼叫 Encrypt 操作,回應以下 Secrets Manager 操作:

  • UpdateSecret— 如果您變更 KMS 金鑰,Secrets Manager 會使用新金鑰重新加密保護AWSCURRENTAWSPREVIOUS、和AWSPENDING秘密版本的資料金鑰。

  • ReplicateSecretToRegions— 秘密管理員會在複寫期間使用複本區域中的 KMS 金鑰重新加密資料金鑰。

DescribeKey

Secrets Manager 會呼叫DescribeKey作業,以決定當您在秘密管理員主控台中建立或編輯密碼時是否列出 KMS 金鑰。

驗證對 KMS 金鑰的存取

在建立或變更與秘密關聯的 KMS 金鑰後,Secrets Manager 會使用指定的 CMK 來呼叫 GenerateDataKeyDecrypt 操作。這些呼叫會確認呼叫者擁有使用 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 帳戶建立 IAM 政策,以允許使用者檢視 KMS 金鑰屬性和撤銷授權。

  • 雖然 Secrets Manager 不會使用授權來取得 KMS 金鑰的存取權,但政策也允許 Secrets 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 加密內容包含兩個名稱值對。

  • SecretARN – 第一個名稱值對會識別秘密。金鑰為 SecretARN。值是秘密的 Amazon Resource Name (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 Resource Name (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 金鑰的識別碼。

{ "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 會傳送「加密」 AWS KMS 要求AWSCURRENT,以使用新金鑰重新加AWSPENDINGAWSPREVIOUS、和密碼版本。當您將秘密複寫到其他區域時,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" }