Bonnes pratiques de sécurité pour EC2 Image Builder - EC2 Image Builder

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Bonnes pratiques de sécurité pour EC2 Image Builder

EC2 Image Builder fournit un certain nombre de fonctionnalités de sécurité à prendre en compte lors de l'élaboration et de la mise en œuvre de vos propres politiques de sécurité. Les bonnes pratiques suivantes doivent être considérées comme des instructions générales et ne représentent pas une solution de sécurité complète. Étant donné que ces bonnes pratiques peuvent ne pas être appropriées ou suffisantes pour votre environnement, considérez-les comme des remarques utiles plutôt que comme des recommandations.

  • N'utilisez pas de groupes de sécurité trop permissifs dans les recettes d'Image Builder.

  • Ne partagez pas d'images avec des comptes auxquels vous ne faites pas confiance.

  • Ne publiez pas d'images contenant des données privées ou sensibles.

  • Appliquez tous les correctifs de sécurité Windows ou Linux disponibles lors de la création d'images.

Nous vous recommandons vivement de tester vos images pour valider le niveau de sécurité et les niveaux de conformité en matière de sécurité applicables. Des solutions telles qu'Amazon Inspector peuvent aider à valider le niveau de sécurité et de conformité des images.

IMDSv2 pour les pipelines Image Builder

Lorsque votre pipeline Image Builder s'exécute, il envoie des requêtes HTTP pour lancer des instances EC2 qu'Image Builder utilise pour créer et tester votre image. Pour configurer la version d'IMDS que votre pipeline utilise pour les demandes de lancement, définissez le httpTokens paramètre dans les paramètres de métadonnées de votre instance de configuration d'infrastructure Image Builder.

Note

Nous vous recommandons de configurer toutes les instances EC2 lancées par Image Builder à partir d'un pipeline de manière à utiliser IMDSv2 afin que les demandes de récupération de métadonnées d'instance nécessitent un en-tête de jeton signé.

Pour plus d'informations sur la configuration de l'infrastructure Image Builder, consultezGérer la configuration de l'infrastructure EC2 Image Builder. Pour plus d'informations sur les options de métadonnées d'instance EC2 pour les images Linux, consultez Configurer les options de métadonnées d'instance dans le guide de l'utilisateur Amazon EC2. Pour les images Windows, consultez la section Configurer les options de métadonnées de l'instance dans le guide de l'utilisateur Amazon EC2.

Nettoyage requis après la construction

Une fois qu'Image Builder a terminé toutes les étapes de création de votre image personnalisée, Image Builder prépare l'instance de génération à des fins de test et de création d'image. Avant d'arrêter l'instance de génération pour créer l'instantané, Image Builder effectue le nettoyage suivant pour garantir la sécurité de votre image :

Linux

Le pipeline Image Builder exécute un script de nettoyage pour garantir que l'image finale respecte les meilleures pratiques de sécurité et pour supprimer tous les artefacts ou paramètres de construction qui ne devraient pas être répercutés sur votre instantané. Cependant, vous pouvez ignorer certaines sections du script ou remplacer complètement les données utilisateur. Par conséquent, les images produites par les pipelines Image Builder ne sont pas nécessairement conformes à des critères réglementaires spécifiques.

Lorsque le pipeline a terminé ses étapes de construction et de test, Image Builder exécute automatiquement le script de nettoyage suivant juste avant de créer l'image de sortie.

Important

Si vous remplacez les données utilisateur dans votre recette, le script ne s'exécute pas. Dans ce cas, assurez-vous d'inclure une commande dans vos données utilisateur qui crée un fichier vide nomméperform_cleanup. Image Builder détecte ce fichier et exécute le script de nettoyage avant de créer la nouvelle image.

