View a markdown version of this page

Bewährte Sicherheitsmethoden für Image Builder - EC2 Image Builder

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Bewährte Sicherheitsmethoden für Image Builder

EC2 Image Builder bietet eine Reihe von Sicherheitsfunktionen, die Sie bei der Entwicklung und Implementierung Ihrer eigenen Sicherheitsrichtlinien berücksichtigen sollten. Die folgenden bewährten Methoden sind allgemeine Richtlinien und keine vollständige Sicherheitslösung. Da diese bewährten Methoden für Ihre Umgebung möglicherweise nicht angemessen oder ausreichend sind, sollten Sie sie als hilfreiche Überlegungen und nicht als bindend ansehen.

  • Verwenden Sie in Image Builder-Rezepten keine zu freizügigen Sicherheitsgruppen.

  • Teilen Sie keine Bilder mit Konten, denen Sie nicht vertrauen.

  • Veröffentlichen Sie keine Bilder, die private oder sensible Daten enthalten.

  • Wenden Sie bei der Image-Erstellung alle verfügbaren Windows- oder Linux-Sicherheitspatches an.

  • Wenden Sie regelmäßig verwaltete AMI-Updates auf Ihre macOS-Rezepte an und erstellen Sie neue Images, um Instances mit den neuesten Sicherheitspatches zu starten.

Wir empfehlen Ihnen dringend, Ihre Images zu testen, um den Sicherheitsstatus und die geltenden Sicherheitsstandards zu überprüfen. Lösungen wie Amazon Inspector können dabei helfen, den Sicherheits- und Compliance-Status von Bildern zu überprüfen.

IMDSv2 für Image Builder-Pipelines

Wenn Ihre Image Builder-Pipeline ausgeführt wird, sendet sie HTTP-Anfragen, um EC2-Instances zu starten, die Image Builder zum Erstellen und Testen Ihres Images verwendet. Um die Version von IMDS zu konfigurieren, die Ihre Pipeline für die Startanforderungen verwendet, legen Sie den httpTokens Parameter in den Metadateneinstellungen Ihrer Image Builder-Infrastrukturkonfigurationsinstanz fest.

Anmerkung

Wir empfehlen, dass Sie alle EC2-Instances, die Image Builder aus einem Pipeline-Build heraus startet, so konfigurieren, dass sie IMDSv2 verwenden, sodass für Anfragen zum Abrufen von Instance-Metadaten ein signierter Token-Header erforderlich ist.

Weitere Informationen zur Konfiguration der Image Builder-Infrastruktur finden Sie unter. Konfiguration der Image Builder-Infrastruktur verwalten Weitere Informationen zu den Optionen für EC2-Instance-Metadaten für Linux-Images finden Sie unter Konfigurieren der Instance-Metadatenoptionen im Amazon EC2-Benutzerhandbuch. Informationen zu Windows-Images finden Sie unter Konfigurieren der Instance-Metadatenoptionen im Amazon EC2-Benutzerhandbuch.

Nach dem Build ist eine Bereinigung erforderlich

Nachdem Image Builder alle Build-Schritte für Ihr benutzerdefiniertes Image abgeschlossen hat, bereitet Image Builder die Build-Instanz für das Testen und die Image-Erstellung vor. Bevor Sie die Build-Instanz herunterfahren, um den Snapshot zu erstellen, führt Image Builder die folgende Bereinigung durch, um die Sicherheit Ihres Images zu gewährleisten:

Linux

Die Image Builder-Pipeline führt ein Bereinigungsskript aus, um sicherzustellen, dass das endgültige Image den bewährten Sicherheitsmethoden entspricht, und um alle Build-Artefakte oder Einstellungen zu entfernen, die nicht auf Ihren Snapshot übertragen werden sollten. Sie können jedoch Abschnitte des Skripts überspringen oder die Benutzerdaten vollständig überschreiben. Daher entsprechen die von Image Builder-Pipelines erstellten Bilder nicht unbedingt bestimmten behördlichen Kriterien.

Wenn die Pipeline ihre Erstellungs- und Testphasen abgeschlossen hat, führt Image Builder automatisch das folgende Bereinigungsskript aus, kurz bevor das Ausgabebild erstellt wird.

Wichtig

Wenn Sie Benutzerdaten in Ihrem Rezept überschreiben, wird das Skript nicht ausgeführt. Stellen Sie in diesem Fall sicher, dass Sie einen Befehl in Ihre Benutzerdaten aufnehmen, der eine leere Datei mit dem Namen erstelltperform_cleanup. Image Builder erkennt diese Datei und führt das Bereinigungsskript aus, bevor das neue Image erstellt wird.

