Le Blog Amazon Web Services

Chiffrement des messages publiés sur Amazon SNS avec AWS KMS

En lisant cet article, vous apprendrez comment chiffrer vos messages envoyés avec Amazon SNS à l’aide de clés de chiffrement gèrées par AWS KMS.

Amazon Simple Notification Service (Amazon SNS) est un service de messagerie du type publisher/subscriber (ou éditeur/abonné, en français) entièrement géré permettant le découplage des microservices, des systèmes distribués et des applications Serverless (sans serveur, en français). Des entreprises du monde entier utilisent Amazon SNS pour prendre en charge les applications qui gèrent des données privées et sensibles; avec un bon nombre de ces entreprises opérant sur des marchés réglementés. Leurs systèmes sont soumis à des normes de sécurité et de conformité strictes, telles que HIPAA pour les soins de santé, PCI DSS pour la finance et FedRAMP pour le gouvernement. Pour répondre aux exigences des charges de travail hautement critiques, Amazon SNS fournit un chiffrement des messages en transit, basé sur des certificats Amazon Trust Services (ATS), ainsi qu’un chiffrement des messages au repos, à l’aide de clés AWS Key Management Service (AWS KMS).

Chiffrement des messages en transit

L’API d’Amazon SNS est servie via HTTPS et chiffre tous les messages en transit avec des certificats TLS (Transport Layer Security) émis par ATS. Ces certificats vérifient l’identité du serveur d’API Amazon SNS chaque fois qu’une connexion chiffrée est établie. Une autorité de certification (CA, de l’anglais « Certification Authority ») délivre le certificat à un domaine spécifique. Ainsi, lorsqu’un domaine présente un certificat émis par une autorité de certification de confiance, le client API peut déterminer l’établissement d’une connexion sécurisée.

Chiffrement des messages au repos

Amazon SNS prend en charge les topics chiffrés. Lorsque vous publiez des messages dans des topics chiffrés, Amazon SNS utilise des clés principales client (CMK, de l’anglais « Customer Master Key »), optimisées par AWS KMS, pour chiffrer vos messages. Amazon SNS prend en charge les clés CMK gérées par le client et par AWS. Dès qu’Amazon SNS reçoit vos messages, le chiffrement s’effectue sur le serveur, à l’aide d’un algorithme AES-GCM 256 bits. Les messages sont stockés sous forme chiffrée dans plusieurs zones de disponibilité (AZ) pour plus de durabilité et sont déchiffrés juste avant d’être livrés aux points de terminaison abonnés, tels que les files Amazon Simple Queue Service (Amazon SQS), les fonctions AWS Lambda et les webhooks HTTP et HTTPS.

Remarques:

  • Amazon SNS chiffre uniquement le corps des messages que vous publiez. Il ne chiffre pas les métadonnées du message (identifiant, objet, horodatage et attributs), les métadonnées de la rubrique (nom et attributs) ou les métriques de la rubrique. Ainsi, le chiffrement n’affecte pas les opérations d’Amazon SNS, telles que la distribution des messages et le filtrage des messages.
  • Amazon SNS ne chiffre pas rétroactivement les messages qui ont été publiés avant l’activation du chiffrement côté serveur (SSE, de l’anglais « Server Side Encryption ») pour le topic. De plus, tout message chiffré conserve son chiffrement même si vous désactivez le chiffrement de sa rubrique. Cela peut prendre jusqu’à une minute pour que le chiffrement soit effectif une fois activé.
  • Amazon SNS utilise le chiffrement d’enveloppe en interne. Il utilise votre clé CMK configurée pour générer une clé de chiffrement de données (DEK, de l’anglais “Data Encryption Key) de courte durée, puis réutilise cette DEK pour chiffrer vos messages publiés pendant 5 minutes. Lorsque la DEK expire, Amazon SNS effectue automatiquement une rotation pour générer une nouvelle DEK à partir d’AWS KMS.

Cas d’utilisation du chiffrement de topics

Vous pouvez utiliser des topics chiffrés pour divers scénarios, en particulier pour le traitement de données sensibles, telles que les informations personnellement identifiables (PII, de l’anglais “Personally identifiable information”). L’exemple suivant illustre un système de dossier de performances athlétiques destiné aux équipes sportives. Le système gère l’historique des performances, les entrainements, l’alimentation, l’hydratation, le poids, et les notes des directeurs sportifs.

