Best practice di sicurezza per EC2 Image Builder - EC2 Image Builder

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Best practice di sicurezza per EC2 Image Builder

EC2 Image Builder offre una serie di funzionalità di sicurezza da prendere in considerazione durante lo sviluppo e l'implementazione delle proprie politiche di sicurezza. Le seguenti best practice sono linee guida generali e non rappresentano una soluzione di sicurezza completa. Poiché queste best practice potrebbero non essere appropriate o sufficienti per l'ambiente, gestiscile come considerazioni utili anziché prescrizioni.

  • Non utilizzare gruppi di sicurezza eccessivamente permissivi nelle ricette di Image Builder.

  • Non condividete immagini con account di cui non vi fidate.

  • Non rendere pubbliche le immagini che contengono dati privati o sensibili.

  • Applica tutte le patch di sicurezza disponibili per Windows o Linux durante la creazione delle immagini.

Ti consigliamo vivamente di testare le immagini per convalidare il livello di sicurezza e i livelli di conformità di sicurezza applicabili. Soluzioni come Amazon Inspector possono aiutare a convalidare il livello di sicurezza e conformità delle immagini.

Pipeline IMDSv2 per Image Builder

Quando viene eseguita la pipeline di Image Builder, invia richieste HTTP per avviare istanze EC2 che Image Builder utilizza per creare e testare l'immagine. Per configurare la versione di IMDS utilizzata dalla pipeline per le richieste di avvio, imposta il httpTokens parametro nelle impostazioni dei metadati dell'istanza di configurazione dell'infrastruttura Image Builder.

Nota

Ti consigliamo di configurare tutte le istanze EC2 che Image Builder avvia da una build di pipeline per utilizzare IMDSv2 in modo che le richieste di recupero dei metadati dell'istanza richiedano un'intestazione token firmata.

Per ulteriori informazioni sulla configurazione dell'infrastruttura Image Builder, vedere. Gestione della configurazione dell'infrastruttura EC2 Image Builder Per ulteriori informazioni sulle opzioni di metadati delle istanze EC2 per le immagini Linux, consulta Configurare le opzioni dei metadati dell'istanza nella Amazon EC2 User Guide. Per le immagini Windows, consulta Configurare le opzioni dei metadati dell'istanza nella Guida per l'utente di Amazon EC2.

Pulizia post-compilazione richiesta

Dopo che Image Builder ha completato tutti i passaggi di creazione dell'immagine personalizzata, Image Builder prepara l'istanza di compilazione per il test e la creazione di immagini. Prima di chiudere l'istanza di compilazione per creare l'istantanea, Image Builder esegue la seguente pulizia per garantire la sicurezza dell'immagine:

Linux

La pipeline Image Builder esegue uno script di pulizia per garantire che l'immagine finale segua le migliori pratiche di sicurezza e per rimuovere eventuali artefatti o impostazioni di build che non devono essere trasferiti all'istantanea. Tuttavia, è possibile saltare sezioni dello script o sovrascrivere completamente i dati dell'utente. Pertanto, le immagini prodotte dalle pipeline di Image Builder non sono necessariamente conformi a criteri normativi specifici.

Quando la pipeline completa le fasi di compilazione e test, Image Builder esegue automaticamente il seguente script di pulizia appena prima di creare l'immagine di output.

Importante

Se sovrascrivi i dati utente nella tua ricetta, lo script non viene eseguito. In tal caso, assicurati di includere nei dati utente un comando che crei un file vuoto denominatoperform_cleanup. Image Builder rileva questo file ed esegue lo script di pulizia prima di creare la nuova immagine.

#!/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

Dopo che la pipeline Image Builder ha personalizzato le immagini di Windows, esegue l'utilità Microsoft Sysprep. Queste azioni seguono le AWS migliori pratiche per il rafforzamento e la pulizia dell'immagine.

Sostituisci lo script di pulizia di Linux

Image Builder crea immagini che sono sicure per impostazione predefinita e seguono le nostre best practice di sicurezza. Tuttavia, alcuni casi d'uso più avanzati potrebbero richiedere di saltare una o più sezioni dello script di pulizia integrato. Se hai bisogno di saltare alcune operazioni di pulizia, ti consigliamo vivamente di testare l'AMI di output per garantire la sicurezza dell'immagine.

Importante

Se si saltano le sezioni dello script di pulizia, nell'immagine finale possono essere incluse informazioni riservate, come i dettagli dell'account del proprietario o le chiavi SSH, e in ogni caso avviate da quell'immagine. Potresti inoltre riscontrare problemi con l'avvio in zone di disponibilità, regioni o account diversi.

La tabella seguente descrive le sezioni dello script di pulizia, i file che vengono eliminati in quella sezione e i nomi di file che è possibile utilizzare per contrassegnare una sezione che Image Builder deve ignorare. Per saltare una sezione specifica dello script di pulizia, è possibile utilizzare il modulo di azione del CreateFile componente o un comando nei dati utente (se sovrascritto) per creare un file vuoto con il nome specificato nella colonna Ignora il nome del file della sezione.

Nota

I file creati per ignorare una sezione dello script di pulizia non devono includere un'estensione di file. Ad esempio, se si desidera saltare la CLOUD_INIT_FILES sezione dello script, ma si crea un file denominatoskip_cleanup_cloudinit_files.txt, Image Builder non riconoscerà il file skip.

Input

Sezione di pulizia

File rimossi

Ignora il nome del file della sezione

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