本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
秘密加密和解密 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 會使用新金鑰重新加密AWSCURRENT
和AWSPREVIOUS
版本。AWSPENDING
為了避免將您鎖定在密碼之外,Secrets Manager 會使用先前的金鑰加密所有現有版本。這表示您可以使用先前的金鑰或新金鑰來解密AWSCURRENT
AWSPENDING
、和AWSPREVIOUS
版本。
為了使其只AWSCURRENT
能通過新的加密密鑰進行解密,請使用新密鑰創建一個新版本的密鑰。然後,為了能夠解密密鑰版本,您必須具有新密鑰的權限。AWSCURRENT
您可以拒絕對的權限, AWS 受管金鑰 aws/secretsmanager
並要求密碼使用客戶管理的金鑰加密。如需詳細資訊,請參閱 範例:拒絕特定 AWS KMS 金鑰以加密密碼。
若要尋找與密碼相關聯的 KMS 金鑰,請在主控台中檢視密碼,或呼叫ListSecrets或DescribeSecret。當密碼與秘 Secrets Manager (aws/secretsmanager
) 相關聯時,這些作業不會傳回 KMS 金鑰識別碼。 AWS 受管金鑰
會加密哪些資料?
Secrets Manager 會加密機密值,但不會加密下列項目:
-
秘密名稱和說明
-
輪換設定
-
與秘密相關聯的 KMS 金鑰 ARN
-
任何附加的 AWS 標籤
加密和解密程序
若要加密秘密中的秘密值,Secrets Manager 使用以下程序。
-
Secrets Manager 會使用 KMS 金鑰的識別碼來呼叫 AWS KMS GenerateDataKey作業,以及 256 位元 AES 對稱金鑰的要求。 AWS KMS 傳回純文字資料金鑰,以及在 KMS 金鑰下加密的該資料金鑰副本。
-
Secrets Manager 會使用純文字資料金鑰和進階加密標準 (AES) 演算法來加密之外的機密值。 AWS KMS使用完畢後,它會盡快從記憶體中移除這些純文字金鑰。
-
Secrets Manager 將加密的資料金鑰存放在秘密的中繼資料,以便可以用來解密秘密值。不過,沒有 Secrets Manager API 會傳回加密的秘密或加密的資料金鑰。
若要解密加密秘密值:
-
Secrets Manager 會呼叫「 AWS KMS 解密」作業,並傳入加密的資料金鑰。
-
AWS KMS 使用 KMS 金鑰做為密碼來解密資料金鑰。它會傳回純文字資料金鑰。
-
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 操作。
-
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
-
Secrets Manager 會呼叫DescribeKey作業,以決定當您在秘密管理員主控台中建立或編輯密碼時是否列出 KMS 金鑰。
- 驗證對 KMS 金鑰的存取
-
在建立或變更與秘密關聯的 KMS 金鑰後,Secrets Manager 會使用指定的 CMK 來呼叫
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 範 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
,以使用新金鑰重新加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" }