#!/bin/bash if [[ ! -f {{workingDirectory}}/perform_cleanup ]]; then echo "Skipping cleanup" exit 0 else sudo rm -f {{workingDirectory}}/perform_cleanup fi function cleanup() { FILES=("$@") for FILE in "${FILES[@]}"; do if [[ -f "$FILE" ]]; then echo "Deleting $FILE"; sudo shred -zuf $FILE; fi; if [[ -f $FILE ]]; then echo "Failed to delete '$FILE'. Failing." exit 1 fi; done }; # Clean up for cloud-init files CLOUD_INIT_FILES=( "/etc/sudoers.d/90-cloud-init-users" "/etc/locale.conf" "/var/log/cloud-init.log" "/var/log/cloud-init-output.log" ) if [[ -f {{workingDirectory}}/skip_cleanup_cloudinit_files ]]; then echo "Skipping cleanup of cloud init files" else echo "Cleaning up cloud init files" cleanup "${CLOUD_INIT_FILES[@]}" if [[ $( sudo find /var/lib/cloud -type f | sudo wc -l ) -gt 0 ]]; then echo "Deleting files within /var/lib/cloud/*" sudo find /var/lib/cloud -type f -exec shred -zuf {} \; fi; if [[ $( sudo ls /var/lib/cloud | sudo wc -l ) -gt 0 ]]; then echo "Deleting /var/lib/cloud/*" sudo rm -rf /var/lib/cloud/* || true fi; fi; # Clean up for temporary instance files INSTANCE_FILES=( "/etc/.updated" "/etc/aliases.db" "/etc/hostname" "/var/lib/misc/postfix.aliasesdb-stamp" "/var/lib/postfix/master.lock" "/var/spool/postfix/pid/master.pid" "/var/.updated" "/var/cache/yum/x86_64/2/.gpgkeyschecked.yum" ) if [[ -f {{workingDirectory}}/skip_cleanup_instance_files ]]; then echo "Skipping cleanup of instance files" else echo "Cleaning up instance files" cleanup "${INSTANCE_FILES[@]}" fi; # Clean up for ssh files SSH_FILES=( "/etc/ssh/ssh_host_rsa_key" "/etc/ssh/ssh_host_rsa_key.pub" "/etc/ssh/ssh_host_ecdsa_key" "/etc/ssh/ssh_host_ecdsa_key.pub" "/etc/ssh/ssh_host_ed25519_key" "/etc/ssh/ssh_host_ed25519_key.pub" "/root/.ssh/authorized_keys" ) if [[ -f {{workingDirectory}}/skip_cleanup_ssh_files ]]; then echo "Skipping cleanup of ssh files" else echo "Cleaning up ssh files" cleanup "${SSH_FILES[@]}" USERS=$(ls /home/) for user in $USERS; do echo Deleting /home/"$user"/.ssh/authorized_keys; sudo find /home/"$user"/.ssh/authorized_keys -type f -exec shred -zuf {} \; done for user in $USERS; do if [[ -f /home/"$user"/.ssh/authorized_keys ]]; then echo Failed to delete /home/"$user"/.ssh/authorized_keys; exit 1 fi; done; fi; # Clean up for instance log files INSTANCE_LOG_FILES=( "/var/log/audit/audit.log" "/var/log/boot.log" "/var/log/dmesg" "/var/log/cron" ) if [[ -f {{workingDirectory}}/skip_cleanup_instance_log_files ]]; then echo "Skipping cleanup of instance log files" else echo "Cleaning up instance log files" cleanup "${INSTANCE_LOG_FILES[@]}" fi; # Clean up for TOE files if [[ -f {{workingDirectory}}/skip_cleanup_toe_files ]]; then echo "Skipping cleanup of TOE files" else echo "Cleaning TOE files" if [[ $( sudo find {{workingDirectory}}/TOE_* -type f | sudo wc -l) -gt 0 ]]; then echo "Deleting files within {{workingDirectory}}/TOE_*" sudo find {{workingDirectory}}/TOE_* -type f -exec shred -zuf {} \; fi if [[ $( sudo find {{workingDirectory}}/TOE_* -type f | sudo wc -l) -gt 0 ]]; then echo "Failed to delete {{workingDirectory}}/TOE_*" exit 1 fi if [[ $( sudo find {{workingDirectory}}/TOE_* -type d | sudo wc -l) -gt 0 ]]; then echo "Deleting {{workingDirectory}}/TOE_*" sudo rm -rf {{workingDirectory}}/TOE_* fi if [[ $( sudo find {{workingDirectory}}/TOE_* -type d | sudo wc -l) -gt 0 ]]; then echo "Failed to delete {{workingDirectory}}/TOE_*" exit 1 fi fi # Clean up for ssm log files if [[ -f {{workingDirectory}}/skip_cleanup_ssm_log_files ]]; then echo "Skipping cleanup of ssm log files" else echo "Cleaning up ssm log files" if [[ $( sudo find /var/log/amazon/ssm -type f | sudo wc -l) -gt 0 ]]; then echo "Deleting files within /var/log/amazon/ssm/*" sudo find /var/log/amazon/ssm -type f -exec shred -zuf {} \; fi if [[ $( sudo find /var/log/amazon/ssm -type f | sudo wc -l) -gt 0 ]]; then echo "Failed to delete /var/log/amazon/ssm" exit 1 fi if [[ -d "/var/log/amazon/ssm" ]]; then echo "Deleting /var/log/amazon/ssm/*" sudo rm -rf /var/log/amazon/ssm fi if [[ -d "/var/log/amazon/ssm" ]]; then echo "Failed to delete /var/log/amazon/ssm" exit 1 fi fi if [[ $( sudo find /var/log/sa/sa* -type f | sudo wc -l ) -gt 0 ]]; then echo "Deleting /var/log/sa/sa*" sudo shred -zuf /var/log/sa/sa* fi if [[ $( sudo find /var/log/sa/sa* -type f | sudo wc -l ) -gt 0 ]]; then echo "Failed to delete /var/log/sa/sa*" exit 1 fi if [[ $( sudo find /var/lib/dhclient/dhclient*.lease -type f | sudo wc -l ) -gt 0 ]]; then echo "Deleting /var/lib/dhclient/dhclient*.lease" sudo shred -zuf /var/lib/dhclient/dhclient*.lease fi if [[ $( sudo find /var/lib/dhclient/dhclient*.lease -type f | sudo wc -l ) -gt 0 ]]; then echo "Failed to delete /var/lib/dhclient/dhclient*.lease" exit 1 fi if [[ $( sudo find /var/tmp -type f | sudo wc -l) -gt 0 ]]; then echo "Deleting files within /var/tmp/*" sudo find /var/tmp -type f -exec shred -zuf {} \; fi if [[ $( sudo find /var/tmp -type f | sudo wc -l) -gt 0 ]]; then echo "Failed to delete /var/tmp" exit 1 fi if [[ $( sudo ls /var/tmp | sudo wc -l ) -gt 0 ]]; then echo "Deleting /var/tmp/*" sudo rm -rf /var/tmp/* fi # Shredding is not guaranteed to work well on rolling logs if [[ -f "/var/lib/rsyslog/imjournal.state" ]]; then echo "Deleting /var/lib/rsyslog/imjournal.state" sudo shred -zuf /var/lib/rsyslog/imjournal.state sudo rm -f /var/lib/rsyslog/imjournal.state fi if [[ $( sudo ls /var/log/journal/ | sudo wc -l ) -gt 0 ]]; then echo "Deleting /var/log/journal/*" sudo find /var/log/journal/ -type f -exec shred -zuf {} \; sudo rm -rf /var/log/journal/* fi sudo touch /etc/machine-id
Windows

