Chiffrement et déchiffrement de secret dans AWS Secrets Manager
Secrets Manager utilise le chiffrement d'enveloppe avec les clés AWS KMS et des clés de données pour protéger les valeurs de secret. Chaque fois que la valeur secrète d'un secret change, Secrets Manager demande une nouvelle clé de données à AWS KMS pour le protéger. La clé de données est chiffrée sous une clé KMS et ensuite stockée dans les métadonnées du secret. Pour déchiffrer le secret, Secrets Manager doit d'abord déchiffrer la clé de données chiffrée à l'aide de la clé KMS dans AWS KMS.
Secrets Manager n'utilise pas la clé KMS pour chiffrer la valeur du secret directement. Au lieu de cela, il utilise la clé KMS pour générer et chiffrer une symétrique AES (Advanced Encryption Standard) 256 bits Clé de données et utilise la clé de données pour chiffrer la valeur du secret. Secrets Manager utilise la clé de données en texte brut pour chiffrer la valeur du secret en dehors d'AWS KMS, puis la supprime de la mémoire. Il stocke la copie chiffrée de la clé de données dans les métadonnées du secret.
Lorsque vous créez un secret, vous pouvez choisir n'importe quelle clé de chiffrement symétrique gérée par le client dans le Compte AWS et la région, ou vous pouvez utiliser la Clé gérée par AWS pour Secrets Manager (aws/secretsmanager
). Si vous choisissez le Clé gérée par AWS aws/secretsmanager
et qu'il n'existe pas encore, Secrets Manager le crée et l'associe au secret. Vous pouvez utiliser la même clé KMS ou d'autres clés KMS pour chaque secret dans votre compte. Vous pouvez utiliser différentes clés KMS pour définir des autorisations personnalisées sur les clés d'un groupe de secrets, ou si vous souhaitez contrôler des opérations spécifiques pour ces clés. Secrets Manager ne prend en charge que les clés KMS de chiffrement symétriques. Si vous utilisez une clé KMS dans une boutique de clés externe, les opérations cryptographiques sur la clé KMS peuvent prendre plus de temps et être moins fiables et durables, car la demande doit être transmise à l'extérieur d'AWS.
Vous pouvez modifier la clé de chiffrement d'un secret dans la console, dans AWS CLI ou un kit SDK AWS avec UpdateSecret. Lorsque vous modifiez la clé de chiffrement, Secrets Manager chiffre de nouveau les clés de données qui protègent les versions du secret associées aux étiquettes intermédiaires AWSCURRENT
, AWSPENDING
, et AWSPREVIOUS
sous la nouvelle clé de chiffrement. Pour les versions rechiffrées, vous pouvez utiliser l'ancienne clé ou la nouvelle clé pour déchiffrer le secret lorsque vous le récupérez. Lorsque la valeur du secret change, Secrets Manager la chiffre sous la nouvelle clé.
Pour trouver la clé KMS associée à un secret, affichez le secret dans la console ou appelez ListSecrets ou DescribeSecret. Lorsque le secret est associé à Clé gérée par AWS pour Secrets Manager (aws/secretsmanager
), ces opérations ne renvoient pas d'identifiant de clé KMS.
Rubriques
Qu'est-ce qui est chiffré ?
Secrets Manager chiffre la valeur secrète, mais il ne chiffre pas les éléments suivants :
-
Le nom et la description du secret
-
Paramètres de rotation
-
L'ARN de la clé KMS associée au secret
-
Toutes les balises AWS attachées
Processus de chiffrement et déchiffrement
Pour chiffrer la valeur de secret dans un secret, Secrets Manager utilise le processus suivant.
-
Secrets Manager appelle l'opération AWS KMS GenerateDataKey avec l'ID de la clé KMS du secret et une demande de clé symétrique AES 256 bits. AWS KMS renvoie une clé de données en texte brut et une copie de cette clé de données chiffrée sous la clé KMS.
-
Secrets Manager utilise la clé de données en texte brut et l'algorithme AES (Advanced Encryption Standard) pour chiffrer la valeur du secret en dehors d'AWS KMS. Il supprime la clé en texte brut de la mémoire dès que possible après l'avoir utilisée.
-
Secrets Manager stocke la clé de données chiffrée dans les métadonnées du secret afin qu'elle soit disponible pour déchiffrer la valeur du secret. Toutefois, aucune des API Secrets Manager ne renvoie le secret chiffré ou la clé de données chiffrée.
Pour déchiffrer une valeur de secret chiffrée :
-
Secrets Manager appelle l'opération AWS KMS Decrypt et lui transmet la clé de données chiffrée.
-
AWS KMS utilise la clé KMS du secret pour déchiffrer cette clé de données. Il renvoie la clé de données en texte brut.
-
Secrets Manager utilise la clé de données en texte brut pour déchiffrer la valeur du secret. Puis il supprime la clé de données de la mémoire dès que possible.
Comment Secrets Manager utilise votre clé KMS
Secrets Manager utilise la clé principale client (clé KMS) associée à un secret pour générer une clé de données pour chaque valeur de secret. Secrets Manager utilise également la clé CMK pour déchiffrer cette clé de données lorsqu'il a besoin de déchiffrer la valeur du secret chiffrée. Vous pouvez suivre les demandes et les réponses dans les événements AWS CloudTrail, Amazon CloudWatch Logs et les journaux d'activité d'audit.
Les opérations Secrets Manager suivantes déclenchent une demande d'utilisation de votre clé KMS.
- GenerateDataKey
-
Secrets Manager appelle l'opération AWS KMS GenerateDataKey en réponse aux opérations Secrets Manager.
-
CreateSecret – Si le nouveau secret inclut une valeur de secret, Secrets Manager demande une nouvelle clé de données pour la chiffrer.
-
PutSecretValue– Secrets Manager demande une nouvelle clé de données pour chiffrer la valeur de secret spécifiée.
-
UpdateSecret – Si vous changez la valeur du secret ou la clé KMS, Secrets Manager demande une nouvelle clé de données pour chiffrer la nouvelle valeur de secret.
Note
L'opération RotateSecret n'appelle pas
GenerateDataKey
, car elle ne modifie pas la valeur du secret. Toutefois, si la fonction Lambda queRotateSecret
appelle modifie la valeur du secret, son appel à l'opérationPutSecretValue
déclenche une requêteGenerateDataKey
. -
- Decrypt
-
Secrets Manager appelle l'opération Decrypt en réponse aux opérations Secrets Manager.
-
GetSecretValue – Secrets Manager déchiffre la valeur du secret avant de la renvoyer à l'appelant. Pour déchiffrer une valeur de secret chiffrée, Secrets Manager appelle l'opération AWS KMS Decrypt pour déchiffrer la clé de données chiffrée dans le secret. Ensuite, il utilise la clé de données en texte brut pour déchiffrer la valeur du secret chiffrée.
-
PutSecretValue et UpdateSecret – La plupart des demandes
PutSecretValue
etUpdateSecret
ne déclenchent pas d'opérationDecrypt
. Toutefois, lorsqu'une demandePutSecretValue
ouUpdateSecret
tente de modifier la valeur de secret dans une version existante d'un secret, Secrets Manager déchiffre la valeur du secret existante et la compare à la valeur du secret dans la demande afin de confirmer qu'elles sont identiques. Cette action permet de s'assurer que les opérations de Secrets Manager sont idempotentes. Pour déchiffrer une valeur de secret chiffrée, Secrets Manager appelle l'opération AWS KMS Decrypt pour déchiffrer la clé de données chiffrée dans le secret. Ensuite, il utilise la clé de données en texte brut pour déchiffrer la valeur du secret chiffrée.
-
- Encrypt
-
Secrets Manager appelle l'opération Encrypt en réponse aux opérations suivantes de Secrets Manager :
-
UpdateSecret : si vous modifiez la clé KMS, Secrets Manager chiffre de nouveau la clé de données qui protège les versions
AWSCURRENT
,AWSPREVIOUS
, etAWSPENDING
du secret avec la nouvelle clé. -
ReplicateSecrettoRegions : Secrets Manager chiffre de nouveau la clé de données lors de la réplication à l'aide de la clé KMS de la région de réplication.
-
- DescribeKey (Décrire la clé)
-
Secrets Manager appelle l'opération DescribeKey pour déterminer la clé KMS doit être répertoriée lorsque vous créez ou modifiez un secret dans la console Secrets Manager.
- Validation de l'accès à la clé KMS
-
Lorsque vous établissez ou modifiez la clé KMS associée au secret,
GenerateDataKey
appelle les opérations Secrets Manager etDecrypt
avec la clé KMS spécifiée. Ces appels confirment que l'appelant a l'autorisation d'utiliser la clé KMS pour ces opérations. Secrets Manager ignore les résultats de ces opérations ; il ne les utilise pas dans les opérations de chiffrement.Vous pouvez identifier ces appels de validation, car la valeur de la clé
SecretVersionId
de contexte de chiffrement dans ces requêtes estRequestToValidateKeyAccess
.Note
Par le passé, les appels de validation Secrets Manager n'incluaient pas de contexte de chiffrement. Vous pouvez trouver des appels sans contexte de chiffrement dans des journaux AWS CloudTrail plus anciens.
Autorisations pour la clé KMS
Lorsque Secrets Manager utilise une clé KMS dans les opérations de chiffrement, il agit au nom de l'utilisateur qui accède à la valeur de secret ou la met à jour. Vous pouvez accorder ces autorisations dans une politique IAM ou une stratégie de clé. Les opérations suivantes de Secrets Manager nécessitent des autorisations AWS KMS :
Pour autoriser que la clé KMS ne soit utilisée que pour les demandes provenant de Secrets Manager, dans la stratégie d'autorisation, vous pouvez utiliser la clé de condition kms:ViaService avec la valeur secretsmanager.
.<Region>
.amazonaws.com
Vous pouvez également utiliser les clés ou les valeurs du contexte de chiffrement comme condition d'utilisation de la clé KMS pour les opérations de chiffrement. Par exemple, vous pouvez utiliser un opérateur de condition de chaîne dans un document de stratégie IAM ou de clé, ou utiliser une contrainte d'octroi dans un octroi.
Stratégie de clé de Clé gérée par AWS (aws/secretsmanager
)
La stratégie de clé de la clé gérée par Clé gérée par AWS Secrets Manager (aws/secretsmanager
) accorde aux utilisateurs l'autorisation d'utiliser la clé KMS pour les opérations spécifiées uniquement quand effectue la demande pour le compte de l'utilisateur. La stratégie de clé n'autorise pas tous les utilisateurs à utiliser la clé KMS directement.
Cette politique de clé, comme les politiques de toutes les Clés gérées par AWS, est établie par le service. Vous ne pouvez pas modifier la politique de clé, mais vous pouvez l'afficher à tout moment. Pour plus d'informations, consultez Affichage d'une stratégie de clé.
Les instructions de politique de la politique de clé ont l'effet suivant :
-
Elles autorisent les utilisateurs du compte à utiliser la clé KMS pour les opérations de chiffrement uniquement lorsque la demande vient de Secrets Manager en leur nom. La clé de condition
kms:ViaService
applique cette restriction. -
Autorise le compte AWS à créer des stratégies IAM qui permettent aux utilisateurs d'afficher les propriétés de clé KMS et de révoquer des octrois.
-
Bien que Secrets Manager n'utilise pas d'octrois pour obtenir l'accès à la clé KMS, la stratégie autorise également Secrets Manager à créer des octrois pour la clé KMS au nom de l'utilisateur et autorise le compte à révoquer tous les octrois qui autorisent Secrets Manager à utiliser la clé KMS. Ces éléments sont standard dans le document de stratégie d'une Clé gérée par AWS.
Voici un exemple de stratégie de clé gérée par Clé gérée par AWS pour Secrets Manager.
{ "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": "*" } ] }
Contexte de chiffrement de Secrets Manager
Un contexte de chiffrement est un ensemble de paires clé-valeur qui contiennent des données non secrètes arbitraires. Lorsque vous incluez un contexte de chiffrement dans une demande de chiffrement de données, AWS KMS lie de manière chiffrée le contexte de chiffrement aux données chiffrées. Pour déchiffrer les données, vous devez transmettre le même contexte de chiffrement.
Dans ses requêtes GenerateDataKey et Decrypt à AWS KMS, Secrets Manager utilise un contexte de chiffrement avec deux paires nom-valeur qui identifient le secret et sa version, comme illustré dans l'exemple suivant. Les noms ne varient pas, mais les valeurs de contexte de chiffrement combinées sont différentes pour chaque valeur de secret.
"encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1" }
Vous pouvez utiliser le contexte de chiffrement pour identifier ces opérations de chiffrement dans les enregistrements d'audit et les journaux, tels qu' AWS CloudTrail et Amazon CloudWatch Logs, et en tant que condition pour l'autorisation dans les stratégies et les octrois.
Le contexte de chiffrement Secrets Manager se compose de deux paires nom-valeur.
-
SecretARN – La première paire nom–valeur identifie le secret. La clé est
SecretARN
. La valeur est l'Amazon Resource Name (ARN) du secret."SecretARN": "
ARN of an Secrets Manager secret
"Par exemple si l'ARN du secret est
arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3
, le contexte de chiffrement inclura la paire suivante."SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3"
-
SecretVersionId – La deuxième paire nom–valeur identifie la version du secret. La clé est
SecretVersionId
. La valeur est l'ID de version."SecretVersionId": "
<version-id>
"Par exemple si l'ID de version du secret est
EXAMPLE1-90ab-cdef-fedc-ba987SECRET1
, le contexte de chiffrement inclura la paire suivante."SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1"
Lorsque vous établissez ou modifiez la clé KMS pour un secret, Secrets Manager envoie les demandes GenerateDataKey et Decrypt à AWS KMS pour valider le fait que l'appelant soit autorisé à utiliser la clé KMS pour ces opérations. Il ignore les réponses ; il ne les utilise pas sur la valeur du secret.
Dans le cadre de ces requêtes de validation, la valeur de SecretARN
est l'ARN réel du secret, mais la valeur de SecretVersionId
est RequestToValidateKeyAccess
, comme illustré dans l'exemple de contexte de chiffrement suivant. Cette valeur spéciale vous permet d'identifier les requêtes de validation dans les journaux et les pistes d'audit.
"encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "RequestToValidateKeyAccess" }
Note
Par le passé, les demandes de validation Secrets Manager n'incluaient pas de contexte de chiffrement. Vous pouvez trouver des appels sans contexte de chiffrement dans des journaux AWS CloudTrail plus anciens.
Surveillance de l'interaction de Secrets Manager avec AWS KMS
Vous pouvez utiliser AWS CloudTrail et Amazon CloudWatch Logs pour effectuer le suivi des demandes que Secrets Manager envoie pour vous à AWS KMS. Pour plus d'informations sur la surveillance de l'utilisation des secrets, voir Surveillance des secrets d'AWS Secrets Manager.
- GenerateDataKey
-
Lorsque vous créez ou modifiez la valeur du secret dans un secret, Secrets Manager envoie une demande GenerateDataKey à AWS KMS, qui spécifie la clé KMS pour le secret.
L'événement qui enregistre l'opération
GenerateDataKey
est similaire à l'exemple d'événement suivant. La requête est appelée parsecretsmanager.amazonaws.com
. Les paramètres incluent le nom Amazon Resource Name (ARN) de la clé KMS du secret, un spécificateur de clé qui nécessite une clé de 256 bits, et le contexte de chiffrement qui identifie le secret et la version.{ "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" }
- Decrypt
-
Chaque fois que vous obtenez ou modifiez la valeur de secret d'un secret, Secrets Manager envoie une demande Decrypt à AWS KMS pour déchiffrer la clé de données chiffrée.
L'événement qui enregistre l'opération
Decrypt
est similaire à l'exemple d'événement suivant. L'utilisateur est le principal de votre compte AWS qui accède à la table. Les paramètres incluent la clé de table chiffrée (comme un objet blob de texte chiffré) et le contexte de chiffrement qui identifie la table et le compte AWS. AWS KMS dérive l'ID de la clé KMS à partir du texte chiffré.{ "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" }
- Encrypt
-
Lorsque vous modifiez la clé KMS associée à un secret, Secrets Manager envoie une demande Encrypt à AWS KMS pour chiffrer de nouveau les versions
AWSCURRENT
,AWSPREVIOUS
, etAWSPENDING
du secret avec la nouvelle clé. Lorsque vous répliquez un secret vers une autre région, Secrets Manager envoie également une demande Encrypt à AWS KMS.L'événement qui enregistre l'opération
Encrypt
est similaire à l'exemple d'événement suivant. L'utilisateur est le principal de votre compte AWS qui accède à la table.{ "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" }