Le système de l’équipe sportive est intégré à trois applications auxiliaires. Chaque application, hébergée sur une instance Amazon Elastic Compute Cloud (Amazon EC2), interroge les séances sportives entrantes à partir d’une file Amazon SQS et prend les mesures suivantes :

  • L’application d’alimentation gère l’hydratation et les régimes alimentaires des athlètes en fonction de leurs contraintes, allergies, et efforts à venir;
  • L’application de planification recommande aux athlètes un temps de repos, des séances de soins, et une prochaine séance à venir en fonction de leur calendrier;
  • L’application de performance ajoute la dernière séance à l’historique et permet d’avoir une prédiction de performance.

Lorsqu’une équipe saisit un nouvel enregistrement dans le dossier d’un athlète, le système publie un message dans un topic Amazon SNS. La rubrique distribue à son tour une copie du message à chacune des trois files Amazon SQS pour un traitement parallèle. Lorsque le message est extrait de la file, l’application d’alimentation propose un régime adapté à l’effort, l’application de planification suggère un temps de repos et une prochaine séance en vue d’un objectif donné, et l’application de performance compare la séance aux précédentes et prédit une performance sur des distances standards.

Le topic Amazon SNS et toutes les files Amazon SQS décrites dans ce cas d’utilisation sont chiffrées à l’aide des clés AWS KMS créées par l’équipe sportive. La communication entre les services est basée sur des appels d’API HTTPS. Ce chiffrement de bout en bout protège les données des athlètes en rendant leur contenu inaccessible aux utilisateurs non autorisés ou anonymes pendant que les messages sont en transit ou au repos.

Création, abonnement et publication de topics chiffrés

Vous pouvez créer un topic chiffré Amazon SNS ou une file chiffrée Amazon SQS en définissant son attribut KmsMasterKeyId, qui attend un identifiant de clé AWS KMS. L’identifiant de clé peut être un ID de clé, un Amazon Resource Name (ARN) de clé ou un alias de clé. Vous pouvez utiliser l’identifiant d’une clé CMK gérée par le client, telle que alias/MyKey, ou la clé CMK gérée par AWS dans votre compte, dont l’alias est alias/aws/sns.

Les extraits de code suivants fonctionnent avec le kit AWS SDK pour Java. Vous pouvez utiliser ces exemples de code pour le scénario du système de santé décrit dans la section précédente.

Premièrement, le Principal publiant les messages vers le topic chiffré Amazon SNS doit disposer d’une autorisation d’accès pour exécuter les opérations AWS KMS GenerateDataKey et Decrypt, en plus de l’opération Amazon SNS Publish. Le mandataire peut être un utilisateur IAM ou un rôle IAM. La stratégie IAM suivante accorde l’autorisation d’accès requise au principal.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:GenerateDataKey",
      "kms:Decrypt",
      "sns:Publish"
    ],
    "Resource": "*"
  }
}

Si vous souhaitez utiliser une clé CMK gérée par vous-même, une clé CMK doit être créée et sécurisée en accordant au publisher de messages l’accès aux mêmes opérations AWS KMS GenerateDataKey et Decrypt. L’autorisation d’accès est accordée à l’aide des stratégies de clé KMS. Le document JSON suivant montre un exemple de stratégie pour la clé CMK gérée par le client et utilisée par le système de gestion des performances sportives. Pour plus d’informations sur la création et la sécurisation des clés, vous pouvez consulter la documentation sur la création de clés et l’utilisation de stratégies de clé dans le AWS Key Management Service Developer Guide.

{
  "Version": "2012-10-17",
  "Id": "DME-System-KeyPolicy",
  "Statement": [
    {
      "Sid": "Allow access for Root User",
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::123456789012:root"},
      "Action": "kms:*",
      "Resource": "*"
    },
    {
      "Sid": "Allow access for Key Administrator",
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::123456789012:user/EMRAdmin"},
      "Action": [
        "kms:Create*",
        "kms:Describe*",
        "kms:Enable*",
        "kms:List*",
        "kms:Put*",
        "kms:Update*",
        "kms:Revoke*",
        "kms:Disable*",
        "kms:Get*",
        "kms:Delete*",
        "kms:TagResource",
        "kms:UntagResource",
        "kms:ScheduleKeyDeletion",
        "kms:CancelKeyDeletion"
      ],
      "Resource": "*"
    },
    {
      "Sid": "Allow access for Key User (SNS IAM User)",
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::123456789012:user/EMRUser"},
      "Action": [
        "kms:GenerateDataKey*",
        "kms:Decrypt"
      ],
      "Resource": "*"
    },
    {
      "Sid": "Allow access for Key User (SNS Service Principal)",
      "Effect": "Allow",
      "Principal": {"Service": "sns.amazonaws.com"},
      "Action": [
        "kms:GenerateDataKey*",
        "kms:Decrypt"
      ],
      "Resource": "*"
    }
  ]
}

