Chiffrement des données de journaux dans CloudWatch Logs à l'aide d'AWS Key Management Service - Amazon CloudWatch Logs

Chiffrement des données de journaux dans CloudWatch Logs à l'aide d'AWS Key Management Service

Les données du groupe de journaux sont toujours chiffrées dans CloudWatch Logs. Par défaut, CloudWatch Logs utilise un chiffrement côté serveur pour les données au repos du journal. En guise d'alternative, vous pouvez utiliser AWS Key Management Service pour ce chiffrement. Si tel est le cas, le chiffrement est effectué à l'aide d'une clé principale client AWS KMS. Le chiffrement avec AWS KMS est activé au niveau du groupe de journaux en associant une clé principale client à un groupe de journaux, soit pendant la création du groupe de journaux, soit une fois qu'il existe.

Important

CloudWatch Logs prend désormais en charge le contexte de chiffrement, en utilisant kms:EncryptionContext:aws:logs:arn comme clé et ARN du groupe de journaux comme valeur pour cette clé. Si vous disposez de groupes de journaux que vous avez déjà chiffrés avec une clé gérée côté client et que vous souhaitez restreindre son utilisation à un seul compte et groupe de journaux, vous devez affecter une nouvelle clé gérée côté client qui inclut une condition correspondante dans la politique IAM. Pour plus d'informations, consultez Clés AWS KMS et contexte de chiffrement.

Dès lors que vous associez une clé gérée côté client à un groupe de journaux, toutes les données nouvellement ingérées pour le groupe de journaux sont chiffrées à l'aide de cette clé. Ces données sont stockées sous forme chiffrée pendant toute leur période de conservation. CloudWatch Logs déchiffre ces données chaque fois qu'elles sont demandées. CloudWatch Logs doit avoir les autorisations nécessaires sur la clé gérée côté client lorsque des données chiffrées sont demandées.

Si vous dissociez ultérieurement une clé gérée côté client d'un groupe de journaux, CloudWatch Logs chiffre les données nouvellement intégrées à l'aide de la méthode de chiffrement par défaut de CloudWatch Logs. Toutes les données précédemment intégrées qui étaient chiffrées avec la clé gérée côté client restent chiffrées avec le chiffrement côté serveur CloudWatch Logs par défaut.

Important

CloudWatch Logs prend uniquement en charge les clés symétriques gérées côté client. N'utilisez pas de clé asymétrique pour chiffrer les données de vos groupes de journaux. Pour plus d'informations, consultez Utilisation des clés symétriques et asymétriques.

Limites

  • Pour effectuer les étapes suivantes, vous devez disposer des autorisations suivantes : kms:CreateKey, kms:GetKeyPolicy et kms:PutKeyPolicy.

  • L'association et la dissociation d'une clé vis-à-vis d'un groupe de journaux peuvent mettre jusqu'à cinq minutes à être prises en compte.

  • Si vous révoquez l'accès de CloudWatch Logs à une clé associée ou que vous supprimez une clé associée, vos données chiffrées dans CloudWatch Logs ne pourront plus être récupérées.

  • Vous ne pouvez pas associer une clé gérée côté client à un groupe de journaux à l'aide de la console CloudWatch.

Étape 1 : Créer une clé gérée par le client AWS KMS

Pour créer une clé gérée par le client AWS KMS, utilisez la commande create-key suivante :

aws kms create-key

La sortie contient l'ID de clé et l'Amazon Resource Name (ARN) de la clé. Voici un exemple de sortie :

{ "KeyMetadata": { "Origin": "AWS_KMS", "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", "Description": "", "KeyManager": "CUSTOMER", "Enabled": true, "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT", "KeyUsage": "ENCRYPT_DECRYPT", "KeyState": "Enabled", "CreationDate": 1478910250.94, "Arn": "arn:aws:kms:us-west-2:123456789012:key/6f815f63-e628-448c-8251-e40cb0d29f59", "AWSAccountId": "123456789012", "EncryptionAlgorithms": [ "SYMMETRIC_DEFAULT" ] } }

Étape 2 : Définitir les autorisations sur la clé gérée côté client

Par défaut, toutes les clés gérées par le client AWS KMS sont privées. Seul le propriétaire de la ressource peut l'utiliser pour chiffrer et déchiffrer des données. Cependant, le propriétaire de la ressource peut accorder à d'autres utilisateurs et ressources des autorisations d'accès à la clé. Avec cette étape, vous autorisez le mandataire du service CloudWatch à utiliser la clé. Ce mandataire de service doit être situé dans la même région AWS que celle où la clé est stockée.

À titre de bonne pratique, nous vous recommandons de limiter l'utilisation de la clé uniquement aux comptes AWS ou groupes de journaux que vous spécifiez.

Tout d'abord, enregistrez la politique par défaut de votre clé sous policy.json à l'aide de la commande get-key-policy suivante :

aws kms get-key-policy --key-id key-id --policy-name default --output text > ./policy.json

Ouvrez le fichier policy.json dans un éditeur de texte et ajoutez la section en gras à partir de l'une des instructions suivantes. Séparez l'instruction existante de la nouvelle instruction par une virgule. Ces instructions utilisent des sections Condition pour améliorer la sécurité de la clé AWS KMS. Pour plus d'informations, consultez Clés AWS KMS et contexte de chiffrement.

La section Condition de cet exemple restreint la clé à un seul ARN de groupe de journaux.

{ "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Your_account_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Effect": "Allow", "Principal": { "Service": "logs.region.amazonaws.com" }, "Action": [ "kms:Encrypt*", "kms:Decrypt*", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:Describe*" ], "Resource": "*", "Condition": { "ArnEquals": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:region:account-id:log-group:log-group-name" } } } ] }

