View a markdown version of this page

Image Builder 的安全最佳實務 - EC2 Image Builder

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Image Builder 的安全最佳實務

EC2 Image Builder 提供許多安全功能,供您在開發和實作自己的安全政策時考慮。以下最佳實務為一般準則,並不代表完整的安全解決方案。這些最佳實務可能不適用或無法滿足您的環境需求,因此請將其視為實用建議就好,而不要當作是指示。

  • 請勿在映像建置器配方中使用過於寬鬆的安全群組。

  • 請勿與您不信任的帳戶共用映像。

  • 請勿公開具有私有或敏感資料的映像。

  • 在映像建置期間套用所有可用的 Windows 或 Linux 安全修補程式。

  • 定期將受管 AMI 更新套用至您的 macOS 配方,並建立新的映像以啟動具有最新安全修補程式的執行個體。

我們強烈建議您測試映像,以驗證安全狀態和適用的安全合規等級。Amazon Inspector 等解決方案可協助驗證映像的安全性和合規狀態。

適用於映像建置器管道的 IMDSv2

當您的 Image Builder 管道執行時,它會傳送 HTTP 請求,以啟動 Image Builder 用來建置和測試映像的 EC2 執行個體。若要設定管道用於啟動請求的 IMDS 版本,請在 Image Builder 基礎設施組態執行個體中繼資料設定中設定 httpTokens 參數。

注意

我們建議您將映像建置器從管道建置啟動的所有 EC2 執行個體設定為使用 IMDSv2,以便執行個體中繼資料擷取請求需要簽章的字符標頭。

如需映像建置器基礎設施組態的詳細資訊,請參閱管理映像建置器基礎設施組態。如需 Linux 映像 EC2 執行個體中繼資料選項的詳細資訊,請參閱《Amazon EC2 使用者指南》中的設定執行個體中繼資料選項。對於 Windows 映像,請參閱《Amazon EC2 使用者指南》中的設定執行個體中繼資料選項

必要的建置後清除

Image Builder 完成自訂映像的所有建置步驟後,Image Builder 會準備建置執行個體以進行測試和建立映像。關閉建置執行個體以建立快照之前,Image Builder 會執行下列清除作業,以確保您映像的安全性:

Linux

Image Builder 管道會執行清除指令碼,以協助確保最終映像遵循安全最佳實務,並移除任何不應傳遞至快照的建置成品或設定。不過,您可以略過指令碼的區段,或完全覆寫使用者資料。因此,Image Builder 管道產生的映像不一定符合任何特定的法規條件。

當管道完成建置和測試階段時,Image Builder 會在建立輸出映像之前自動執行下列清除指令碼。

重要

如果您覆寫配方中的使用者資料,則指令碼不會執行。在這種情況下,請確定您在使用者資料中包含一個命令,該命令會建立名為 的空白檔案perform_cleanup。Image Builder 會偵測此檔案,並在建立新映像之前執行清除指令碼。

檔案清除完成後,Image Builder 會將步驟附加至解除安裝 Systems Manager 代理程式並移除cronie套件的指令碼。Image Builder 會追蹤服務/tmp/imagebuilder_service工作目錄中建置期間安裝的項目。Image Builder 使用這些標記來決定要移除的內容:

  • Systems Manager 代理程式 – Image Builder 是否解除安裝代理程式取決於映像配方中的systemsManagerAgent.uninstallAfterBuild設定,以及 Image Builder 是否安裝代理程式。如需詳細資訊,請參閱 中的 uninstallAfterBuild設定使用 建立映像配方 AWS CLI

  • cronie 套件 – 此步驟適用於 Amazon Linux 1、Amazon Linux 2 和 Amazon Linux 2023。如果 Image Builder 在建置期間安裝了 crontab,則會在服務工作目錄中記錄crontab_installed標記。Image Builder 接著會移除cronie套件做為清除的一部分。若要保留在最終映像cronie中,請在清除執行之前刪除標記檔案,方法是將下列命令新增至元件或您的使用者資料:

    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

在映像建置器管道自訂 Windows 映像之後,它會執行 Microsoft Sysprep 公用程式。這些動作遵循AWS 強化和清理映像的最佳實務