Nach Abschluss der Dateibereinigung hängt Image Builder Schritte an das Skript an, mit denen der Systems Manager-Agent deinstalliert und das Paket entfernt wirdcronie. Image Builder verfolgt im Arbeitsverzeichnis des /tmp/imagebuilder_service Dienstes, was während des Builds installiert wurde. Image Builder entscheidet anhand dieser Markierungen, was entfernt werden soll:

  • Systems Manager-Agent — Ob Image Builder den Agenten deinstalliert, hängt von der systemsManagerAgent.uninstallAfterBuild Einstellung in Ihrem Image-Rezept ab und davon, ob Image Builder den Agenten installiert hat. Weitere Informationen finden Sie in der uninstallAfterBuild Einstellung unter. Erstellen Sie ein Image-Rezept mit dem AWS CLI

  • croniePaket — Dieser Schritt gilt für Amazon Linux 1, Amazon Linux 2 und Amazon Linux 2023. Wenn Image Builder während des Builds ein Crontab installiert hat, zeichnet es eine crontab_installed Markierung im Service-Arbeitsverzeichnis auf. Image Builder entfernt das cronie Paket dann im Rahmen der Bereinigung. cronieUm Ihr endgültiges Image beizubehalten, löschen Sie die Markierungsdatei, bevor die Bereinigung ausgeführt wird, indem Sie einer Komponente oder Ihren Benutzerdaten den folgenden Befehl hinzufügen:

    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

Nachdem die Image Builder-Pipeline die Windows-Images angepasst hat, wird das Microsoft https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/sysprep--generalize--a-windows-installation?view=windows-11 Sysprep-Hilfsprogramm ausgeführt. Diese Aktionen folgen den AWS bewährten Methoden zum Härten und Reinigen des Bilds.

macOS

Die Image Builder-Pipeline führt ein Bereinigungsskript aus, um sicherzustellen, dass das endgültige Image den bewährten Sicherheitsmethoden entspricht, und um alle Build-Artefakte oder Einstellungen zu entfernen, die nicht auf Ihren Snapshot übertragen werden sollten. Sie können jedoch Abschnitte des Skripts überspringen oder die Benutzerdaten vollständig überschreiben. Daher entsprechen die von Image Builder-Pipelines erstellten Bilder nicht unbedingt bestimmten behördlichen Kriterien.

Wenn die Pipeline ihre Erstellungs- und Testphasen abgeschlossen hat, führt Image Builder automatisch das folgende Bereinigungsskript aus, kurz bevor das Ausgabebild erstellt wird.

Wichtig

Wenn Sie Benutzerdaten in Ihrem Rezept überschreiben, wird das Skript nicht ausgeführt. Stellen Sie in diesem Fall sicher, dass Sie einen Befehl in Ihre Benutzerdaten aufnehmen, der eine leere Datei mit dem Namen erstelltperform_cleanup. Image Builder erkennt diese Datei und führt das Bereinigungsskript aus, bevor das neue Image erstellt wird.

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

Überschreiben Sie das Linux-Bereinigungsskript

Image Builder erstellt Images, die standardmäßig sicher sind und unseren bewährten Sicherheitsmethoden entsprechen. In einigen fortgeschritteneren Anwendungsfällen müssen Sie jedoch möglicherweise einen oder mehrere Abschnitte des integrierten Bereinigungsskripts überspringen. Wenn Sie einen Teil der Bereinigung überspringen müssen, empfehlen wir Ihnen dringend, Ihr Ausgabe-AMI zu testen, um die Sicherheit Ihres Images zu gewährleisten.

Wichtig

Das Überspringen von Abschnitten im Bereinigungsskript kann dazu führen, dass vertrauliche Informationen wie die Kontodaten des Besitzers oder SSH-Schlüssel in das endgültige Image aufgenommen und in jedem Fall von diesem Image aus gestartet werden. Möglicherweise treten auch Probleme beim Starten in verschiedenen Availability Zones, Regionen oder Konten auf.

