

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.

# Prácticas recomendadas de seguridad para Generador de imágenes
<a name="security-best-practices"></a>

Generador de Imágenes de EC2 proporciona un número de características 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.
+ Aplica periódicamente actualizaciones de AMI administradas a sus recetas de macOS y genera nuevas imágenes para lanzar instancias que tengan los últimos parches de seguridad.
+ Al importar una imagen de disco ISO de Windows, obtenga la ISO de Microsoft o de un distribuidor autorizado. Además, otorga a la función de perfil de instancia solo los permisos que requiere la importación. Para obtener más información, consulte [Consideraciones de seguridad para la importación de imágenes de disco ISO](import-iso-disk.md#iso-import-security).

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](https://aws.amazon.com/inspector/) pueden ayudar a validar la postura de seguridad y conformidad de las imágenes.

**IMDSv2 para canalizaciones de Generador de Imágenes**  
Cuando se ejecuta la canalización de Generador de Imágenes, esta envía solicitudes HTTP para lanzar instancias de EC2 que Generador de Imágenes utiliza para crear y probar su imagen. Para configurar la versión de IMDS que utiliza su canalización para las solicitudes de lanzamiento, defina el parámetro `httpTokens` en los ajustes de metadatos de la instancia de configuración de infraestructura de Generador de Imágenes.

**nota**  
Se recomienda configurar todas las instancias de EC2 que Generador de Imágenes lance a partir de una compilación en proceso para que usen IMDSv2, de modo 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 [Administre la configuración de la infraestructura de Generador de imágenes](manage-infra-config.md). Para obtener más información acerca de las opciones de metadatos de la instancia de EC2 para imágenes de Linux, consulte [Configuración de las opciones del servicio de metadatos de instancias](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-options.html) en la Guía del usuario de Amazon EC2. Para obtener imágenes de Windows, consulte [Configuración de las opciones del servicio de metadatos de instancias](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-options.html) en la Guía del usuario de Amazon EC2.

## Limpieza posterior a la creación necesaria
<a name="post-build-cleanup"></a>

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.

Una vez finalizada la limpieza del archivo, Image Builder añade pasos al script para desinstalar el agente de Systems Manager y eliminar el `cronie` paquete. Image Builder rastrea lo que instaló durante la compilación en el directorio de trabajo del `/tmp/imagebuilder_service` servicio. Image Builder usa esos marcadores para decidir qué eliminar:
+ **Agente de Systems Manager**: el hecho de que Image Builder desinstale el agente depende de la `systemsManagerAgent.uninstallAfterBuild` configuración de la receta de imagen y de si Image Builder ha instalado el agente. Para obtener más información, consulte la `uninstallAfterBuild` configuración en. [Crea una receta con imágenes con el AWS CLI](create-image-recipes.md#create-image-recipe-cli)
+ **`cronie`paquete**: este paso se aplica a Amazon Linux 1, Amazon Linux 2 y Amazon Linux 2023. Si Image Builder instaló un crontab durante la compilación, registra un `crontab_installed` marcador en el directorio de trabajo del servicio. A continuación, Image Builder elimina el `cronie` paquete como parte de la limpieza. Para conservar `cronie` la imagen final, borra el archivo de marcadores antes de que se ejecute la limpieza añadiendo el siguiente comando a un componente o a tus datos de usuario:

  ```
  rm -f /tmp/imagebuilder_service/crontab_installed
  ```

```
#!/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 [[ -d "/var/lib/cloud" ]]; then
        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;
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"
    shopt -s nullglob
    TOE_MATCHES=({{workingDirectory}}/TOE_*)
    shopt -u nullglob
    if [[ ${#TOE_MATCHES[@]} -gt 0 ]]; then
        if [[ $( sudo find "${TOE_MATCHES[@]}" -type f | sudo wc -l) -gt 0 ]]; then
            echo "Deleting files within {{workingDirectory}}/TOE_*"
            sudo find "${TOE_MATCHES[@]}" -type f -exec shred -zuf {} \;
        fi
        shopt -s nullglob
        TOE_REMAINING=({{workingDirectory}}/TOE_*)
        shopt -u nullglob
        if [[ ${#TOE_REMAINING[@]} -gt 0 ]]; then
            if [[ $( sudo find "${TOE_REMAINING[@]}" -type f | sudo wc -l) -gt 0 ]]; then
                echo "Failed to delete {{workingDirectory}}/TOE_*"
                exit 1
            fi
            echo "Deleting {{workingDirectory}}/TOE_*"
            sudo rm -rf "${TOE_REMAINING[@]}"
        fi
        shopt -s nullglob
        TOE_FINAL=({{workingDirectory}}/TOE_*)
        shopt -u nullglob
        if [[ ${#TOE_FINAL[@]} -gt 0 ]]; then
            echo "Failed to delete {{workingDirectory}}/TOE_*"
            exit 1
        fi
    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 [[ -d "/var/log/amazon/ssm" ]]; then
        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
        echo "Deleting /var/log/amazon/ssm/*"
        sudo rm -rf /var/log/amazon/ssm
        if [[ -d "/var/log/amazon/ssm" ]]; then
            echo "Failed to delete /var/log/amazon/ssm"
            exit 1
        fi
    fi
fi


shopt -s nullglob
SA_MATCHES=(/var/log/sa/sa*)
shopt -u nullglob
if [[ ${#SA_MATCHES[@]} -gt 0 ]]; then
    echo "Deleting /var/log/sa/sa*"
    sudo shred -zuf "${SA_MATCHES[@]}"
    shopt -s nullglob
    SA_REMAINING=(/var/log/sa/sa*)
    shopt -u nullglob
    if [[ ${#SA_REMAINING[@]} -gt 0 ]]; then
        echo "Failed to delete /var/log/sa/sa*"
        exit 1
    fi
fi

shopt -s nullglob
DHCLIENT_MATCHES=(/var/lib/dhclient/dhclient*.lease)
shopt -u nullglob
if [[ ${#DHCLIENT_MATCHES[@]} -gt 0 ]]; then
    echo "Deleting /var/lib/dhclient/dhclient*.lease"
    sudo shred -zuf "${DHCLIENT_MATCHES[@]}"
    shopt -s nullglob
    DHCLIENT_REMAINING=(/var/lib/dhclient/dhclient*.lease)
    shopt -u nullglob
    if [[ ${#DHCLIENT_REMAINING[@]} -gt 0 ]]; then
        echo "Failed to delete /var/lib/dhclient/dhclient*.lease"
        exit 1
    fi
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

if [[ -f "/var/lib/systemd/random-seed" ]]; then
    echo "Deleting /var/lib/systemd/random-seed"
    sudo shred -zuf /var/lib/systemd/random-seed
    sudo rm -f /var/lib/systemd/random-seed
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 [[ -d "/var/log/journal" ]] && [[ $( 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

if [[ -f "/etc/machine-id" ]]; then
    echo "Truncating /etc/machine-id"
    sudo truncate -s 0 /etc/machine-id
fi

if [[ -f "/var/lib/dbus/machine-id" ]]; then
    echo "Truncating /var/lib/dbus/machine-id"
    sudo truncate -s 0 /var/lib/dbus/machine-id
fi

sudo touch /etc/machine-id

# Flush all pending writes to disk before instance shutdown and snapshot
sync

echo "Sanitize OK"


###############################################################################
# Image Builder appends the following steps to the clean up script to uninstall
# the Systems Manager (SSM) agent and, on Amazon Linux 1, Amazon Linux 2, and
# Amazon Linux 2023, to remove the cronie package when Image Builder installed a
# crontab during the build. Image Builder uses the /tmp/imagebuilder_service
# working directory to track what it installed.
###############################################################################

SERVICE_ROOT_WORKING_DIR="/tmp/imagebuilder_service"

# SSM_UNINSTALL_CONDITION reflects the systemsManagerAgent.uninstallAfterBuild
# recipe setting and how the SSM agent was installed:
#   SSM_INSTALLED_BY_CUSTOMER      - always uninstall the SSM agent
#   SSM_INSTALLED_BY_IMAGE_BUILDER - uninstall only if Image Builder installed it
#   (any other value)              - leave the SSM agent in the final image
SSM_UNINSTALL_CONDITION="<uninstallAfterBuild condition>"

function error_exit {
  echo "$1" 1>&2
  exit 1
}

function ssm_exists() {
  eval "$1"  > /dev/null 2>&1
  echo $?
}

function cleanup_image() {
  rm -rf "${SERVICE_ROOT_WORKING_DIR}"
}

function uninstall_ssm_agent() {

  uninstall_package="$1"
  uninstall_all=""
  uninstall_success="false"

  if [ "${uninstall_package}" == "" ]; then
    uninstall_all="true"
  fi

  yum="sudo yum search amazon-ssm-agent | grep amazon-ssm-agent"
  snap="sudo snap list amazon-ssm-agent"
  rpm="sudo rpm -qa amazon-ssm-agent | grep amazon-ssm-agent"
  dpkg="sudo dpkg --get-selections | grep amazon-ssm-agent"
  pkg="su -m root -c \"pkg info -l amazon-ssm-agent | grep amazon-ssm-agent\""


  if [[ ("${uninstall_all}" == "true" || "${uninstall_package}" == "snap") && $(ssm_exists "${snap}") -eq 0 ]]; then
    echo "Package found in Snap.... Uninstalling"
    (sleep 30 ; sudo snap remove amazon-ssm-agent) &>/dev/null &
    uninstall_success="true"
  fi

  if [[ ("${uninstall_all}" == "true" || "${uninstall_package}" == "yum") && $(ssm_exists "${yum}") -eq 0 ]]; then
    echo "Package found in Yum.... Uninstalling"
    (sleep 30 ; sudo yum remove -y amazon-ssm-agent) &>/dev/null &
    uninstall_success="true"
  fi

  if [[ ("${uninstall_all}" == "true" || "${uninstall_package}" == "rpm") && $(ssm_exists "${rpm}") -eq 0 ]]; then
    echo "Package found in Rpm.... Uninstalling"
    (sleep 30 ; sudo rpm -e amazon-ssm-agent) &>/dev/null &
    uninstall_success="true"
  fi

  if [[ ("${uninstall_all}" == "true" || "${uninstall_package}" == "dpkg") && $(ssm_exists "${dpkg}") -eq 0 ]]; then
    echo "Package found in Dpkg.... Uninstalling"
    (sleep 30 ; sudo dpkg -r --force-all amazon-ssm-agent) &>/dev/null &
    uninstall_success="true"
  fi

  if [[ ("${uninstall_all}" == "true" || "${uninstall_package}" == "pkg") && $(ssm_exists "${pkg}") -eq 0 ]]; then
    echo "Package found in FreeBSD.... Uninstalling"
    (sleep 30 ; su -m root -c "pkg remove -y amazon-ssm-agent") &> /dev/null &
    uninstall_success="true"
  fi

  if [ "${uninstall_success}" == "false" ] ; then
    error_exit "Unable to uninstall an SSM agent"
  fi
}

# Amazon Linux releases where Image Builder installs cronie to provide a crontab:
# Amazon Linux AMI (AL1), AL2, and AL2023.
function is_cronie_supported_amazon_linux() {
    if [ "$(get_os_type)" != "amzn" ]; then
        return 1
    fi
    case "$(get_os_version)" in
        2|2023) return 0 ;;
        # AL1 releases use date-based versions from 2010 through 2018.
        201[0-8].[0-9][0-9]) return 0 ;;
        *) return 1 ;;
    esac
}

function uninstall_crontab() {
    if is_cronie_supported_amazon_linux ; then
        echo "Uninstalling cronie package"
        sudo yum remove -y cronie
    fi
}

function get_os_type() {
    FILE=/etc/os-release
    if [ -e $FILE ]; then
        . $FILE
        echo $ID
    else
        echo ""
    fi
}

function get_os_version() {
    FILE=/etc/os-release
    if [ -e $FILE ]; then
        . $FILE
        echo $VERSION_ID
    else
        echo ""
    fi
}

if [ "${SSM_UNINSTALL_CONDITION}" == "SSM_INSTALLED_BY_CUSTOMER" ] ; then
  echo "Uninstall after build set to true. Uninstalling SSM agent."
  uninstall_ssm_agent

elif [ "${SSM_UNINSTALL_CONDITION}" == "SSM_INSTALLED_BY_IMAGE_BUILDER" ] ; then
  echo "Checking if the SSM agent was installed by Image Builder"
  if [[ -f ${SERVICE_ROOT_WORKING_DIR}/ssm_installed ]] ; then
    package_manager="$(cat ${SERVICE_ROOT_WORKING_DIR}/ssm_installed)"
    echo "Uninstalling the SSM agent installed by Image Builder using ${package_manager}"
    uninstall_ssm_agent "${package_manager}"
  fi
else
  echo "Uninstall after build set to false. Skipping SSM agent uninstall."
fi

# When Image Builder installs a crontab during the build (on Amazon Linux 1,
# Amazon Linux 2, or Amazon Linux 2023), it records a crontab_installed marker
# and removes the cronie package here. To keep cronie in your final image,
# delete the marker before clean up runs:
#   rm -f /tmp/imagebuilder_service/crontab_installed
if [[ -f ${SERVICE_ROOT_WORKING_DIR}/crontab_installed ]] ; then
  echo "Uninstalling crontab installed by Image Builder"
  uninstall_crontab
fi

cleanup_image
```

------
#### [ Windows ]

Una vez que la canalización de Generador de imágenes personalice las imágenes de Windows, ejecuta el servicio [Sysprep](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/sysprep--generalize--a-windows-installation?view=windows-11) de Microsoft. Estas acciones siguen las prácticas [AWS recomendadas para endurecer y limpiar la imagen. ](https://aws.amazon.com/articles/public-ami-publishing-hardening-and-clean-up-requirements/) 

------
#### [ macOS ]

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 rm -f $FILE;
      fi;
      if [[ -f $FILE ]]; then
          echo "Failed to delete '$FILE'. Failing."
          exit 1
      fi;
  done
};

# Reset EC2 macOS Init instance history so the image behaves as a first boot
if [[ -f {{workingDirectory}}/skip_cleanup_ec2_macos_init_files ]]; then
  echo "Skipping cleanup of ec2-macos-init instance history"
else
  echo "Cleaning up ec2-macos-init instance history"
  if [[ -x /usr/local/bin/ec2-macos-init ]]; then
      sudo /usr/local/bin/ec2-macos-init clean -all
  fi
fi

# Clean up for temporary instance files
INSTANCE_FILES=(
  "/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist"
)
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"
  "/var/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 /Users/)
  for user in $USERS; do
      if [[ -f /Users/"$user"/.ssh/authorized_keys ]]; then
          echo Deleting /Users/"$user"/.ssh/authorized_keys;
          sudo rm -f /Users/"$user"/.ssh/authorized_keys;
      fi;
  done
  for user in $USERS; do
      if [[ -f /Users/"$user"/.ssh/authorized_keys ]]; then
          echo Failed to delete /Users/"$user"/.ssh/authorized_keys;
          exit 1
      fi;
  done;
fi;


# Clean up for instance log files
INSTANCE_LOG_FILES=(
  "/var/log/amazon/ec2/ec2-macos-init.log"
  "/var/log/amazon/ec2/ena-ethernet.log"
  "/var/log/amazon/ec2/system-monitoring.log"
)
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"
  shopt -s nullglob
  TOE_MATCHES=({{workingDirectory}}/TOE_*)
  shopt -u nullglob
  if [[ ${#TOE_MATCHES[@]} -gt 0 ]]; then
      if [[ $( sudo find "${TOE_MATCHES[@]}" -type f | sudo wc -l) -gt 0 ]]; then
          echo "Deleting files within {{workingDirectory}}/TOE_*"
          sudo find "${TOE_MATCHES[@]}" -type f -exec rm -f {} \;
      fi
      shopt -s nullglob
      TOE_REMAINING=({{workingDirectory}}/TOE_*)
      shopt -u nullglob
      if [[ ${#TOE_REMAINING[@]} -gt 0 ]]; then
          if [[ $( sudo find "${TOE_REMAINING[@]}" -type f | sudo wc -l) -gt 0 ]]; then
              echo "Failed to delete {{workingDirectory}}/TOE_*"
              exit 1
          fi
          echo "Deleting {{workingDirectory}}/TOE_*"
          sudo rm -rf "${TOE_REMAINING[@]}"
      fi
      shopt -s nullglob
      TOE_FINAL=({{workingDirectory}}/TOE_*)
      shopt -u nullglob
      if [[ ${#TOE_FINAL[@]} -gt 0 ]]; then
          echo "Failed to delete {{workingDirectory}}/TOE_*"
          exit 1
      fi
  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 [[ -d "/var/log/amazon/ssm" ]]; then
      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 rm -f {} \;
      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
      echo "Deleting /var/log/amazon/ssm/*"
      sudo rm -rf /var/log/amazon/ssm
      if [[ -d "/var/log/amazon/ssm" ]]; then
          echo "Failed to delete /var/log/amazon/ssm"
          exit 1
      fi
  fi
fi


# Clean up for DHCP lease files
shopt -s nullglob
DHCP_LEASE_MATCHES=(/var/db/dhcpclient/leases/*)
shopt -u nullglob
if [[ ${#DHCP_LEASE_MATCHES[@]} -gt 0 ]]; then
  echo "Deleting /var/db/dhcpclient/leases/*"
  sudo rm -f "${DHCP_LEASE_MATCHES[@]}"
  shopt -s nullglob
  DHCP_LEASE_REMAINING=(/var/db/dhcpclient/leases/*)
  shopt -u nullglob
  if [[ ${#DHCP_LEASE_REMAINING[@]} -gt 0 ]]; then
      echo "Failed to delete /var/db/dhcpclient/leases/*"
      exit 1
  fi
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 rm -f {} \;
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

# Flush all pending writes to disk before instance shutdown and snapshot
sync
```

------

## Anule el script de limpieza de Linux.
<a name="override-linux-cleanup-script"></a>

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 la AMI de salida para garantizar la seguridad de su 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 las claves SSH, se incluya en la imagen final y, en cualquier instancia que 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](toe-action-modules.md#action-modules-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.


**Input**  

| 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`<br />`/etc/locale.conf`<br />`/var/log/cloud-init.log`<br />`/var/log/cloud-init-output.log`<br />Todos los archivos se encuentran en `/var/lib/cloud/` | `skip_cleanup_cloudinit_files` | 
| `INSTANCE_FILES` | `/etc/.updated`<br />`/etc/aliases.db`<br />`/etc/hostname`<br />`/var/lib/misc/postfix.aliasesdb-stamp`<br />`/var/lib/postfix/master.lock`<br />`/var/spool/postfix/pid/master.pid`<br />`/var/.updated`<br />`/var/cache/yum/x86_64/2/.gpgkeyschecked.yum` | `skip_cleanup_instance_files` | 
| `SSH_FILES` | `/etc/ssh/ssh_host_rsa_key`<br />`/etc/ssh/ssh_host_rsa_key.pub`<br />`/etc/ssh/ssh_host_ecdsa_key`<br />`/etc/ssh/ssh_host_ecdsa_key.pub`<br />`/etc/ssh/ssh_host_ed25519_key`<br />`/etc/ssh/ssh_host_ed25519_key.pub`<br />`/root/.ssh/authorized_keys`<br />`/home/<all users>/.ssh/authorized_keys` | `skip_cleanup_ssh_files` | 
| `INSTANCE_LOG_FILES` | `/var/log/audit/audit.log`<br />`/var/log/boot.log`<br />`/var/log/dmesg`<br />`/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` | 

**Limpia los pasos que siempre se ejecutan**  
Las secciones de la tabla anterior son las únicas partes del script de limpieza que puede omitir. Una vez que el script procesa esas secciones, también elimina los siguientes elementos y no puede omitir estos pasos:  
`/var/log/sa/sa*`
`/var/lib/dhclient/dhclient*.lease`
Todos los archivos de `/var/tmp/`
`/var/lib/systemd/random-seed`
`/var/lib/rsyslog/imjournal.state`
Todos los archivos en `/var/log/journal/`
El script también trunca los archivos `/etc/machine-id` de identificación de la máquina y. `/var/lib/dbus/machine-id` Esto garantiza que cada instancia lanzada desde la imagen genere un ID de máquina único.

## Anula el script de limpieza de macOS
<a name="override-macos-cleanup-script"></a>

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 la AMI de salida para garantizar la seguridad de su 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 las claves SSH, se incluya en la imagen final y, en cualquier instancia que 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](toe-action-modules.md#action-modules-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 `INSTANCE_FILES` del script, pero crea un archivo denominado `skip_cleanup_instance_files.txt`, Generador de Imágenes no reconocerá el archivo omitido.


**Input**  

| Sección de limpieza | Archivos eliminados | Omita el nombre del archivo de la sección. | 
| --- | --- | --- | 
| `EC2_MACOS_INIT_FILES` | Se ejecuta `ec2-macos-init clean -all` para restablecer el historial de instancias EC2 de macOS Init para que la imagen se comporte como el primer arranque. | `skip_cleanup_ec2_macos_init_files` | 
| `INSTANCE_FILES` | `/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist` | `skip_cleanup_instance_files` | 
| `SSH_FILES` | `/etc/ssh/ssh_host_rsa_key`<br />`/etc/ssh/ssh_host_rsa_key.pub`<br />`/etc/ssh/ssh_host_ecdsa_key`<br />`/etc/ssh/ssh_host_ecdsa_key.pub`<br />`/etc/ssh/ssh_host_ed25519_key`<br />`/etc/ssh/ssh_host_ed25519_key.pub`<br />`/var/root/.ssh/authorized_keys`<br />`/Users/<all users>/.ssh/authorized_keys` | `skip_cleanup_ssh_files` | 
| `INSTANCE_LOG_FILES` | `/var/log/amazon/ec2/ec2-macos-init.log`<br />`/var/log/amazon/ec2/ena-ethernet.log`<br />`/var/log/amazon/ec2/system-monitoring.log` | `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` | 