L’extrait de code suivant utilise la clé CMK pour créer un topic SNS chiffré, trois files SQS chiffrées et leurs abonnements correspondants.

// Créer des clients API

String userArn = "arn:aws:iam::123456789012:user/EMRUser";

AWSCredentialsProvider credentials = getCredentials(userArn);

AmazonSNS sns = new AmazonSNSClient(credentials);
AmazonSQS sqs = new AmazonSQSClient(credentials);

// Créer une collection d'attributs pour le topic et les files d'attente

String keyId = "arn:aws:kms:us-east-1:123456789012:alias/EMRKey"; 

Map<String, String> attributes = new HashMap<>();
attributes.put("KmsMasterKeyId", keyId);

// Créer un topic chiffré

String topicArn = sns.createTopic(
    new CreateTopicRequest("Patient-Records")
        .withAttributes(attributes)).getTopicArn();

// Créer des files d'attente chiffrées

String billingQueueUrl = sqs.createQueue(
    new CreateQueueRequest("Billing-Integration")
        .withAttributes(attributes)).getQueueUrl();

String schedulingQueueUrl = sqs.createQueue(
    new CreateQueueRequest("Scheduling-Integration")
        .withAttributes(attributes)).getQueueUrl();

String prescriptionQueueUrl = sqs.createQueue(
    new CreateQueueRequest("Prescription-Integration")
        .withAttributes(attributes)).getQueueUrl();

// Créer des abonnements

Topics.subscribeQueue(sns, sqs, topicArn, billingQueueUrl);
Topics.subscribeQueue(sns, sqs, topicArn, schedulingQueueUrl);
Topics.subscribeQueue(sns, sqs, topicArn, prescriptionQueueUrl);

Ensuite, le code suivant compose un message JSON et le publie dans le topic chiffré.

// Publier un message sur un topic chiffré

String messageBody = "{\"patient\": 2911, \"medication\": 151}";
String messageSubject = "Electronic Medical Record - 3472";

sns.publish(
    new PublishRequest()
        .withSubject(messageSubject)
        .withMessage(messageBody)
        .withTopicArn(topicArn));

Remarque: La publication de messages dans des topics chiffrés n’est pas différente de la publication de messages dans des topics standard non-chiffrés. Votre publisher a besoin d’un accès pour effectuer les opérations AWS KMS GenerateDataKey et Decrypt sur la clé CMK configurée. Toute la logique de chiffrement est pris en charge par Amazon SNS et le message est remis à tous les points de terminaison abonnés.

Une copie du message est désormais disponible pour chaque abonnement. L’extrait de code final récupère les messages des files SQS chiffrées.

// Récupérer les messages des files d'attente chiffrées

List<Message> messagesForBilling = sqs.receiveMessage(
    new ReceiveMessageRequest(billingQueueUrl)).getMessages();

List<Message> messagesForScheduling = sqs.receiveMessage(
    new ReceiveMessageRequest(schedulingQueueUrl)).getMessages();

List<Message> messagesForPrescription = sqs.receiveMessage(
    new ReceiveMessageRequest(prescriptionQueueUrl)).getMessages();

Remarque: La récupération de messages à partir de files chiffrées n’est pas différente de la récupération de messages à partir de files standard non-chiffrées. Toute la logique de déchiffrement est pris en charge par Amazon SQS.

Activation de la compatibilité entre les topics chiffrés et les sources d’événements

Plusieurs services AWS peuvent publier des événements dans des topics Amazon SNS. Pour permettre à ces sources d’événements de fonctionner avec des topics chiffrés, vous devez d’abord créer une clé CMK gérée par le client, puis ajouter l’instruction suivante à la stratégie de la clé CMK.

{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Principal": {"Service": "service.amazonaws.com"},
        "Action": ["kms:GenerateDataKey*", "kms:Decrypt"],
        "Resource": "*"
    }]
}