macOS

Image Builder 管道會執行清除指令碼,以協助確保最終映像遵循安全最佳實務,並移除任何不應傳遞至快照的建置成品或設定。不過,您可以略過指令碼的區段,或完全覆寫使用者資料。因此,Image Builder 管道產生的映像不一定符合任何特定的法規條件。

當管道完成建置和測試階段時,Image Builder 會在建立輸出映像之前自動執行下列清除指令碼。

重要

如果您覆寫配方中的使用者資料,則指令碼不會執行。在這種情況下,請確定您在使用者資料中包含一個命令,該命令會建立名為 的空白檔案perform_cleanup。Image Builder 會偵測此檔案,並在建立新映像之前執行清除指令碼。

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

覆寫 Linux 清除指令碼

Image Builder 會建立預設安全的映像,並遵循我們的安全最佳實務。不過,有些更進階的使用案例可能會要求您略過內建清除指令碼的一或多個區段。如果您確實需要略過一些清除,強烈建議您測試輸出 AMI,以確保映像的安全性。

重要

略過清除指令碼中的區段可能會導致敏感資訊,例如擁有者帳戶詳細資訊或 SSH 金鑰包含在最終映像中,以及從該映像啟動的任何執行個體中。您也可能會在不同的可用區域、區域或帳戶中遇到啟動問題。

下表概述清除指令碼的區段、在該區段中刪除的檔案,以及可用來標記 Image Builder 應略過區段的檔案名稱。若要略過清除指令碼的特定區段,您可以使用CreateFile元件動作模組或使用者資料中的命令 (如果覆寫),以略過區段檔案名稱欄中指定的名稱建立空白檔案

注意

您為略過清除指令碼一節而建立的檔案不應包含副檔名。例如,如果您想要略過指令碼的 CLOUD_INIT_FILES區段,但建立名為 的檔案skip_cleanup_cloudinit_files.txt,Image Builder 將無法辨識略過檔案。

Input

清除區段

檔案已移除

略過區段檔案名稱

CLOUD_INIT_FILES

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

/etc/locale.conf

/var/log/cloud-init.log

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

下的所有檔案 /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

清除一律執行的步驟

上表中的區段是您可以略過之清除指令碼的唯一部分。指令碼處理這些區段後,也會移除下列項目,而且您無法略過這些步驟:

  • /var/log/sa/sa*

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

  • 下的所有檔案 /var/tmp/

  • /var/lib/systemd/random-seed

  • /var/lib/rsyslog/imjournal.state

  • 下的所有檔案 /var/log/journal/

指令碼也會截斷機器 ID 檔案 /etc/machine-id/var/lib/dbus/machine-id。這可確保從映像啟動的每個執行個體都會產生唯一的機器 ID。

覆寫 macOS 清除指令碼

Image Builder 會建立預設安全的映像,並遵循我們的安全最佳實務。不過,有些更進階的使用案例可能會要求您略過內建清除指令碼的一或多個區段。如果您確實需要略過一些清除,強烈建議您測試輸出 AMI,以確保映像的安全性。

重要

略過清除指令碼中的區段可能會導致敏感資訊,例如擁有者帳戶詳細資訊或 SSH 金鑰包含在最終映像中,以及從該映像啟動的任何執行個體中。您也可能會在不同的可用區域、區域或帳戶中遇到啟動問題。

下表概述清除指令碼的區段、在該區段中刪除的檔案,以及可用來標記 Image Builder 應略過區段的檔案名稱。若要略過清除指令碼的特定區段,您可以使用CreateFile元件動作模組或使用者資料中的命令 (如果覆寫),以略過區段檔案名稱欄中指定的名稱建立空白檔案

注意

您為略過清除指令碼一節而建立的檔案不應包含副檔名。例如,如果您想要略過指令碼的 INSTANCE_FILES區段,但建立名為 的檔案skip_cleanup_instance_files.txt,Image Builder 將無法辨識略過檔案。

Input

清除區段

檔案已移除

略過區段檔案名稱

EC2_MACOS_INIT_FILES

執行 ec2-macos-init clean -all以重設 EC2 macOS Init 執行個體歷史記錄,讓映像成為第一次開機。

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