Une fois que le pipeline Image Builder a personnalisé les images Windows, il exécute l'utilitaire Microsoft Sysprep. Ces actions suivent les AWS meilleures pratiques en matière de renforcement et de nettoyage de l'image.

Remplacer le script de nettoyage Linux

Image Builder crée des images sécurisées par défaut et suit nos meilleures pratiques en matière de sécurité. Toutefois, certains cas d'utilisation plus avancés peuvent vous obliger à ignorer une ou plusieurs sections du script de nettoyage intégré. Si vous devez ignorer une partie du nettoyage, nous vous recommandons vivement de tester votre AMI de sortie pour garantir la sécurité de votre image.

Important

Le fait de sauter des sections dans le script de nettoyage peut entraîner l'inclusion d'informations sensibles, telles que les détails du compte du propriétaire ou les clés SSH dans l'image finale, et dans toute instance lancée à partir de cette image. Vous pouvez également rencontrer des problèmes lors du lancement dans différentes zones de disponibilité, régions ou comptes.

Le tableau suivant décrit les sections du script de nettoyage, les fichiers supprimés dans cette section et les noms de fichiers que vous pouvez utiliser pour signaler une section qu'Image Builder doit ignorer. Pour ignorer une section spécifique du script de nettoyage, vous pouvez utiliser le module d'action du CreateFile composant ou une commande dans vos données utilisateur (en cas de remplacement) pour créer un fichier vide portant le nom indiqué dans la colonne Nom de fichier de la section Ignorer.

Note

Les fichiers que vous créez pour ignorer une section du script de nettoyage ne doivent pas comporter d'extension de fichier. Par exemple, si vous souhaitez ignorer la CLOUD_INIT_FILES section du script, mais que vous créez un fichier nomméskip_cleanup_cloudinit_files.txt, Image Builder ne reconnaîtra pas le fichier ignoré.

Entrée

Section de nettoyage

Fichiers supprimés

Ignorer le nom du fichier de section

CLOUD_INIT_FILES

/etc/sudoers.d/90-cloud-init-users

/etc/locale.conf

/var/log/cloud-init.log

/var/log/cloud-init-output.log

skip_cleanup_cloudinit_files

INSTANCE_FILES

/etc/.updated

/etc/aliases.db

/etc/hostname

/var/lib/misc/postfix.aliasesdb-stamp

/var/lib/postfix/master.lock

/var/spool/postfix/pid/master.pid

/var/.updated

/var/cache/yum/x86_64/2/.gpgkeyschecked.yum

skip_cleanup_instance_files

SSH_FILES

/etc/ssh/ssh_host_rsa_key

/etc/ssh/ssh_host_rsa_key.pub

/etc/ssh/ssh_host_ecdsa_key

/etc/ssh/ssh_host_ecdsa_key.pub

/etc/ssh/ssh_host_ed25519_key

/etc/ssh/ssh_host_ed25519_key.pub

/root/.ssh/authorized_keys

/home/<all users>/.ssh/authorized_keys;

skip_cleanup_ssh_files

INSTANCE_LOG_FILES

/var/log/audit/audit.log

/var/log/boot.log

/var/log/dmesg

/var/log/cron

skip_cleanup_instance_log_files

TOE_FILES

{{workingDirectory}}/TOE_*

skip_cleanup_toe_files

SSM_LOG_FILES

/var/log/amazon/ssm/*

skip_cleanup_ssm_log_files