Vous pouvez utiliser un principal de service dont voici quelques examples:

  • Pour Amazon CloudWatch alarms, utilisez cloudwatch.amazonaws.com
  • Pour Amazon CloudWatch events, utilisez events.amazonaws.com
  • Pour Amazon DynamoDB events, utilisez dynamodb.amazonaws.com
  • Pour Amazon Glacier events, utilisez glacier.amazonaws.com
  • Pour Amazon Redshift events, utilisez redshift.amazonaws.com
  • Pour Amazon Simple Email Service events, utilisez ses.amazonaws.com
  • Pour Amazon Simple Storage Service events, utilisez s3.amazonaws.com
  • Pour AWS CodeCommit events, utilisez codecommit.amazonaws.com
  • Pour AWS Database Migration Service events, utilisez dms.amazonaws.com
  • Pour AWS Directory Service events, utilisez ds.amazonaws.com
  • Pour AWS Snowball events, utilisez importexport.amazonaws.com

Les autres sources d’Amazon SNS requièrent un rôle IAM, contrairement à leur principal de service, dans la politique de clé KMS. Ces événements inclus les sources suivantes :

Une fois la stratégie de clé CMK configurée, vous pouvez activer le chiffrement sur le topic à l’aide de la clé CMK, puis fournir l’ARN du topic chiffré à la source de l’événement.

Publication de messages dans des topics chiffrés via des points de terminaison VPC

En plus de chiffrer les messages en transit et au repos, vous pouvez renforcer la sécurité et la confidentialité de vos applications en publiant de manière privée des messages dans des topics chiffrés, sans passer par l’Internet public. Amazon SNS prend en charge les points de terminaison VPC via AWS PrivateLink. Vous pouvez utiliser des points de terminaison VPC pour publier en privé des messages dans des topics standards et chiffrées à partir d’un sous-réseau de votre Amazon Virtual Private Cloud (Amazon VPC). Lorsque vous utilisez AWS PrivateLink, vous n’avez pas besoin de configurer une passerelle Internet, un NAT (de l’anglais Network Address Translation), ou une connexion de réseau privé virtuel (VPN, de l’anglais “Virtual Private Network”). Pour plus d’informations, consultez les rubriques Publication sur Amazon SNS à partir d’Amazon Virtual Private Cloud.

Audit de l’utilisation des topics chiffrés

Vous pouvez utiliser AWS CloudTrail pour auditer l’utilisation des clés AWS KMS appliquées à vos topics Amazon SNS. AWS CloudTrail crée des fichiers journaux qui contiennent un historique des appels d’API AWS et des événements associés pour votre compte. Ces fichiers journaux incluent toutes les requêtes d’API AWS KMS effectuées avec AWS Management Console, les kits SDK et les outils de ligne de commande, ainsi que celles effectuées via les services AWS intégrés. Vous pouvez utiliser ces fichiers journaux pour obtenir des informations sur le moment où votre clé CMK a été utilisée, le type de requête, l’identité du requêteur et l’adresse IP d’où provient la requête. Pour plus d’informations, consultez Journalisation des appels d’API AWS KMS avec AWS CloudTrail.

Conclusion

Amazon SNS fournit un ensemble complet de fonctionnalités de sécurité pour protéger vos données contre les accès non-autorisés et anonymes, y compris le chiffrement des messages en transit avec les certificats Amazon ATS, le chiffrement des messages au repos avec les clés AWS KMS, la confidentialité des messages avec AWS PrivateLink et l’audit avec AWS CloudTrail. De plus, vous pouvez abonner des files chiffrées Amazon SQS à des topics chiffrés Amazon SNS pour établir un chiffrement de bout en bout dans vos cas d’utilisation de messagerie.

Les topics chiffrés Amazon SNS sont disponibles dans toutes les régions AWS où AWS KMS est disponible. Pour plus de détails sur les tarifs, consultez les tarifs AWS KMS et Amazon SNS. Il n’y a pas d’augmentation des frais Amazon SNS pour l’utilisation de topics chiffrés, au-delà des frais de demande AWS KMS encourus. Pour plus d’informations, consultez la documentation sur la protection des données Amazon SNS à l’aide du chiffrement côté serveur.

Commencez dès aujourd’hui en créant vos topics chiffrés Amazon SNS via AWS Management Console et les kits SDK AWS.

Article original rédigé par Michelle Mercier, Product Marketing Leader chez AWS, et Otavio Ferreira, Technical Program Manager chez AWS, et adapté en français par Aurélien Marie, Architecte de Solutions dans les équipes AWS France.