Die folgende Tabelle beschreibt die Abschnitte des Bereinigungsskripts, die Dateien, die in diesem Abschnitt gelöscht werden, und die Dateinamen, die Sie verwenden können, um einen Abschnitt zu kennzeichnen, den Image Builder überspringen soll. Um einen bestimmten Abschnitt des Bereinigungsskripts zu überspringen, können Sie das Aktionsmodul für die CreateFile Komponente oder einen Befehl in Ihren Benutzerdaten (falls dieser überschrieben wird) verwenden, um eine leere Datei mit dem Namen zu erstellen, der in der Spalte „Abschnittsdateiname überspringen“ angegeben ist.

Anmerkung

Die Dateien, die Sie erstellen, um einen Abschnitt des Bereinigungsskripts zu überspringen, sollten keine Dateierweiterung enthalten. Wenn Sie beispielsweise den CLOUD_INIT_FILES Abschnitt des Skripts überspringen möchten, aber eine Datei mit dem Namen erstellenskip_cleanup_cloudinit_files.txt, erkennt Image Builder die übersprungene Datei nicht.

Input

Abschnitt bereinigen

Dateien wurden entfernt

Name der Abschnittsdatei überspringen

CLOUD_INIT_FILES

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

/etc/locale.conf

/var/log/cloud-init.log

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

Alle Dateien unter /var/lib/cloud/

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

Bereinigen Sie Schritte, die immer ausgeführt werden

Die Abschnitte in der vorherigen Tabelle sind die einzigen Teile des Bereinigungsskripts, die Sie überspringen können. Nachdem das Skript diese Abschnitte verarbeitet hat, entfernt es auch die folgenden Elemente, und Sie können diese Schritte nicht überspringen:

  • /var/log/sa/sa*

  • /var/lib/dhclient/dhclient*.lease

  • Alle Dateien unter /var/tmp/

  • /var/lib/systemd/random-seed

  • /var/lib/rsyslog/imjournal.state

  • Alle Dateien unter /var/log/journal/

Das Skript kürzt auch die Maschinen-ID-Dateien /etc/machine-id und. /var/lib/dbus/machine-id Dadurch wird sichergestellt, dass jede vom Image aus gestartete Instanz eine eindeutige Maschinen-ID generiert.

Überschreiben Sie das macOS-Bereinigungsskript

Image Builder erstellt Bilder, die standardmäßig sicher sind und unseren bewährten Sicherheitsmethoden entsprechen. In einigen fortgeschritteneren Anwendungsfällen müssen Sie jedoch möglicherweise einen oder mehrere Abschnitte des integrierten Bereinigungsskripts überspringen. Wenn Sie einen Teil der Bereinigung überspringen müssen, empfehlen wir Ihnen dringend, Ihr Ausgabe-AMI zu testen, um die Sicherheit Ihres Images zu gewährleisten.

Wichtig

Das Überspringen von Abschnitten im Bereinigungsskript kann dazu führen, dass vertrauliche Informationen wie die Kontodaten des Besitzers oder SSH-Schlüssel in das endgültige Image aufgenommen und in jedem Fall von diesem Image aus gestartet werden. Möglicherweise treten auch Probleme beim Starten in verschiedenen Availability Zones, Regionen oder Konten auf.

Die folgende Tabelle beschreibt die Abschnitte des Bereinigungsskripts, die Dateien, die in diesem Abschnitt gelöscht werden, und die Dateinamen, die Sie verwenden können, um einen Abschnitt zu kennzeichnen, den Image Builder überspringen soll. Um einen bestimmten Abschnitt des Bereinigungsskripts zu überspringen, können Sie das Aktionsmodul für die CreateFile Komponente oder einen Befehl in Ihren Benutzerdaten (falls dieser überschrieben wird) verwenden, um eine leere Datei mit dem Namen zu erstellen, der in der Spalte „Abschnittsdateiname überspringen“ angegeben ist.

Anmerkung

Die Dateien, die Sie erstellen, um einen Abschnitt des Bereinigungsskripts zu überspringen, sollten keine Dateierweiterung enthalten. Wenn Sie beispielsweise den INSTANCE_FILES Abschnitt des Skripts überspringen möchten, aber eine Datei mit dem Namen erstellenskip_cleanup_instance_files.txt, erkennt Image Builder die übersprungene Datei nicht.

Input

Abschnitt bereinigen

Dateien wurden entfernt

Name der Abschnittsdatei überspringen

EC2_MACOS_INIT_FILES

Wird ausgeführtec2-macos-init clean -all, um den EC2 macOS Init-Instanzverlauf zurückzusetzen, sodass sich das Image wie beim ersten Start verhält.

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

/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

/Users/<all users>/.ssh/authorized_keys

skip_cleanup_ssh_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

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