本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Image Builder 的安全最佳實務
EC2 Image Builder 提供許多安全功能,供您在開發和實作自己的安全政策時考慮。以下最佳實務為一般準則,並不代表完整的安全解決方案。這些最佳實務可能不適用或無法滿足您的環境需求,因此請將其視為實用建議就好,而不要當作是指示。
我們強烈建議您測試映像,以驗證安全狀態和適用的安全合規等級。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
|