Mejores prácticas de seguridad para Image Builder - EC2Image Builder

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Mejores prácticas de seguridad para Image Builder

EC2Image Builder proporciona una serie de funciones de seguridad que debe tener en cuenta a la hora de desarrollar e implementar sus propias políticas de seguridad. Las siguientes prácticas recomendadas son directrices generales y no constituyen una solución de seguridad completa. Puesto que es posible que estas prácticas recomendadas no sean adecuadas o suficientes para el entorno, considérelas como consideraciones útiles en lugar de como normas.

  • No utilice grupos de seguridad demasiado permisivos en las recetas de Generador de Imágenes.

  • No comparta imágenes con cuentas en las que no confíe.

  • No publique imágenes que contengan datos privados o confidenciales.

  • Aplique todos los parches de seguridad disponibles para Windows o Linux durante la creación de imágenes.

Le recomendamos encarecidamente que pruebe las imágenes para validar la postura de seguridad y los niveles de cumplimiento de seguridad aplicables. Soluciones como Amazon Inspector pueden ayudar a validar la postura de seguridad y conformidad de las imágenes.

IMDSv2para canalizaciones de Image Builder

Cuando se ejecuta la canalización de Image Builder, envía HTTP solicitudes para lanzar EC2 instancias que Image Builder utiliza para crear y probar la imagen. Para configurar la versión IMDS que utiliza tu canalización para las solicitudes de lanzamiento, establece el httpTokens parámetro en los ajustes de metadatos de la instancia de configuración de infraestructura de Image Builder.

nota

Le recomendamos que configure todas las EC2 instancias que Image Builder lance desde una compilación de canalización para IMDSv2 que las solicitudes de recuperación de metadatos de las instancias requieran un encabezado de token firmado.

Para obtener más información acerca de la configuración de la infraestructura de Generador de Imágenes, consulte Gestione la configuración de la infraestructura de Image Builder. Para obtener más información sobre las opciones de metadatos de EC2 instancia para imágenes de Linux, consulte Configurar las opciones de metadatos de instancia en la Guía del EC2 usuario de Amazon. Para las imágenes de Windows, consulta Configurar las opciones de metadatos de la instancia en la Guía del EC2 usuario de Amazon.

Limpieza posterior a la creación necesaria

Una vez que Generador de Imágenes complete todos los pasos de creación de la imagen personalizada, Generador de Imágenes prepara la instancia de creación para probarla y crear la imagen. Antes de cerrar la instancia de creación para crear la instantánea, Generador de Imágenes realiza la siguiente limpieza para garantizar la seguridad de la imagen:

Linux

La canalización de Generador de Imágenes ejecuta un script de limpieza para garantizar que la imagen final siga las mejores prácticas de seguridad y para eliminar cualquier artefacto de creación o configuración que no deba transferirse a la instantánea. Sin embargo, puede omitir secciones del script o anular por completo los datos del usuario. Por lo tanto, las imágenes producidas por las canalizaciones de Generador de Imágenes no cumplen necesariamente con ningún criterio reglamentario específico.

Cuando la canalización finaliza sus etapas de creación y prueba, Generador de Imágenes ejecuta automáticamente el siguiente script de limpieza justo antes de crear la imagen de salida.

importante

Si anula los datos de usuario en su receta, el script no se ejecutará. En ese caso, asegúrese de incluir un comando en sus datos de usuario que cree un archivo vacío llamado perform_cleanup. Generador de Imágenes detecta este archivo y ejecuta el script de limpieza antes de crear la nueva imagen.

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

Una vez que la canalización del Generador de imágenes personalice las imágenes de Windows, ejecuta el servicio Sysprep de Microsoft. Estas acciones siguen las prácticas AWS recomendadas para endurecer y limpiar la imagen.

Anule el script de limpieza de Linux.

Generador de Imágenes crea imágenes que son seguras de forma predeterminada y siguen nuestras prácticas recomendadas de seguridad. Sin embargo, algunos casos de uso más avanzados pueden requerir que omita una o más secciones del script de limpieza integrado. Si necesita omitir parte de la limpieza, le recomendamos encarecidamente que pruebe el resultado AMI para garantizar la seguridad de la imagen.

importante

Si se omiten secciones del script de limpieza, es posible que información confidencial, como los detalles de la cuenta del propietario o SSH las claves, se incluya en la imagen final y, en cualquier caso, se lance desde esa imagen. También es posible que tenga problemas con el lanzamiento en distintas zonas de disponibilidad, regiones o cuentas.

En la siguiente tabla se describen las secciones del script de limpieza, los archivos que se eliminan en esa sección y los nombres de archivo que puede utilizar para marcar una sección que Generador de Imágenes debe omitir. Para omitir una sección específica del script de limpieza, puede utilizar el módulo de acción del componente CreateFile o un comando de los datos de usuario (si es incorrecto) para crear un archivo vacío con el nombre especificado en la columna Omitir el nombre del archivo de la sección.

nota

Los archivos que cree para omitir una sección del script de limpieza no deben incluir una extensión del archivo. Por ejemplo, si desea omitir la sección CLOUD_INIT_FILES del script, pero crea un archivo denominado skip_cleanup_cloudinit_files.txt, Generador de Imágenes no reconocerá el archivo omitido.

Entrada

Sección de limpieza

Archivos eliminados

Omita el nombre del archivo de la sección.

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