La section Condition de cet exemple limite l'utilisation de la clé AWS KMS au compte spécifié, mais elle peut être utilisée pour n'importe quel groupe de journaux.

{ "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Your_account_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Effect": "Allow", "Principal": { "Service": "logs.region.amazonaws.com" }, "Action": [ "kms:Encrypt*", "kms:Decrypt*", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:Describe*" ], "Resource": "*", "Condition": { "ArnLike": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:region:account-id:*" } } } ] }

Enfin, ajoutez la stratégie mise à jour à l'aide de la commande put-key-policy suivante :

aws kms put-key-policy --key-id key-id --policy-name default --policy file://policy.json

Étape 3 : Associer un groupe de journaux à une clé gérée côté client

Vous pouvez associer une clé gérée côté client à un groupe de journaux lors de (ou après) sa création.

Pour savoir si une clé gérée côté client est déjà associée à un groupe de journaux, utilisez la commande describe-log-groups suivante :

aws logs describe-log-groups --log-group-name-prefix "log-group-name-prefix"

Si la sortie inclut un champ kmsKeyId, le groupe de journaux est associé à la clé affichée pour la valeur de ce champ.

Pour associer la clé gérée côté client à un groupe de journaux au moment de le créer

Utilisez la commande create-log-group comme suit :

aws logs create-log-group --log-group-name my-log-group --kms-key-id "key-arn"

Pour associer la clé gérée côté client à un groupe de journaux existant

Utilisez la commande associate-kms-key comme suit :

aws logs associate-kms-key --log-group-name my-log-group --kms-key-id "key-arn"

Étape 4 : Dissocier un groupe de journaux d'une clé CMK

Pour dissocier la clé gérée côté client associée à un groupe de journaux, utilisez la commande disassociate-kms-key suivante :

aws logs disassociate-kms-key --log-group-name my-log-group

Clés AWS KMS et contexte de chiffrement

Pour améliorer la sécurité de vos clés AWS Key Management Service et de vos groupes de journaux chiffrés, CloudWatch Logs place désormais les ARN des groupes de journaux dans le contexte de chiffrement utilisé pour chiffrer vos données de journal. Le contexte de chiffrement est un ensemble de paires clé-valeur qui sont utilisées comme données authentifiées supplémentaires. Le contexte de chiffrement vous permet d'utiliser des conditions de politique IAM pour limiter l'accès à votre clé AWS KMS par compte AWS et groupe de journaux. Pour plus d'informations, consultez Contexte de chiffrement et Éléments de politique JSON IAM : Condition.

Nous vous recommandons d'utiliser différentes clés gérées côté client pour chacun de vos groupes de journaux chiffrés.

Si vous avez un groupe de journaux déjà chiffré et que vous souhaitez maintenant le modifier pour utiliser une nouvelle clé gérée côté client qui fonctionne uniquement pour ce groupe de journaux, procédez comme suit.

Pour convertir un groupe de journaux chiffré en vue d'utiliser une clé gérée côté client avec une politique la limitant à ce groupe de journaux

  1. Saisissez la commande suivante pour trouver l'ARN de la clé actuelle du groupe de journaux :

    aws logs describe-log-groups

    La sortie comprend la ligne suivante. Prenez note de l'ARN. Vous devez l'utiliser à l'étape 7.

    ... "kmsKeyId": "arn:aws:kms:us-west-2:123456789012:key/01234567-89ab-cdef-0123-456789abcdef" ...
  2. Entrez la commande suivante pour créer une clé gérée côté client :

    aws kms create-key
  3. Entrez la commande suivante pour enregistrer la stratégie de la nouvelle clé dans un fichier policy.json :

    aws kms get-key-policy --key-id new-key-id --policy-name default --output text > ./policy.json
  4. Utilisez un éditeur de texte pour ouvrir policy.json et ajouter une expression Condition à la stratégie :

    { "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT-ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Effect": "Allow", "Principal": { "Service": "logs.region.amazonaws.com" }, "Action": [ "kms:Encrypt*", "kms:Decrypt*", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:Describe*" ], "Resource": "*", "Condition": { "ArnLike": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:REGION:ACCOUNT-ID:log- group:LOG-GROUP-NAME" } } } ] }
  5. Saisissez la commande suivante pour ajouter la politique mise à jour à la nouvelle clé gérée côté client :

    aws kms put-key-policy --key-id new-key-ARN --policy-name default --policy file://policy.json
  6. Entrez la commande suivante pour associer la stratégie à votre groupe de journaux :

    aws logs associate-kms-key --log-group-name my-log-group --kms-key-id new-key-ARN

    CloudWatch Logs chiffre maintenant toutes les nouvelles données à l'aide de la nouvelle clé.

  7. Ensuite, révoquez toutes les autorisations à l'exception de Decrypt provenant de l'ancienne clé. Tout d'abord, saisissez la commande suivante pour récupérer l'ancienne politique :

    aws kms get-key-policy --key-id old-key-ARN --policy-name default --output text > ./policy.json
  8. Utilisez un éditeur de texte pour ouvrir policy.json et supprimer toutes les valeurs de la liste Action, à l'exception de kms:Decrypt*

    { "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Your_account_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Effect": "Allow", "Principal": { "Service": "logs.region.amazonaws.com" }, "Action": [ "kms:Decrypt*" ], "Resource": "*" } ] }
  9. Saisissez la commande suivante pour ajouter la politique mise à jour à l'ancienne clé :

    aws kms put-key-policy --key-id old-key-ARN --policy-name default --policy file://policy.json