Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Praktik terbaik keamanan untuk EC2 Image Builder
EC2 Image Builder menyediakan sejumlah fitur keamanan untuk dipertimbangkan saat Anda mengembangkan dan menerapkan kebijakan keamanan Anda sendiri. Praktik terbaik berikut adalah pedoman umum dan tidak mewakili solusi keamanan yang lengkap. Karena praktik terbaik ini mungkin tidak sesuai atau cukup untuk lingkungan Anda, anggap praktik terbaik tersebut sebagai pertimbangan yang membantu dan bukan sebagai rekomendasi.
-
Jangan gunakan grup keamanan yang terlalu permisif dalam resep Image Builder.
-
Jangan berbagi gambar dengan akun yang tidak Anda percayai.
-
Jangan membuat gambar publik yang memiliki data pribadi atau sensitif.
-
Terapkan semua patch keamanan Windows atau Linux yang tersedia selama pembuatan gambar.
Kami sangat menyarankan Anda menguji gambar Anda untuk memvalidasi postur keamanan dan tingkat kepatuhan keamanan yang berlaku. Solusi seperti Amazon Inspector dapat membantu memvalidasi postur keamanan dan kepatuhan gambar.
IMDSv2 untuk pipeline Image Builder
Saat pipeline Image Builder Anda berjalan, ia mengirimkan permintaan HTTP untuk meluncurkan instans EC2 yang digunakan Image Builder untuk membangun dan menguji gambar Anda. Untuk mengonfigurasi versi IMDS yang digunakan pipeline Anda untuk permintaan peluncuran, setel httpTokens
parameter dalam setelan metadata instans konfigurasi infrastruktur Image Builder.
Sebaiknya Anda mengonfigurasi semua instans EC2 yang diluncurkan Image Builder dari build pipeline untuk menggunakan IMDSv2 sehingga permintaan pengambilan metadata instance memerlukan header token yang ditandatangani.
Untuk informasi selengkapnya tentang konfigurasi infrastruktur Image Builder, lihatKelola konfigurasi infrastruktur EC2 Image Builder. Untuk informasi selengkapnya tentang opsi metadata instans EC2 untuk image Linux, lihat Mengonfigurasi opsi metadata instans di Panduan Pengguna Amazon EC2 untuk Instans Linux. Untuk gambar Windows, lihat Mengonfigurasi opsi metadata instans di Panduan Pengguna Amazon EC2 untuk Instans Windows.
Diperlukan pembersihan pasca-build
Setelah Image Builder menyelesaikan semua langkah pembuatan untuk image kustom Anda, Image Builder menyiapkan instance build untuk pengujian dan pembuatan gambar. Sebelum mematikan instance build untuk membuat snapshot, Image Builder melakukan pembersihan berikut untuk memastikan keamanan gambar Anda:
- Linux
-
Pipeline Image Builder menjalankan skrip pembersihan untuk membantu memastikan bahwa gambar akhir mengikuti praktik terbaik keamanan, dan untuk menghapus artefak atau pengaturan build apa pun yang tidak boleh terbawa ke snapshot Anda. Namun, Anda dapat melewati bagian skrip, atau mengganti data pengguna sepenuhnya. Oleh karena itu, gambar yang dihasilkan oleh pipeline Image Builder belum tentu sesuai dengan kriteria peraturan tertentu.
Saat pipeline menyelesaikan tahap pembuatan dan pengujiannya, Image Builder secara otomatis menjalankan skrip pembersihan berikut sebelum membuat gambar keluaran.
Jika Anda mengganti data Pengguna dalam resep Anda, skrip tidak berjalan. Dalam hal ini, pastikan bahwa Anda menyertakan perintah dalam data pengguna Anda yang membuat file kosong bernamaperform_cleanup
. Image Builder mendeteksi file ini dan menjalankan skrip pembersihan sebelum membuat gambar baru.
#!/bin/bash
if [[ ! -f {{workingDirectory}}/perform_cleanup ]]; then
echo "Skipping cleanup"
exit 0
else
sudo rm -f {{workingDirectory}}/perform_cleanup
fi
function cleanup() {
FILES=("$@")
for FILE in "${FILES[@]}"; do
if [[ -f "$FILE" ]]; then
echo "Deleting $FILE";
sudo shred -zuf $FILE;
fi;
if [[ -f $FILE ]]; then
echo "Failed to delete '$FILE'. Failing."
exit 1
fi;
done
};
# Clean up for cloud-init files
CLOUD_INIT_FILES=(
"/etc/sudoers.d/90-cloud-init-users"
"/etc/locale.conf"
"/var/log/cloud-init.log"
"/var/log/cloud-init-output.log"
)
if [[ -f {{workingDirectory}}/skip_cleanup_cloudinit_files ]]; then
echo "Skipping cleanup of cloud init files"
else
echo "Cleaning up cloud init files"
cleanup "${CLOUD_INIT_FILES[@]}"
if [[ $( sudo find /var/lib/cloud -type f | sudo wc -l ) -gt 0 ]]; then
echo "Deleting files within /var/lib/cloud/*"
sudo find /var/lib/cloud -type f -exec shred -zuf {} \;
fi;
if [[ $( sudo ls /var/lib/cloud | sudo wc -l ) -gt 0 ]]; then
echo "Deleting /var/lib/cloud/*"
sudo rm -rf /var/lib/cloud/* || true
fi;
fi;
# Clean up for temporary instance files
INSTANCE_FILES=(
"/etc/.updated"
"/etc/aliases.db"
"/etc/hostname"
"/var/lib/misc/postfix.aliasesdb-stamp"
"/var/lib/postfix/master.lock"
"/var/spool/postfix/pid/master.pid"
"/var/.updated"
"/var/cache/yum/x86_64/2/.gpgkeyschecked.yum"
)
if [[ -f {{workingDirectory}}/skip_cleanup_instance_files ]]; then
echo "Skipping cleanup of instance files"
else
echo "Cleaning up instance files"
cleanup "${INSTANCE_FILES[@]}"
fi;
# Clean up for ssh files
SSH_FILES=(
"/etc/ssh/ssh_host_rsa_key"
"/etc/ssh/ssh_host_rsa_key.pub"
"/etc/ssh/ssh_host_ecdsa_key"
"/etc/ssh/ssh_host_ecdsa_key.pub"
"/etc/ssh/ssh_host_ed25519_key"
"/etc/ssh/ssh_host_ed25519_key.pub"
"/root/.ssh/authorized_keys"
)
if [[ -f {{workingDirectory}}/skip_cleanup_ssh_files ]]; then
echo "Skipping cleanup of ssh files"
else
echo "Cleaning up ssh files"
cleanup "${SSH_FILES[@]}"
USERS=$(ls /home/)
for user in $USERS; do
echo Deleting /home/"$user"/.ssh/authorized_keys;
sudo find /home/"$user"/.ssh/authorized_keys -type f -exec shred -zuf {} \;
done
for user in $USERS; do
if [[ -f /home/"$user"/.ssh/authorized_keys ]]; then
echo Failed to delete /home/"$user"/.ssh/authorized_keys;
exit 1
fi;
done;
fi;
# Clean up for instance log files
INSTANCE_LOG_FILES=(
"/var/log/audit/audit.log"
"/var/log/boot.log"
"/var/log/dmesg"
"/var/log/cron"
)
if [[ -f {{workingDirectory}}/skip_cleanup_instance_log_files ]]; then
echo "Skipping cleanup of instance log files"
else
echo "Cleaning up instance log files"
cleanup "${INSTANCE_LOG_FILES[@]}"
fi;
# Clean up for TOE files
if [[ -f {{workingDirectory}}/skip_cleanup_toe_files ]]; then
echo "Skipping cleanup of TOE files"
else
echo "Cleaning TOE files"
if [[ $( sudo find {{workingDirectory}}/TOE_* -type f | sudo wc -l) -gt 0 ]]; then
echo "Deleting files within {{workingDirectory}}/TOE_*"
sudo find {{workingDirectory}}/TOE_* -type f -exec shred -zuf {} \;
fi
if [[ $( sudo find {{workingDirectory}}/TOE_* -type f | sudo wc -l) -gt 0 ]]; then
echo "Failed to delete {{workingDirectory}}/TOE_*"
exit 1
fi
if [[ $( sudo find {{workingDirectory}}/TOE_* -type d | sudo wc -l) -gt 0 ]]; then
echo "Deleting {{workingDirectory}}/TOE_*"
sudo rm -rf {{workingDirectory}}/TOE_*
fi
if [[ $( sudo find {{workingDirectory}}/TOE_* -type d | sudo wc -l) -gt 0 ]]; then
echo "Failed to delete {{workingDirectory}}/TOE_*"
exit 1
fi
fi
# Clean up for ssm log files
if [[ -f {{workingDirectory}}/skip_cleanup_ssm_log_files ]]; then
echo "Skipping cleanup of ssm log files"
else
echo "Cleaning up ssm log files"
if [[ $( sudo find /var/log/amazon/ssm -type f | sudo wc -l) -gt 0 ]]; then
echo "Deleting files within /var/log/amazon/ssm/*"
sudo find /var/log/amazon/ssm -type f -exec shred -zuf {} \;
fi
if [[ $( sudo find /var/log/amazon/ssm -type f | sudo wc -l) -gt 0 ]]; then
echo "Failed to delete /var/log/amazon/ssm"
exit 1
fi
if [[ -d "/var/log/amazon/ssm" ]]; then
echo "Deleting /var/log/amazon/ssm/*"
sudo rm -rf /var/log/amazon/ssm
fi
if [[ -d "/var/log/amazon/ssm" ]]; then
echo "Failed to delete /var/log/amazon/ssm"
exit 1
fi
fi
if [[ $( sudo find /var/log/sa/sa* -type f | sudo wc -l ) -gt 0 ]]; then
echo "Deleting /var/log/sa/sa*"
sudo shred -zuf /var/log/sa/sa*
fi
if [[ $( sudo find /var/log/sa/sa* -type f | sudo wc -l ) -gt 0 ]]; then
echo "Failed to delete /var/log/sa/sa*"
exit 1
fi
if [[ $( sudo find /var/lib/dhclient/dhclient*.lease -type f | sudo wc -l ) -gt 0 ]]; then
echo "Deleting /var/lib/dhclient/dhclient*.lease"
sudo shred -zuf /var/lib/dhclient/dhclient*.lease
fi
if [[ $( sudo find /var/lib/dhclient/dhclient*.lease -type f | sudo wc -l ) -gt 0 ]]; then
echo "Failed to delete /var/lib/dhclient/dhclient*.lease"
exit 1
fi
if [[ $( sudo find /var/tmp -type f | sudo wc -l) -gt 0 ]]; then
echo "Deleting files within /var/tmp/*"
sudo find /var/tmp -type f -exec shred -zuf {} \;
fi
if [[ $( sudo find /var/tmp -type f | sudo wc -l) -gt 0 ]]; then
echo "Failed to delete /var/tmp"
exit 1
fi
if [[ $( sudo ls /var/tmp | sudo wc -l ) -gt 0 ]]; then
echo "Deleting /var/tmp/*"
sudo rm -rf /var/tmp/*
fi
# Shredding is not guaranteed to work well on rolling logs
if [[ -f "/var/lib/rsyslog/imjournal.state" ]]; then
echo "Deleting /var/lib/rsyslog/imjournal.state"
sudo shred -zuf /var/lib/rsyslog/imjournal.state
sudo rm -f /var/lib/rsyslog/imjournal.state
fi
if [[ $( sudo ls /var/log/journal/ | sudo wc -l ) -gt 0 ]]; then
echo "Deleting /var/log/journal/*"
sudo find /var/log/journal/ -type f -exec shred -zuf {} \;
sudo rm -rf /var/log/journal/*
fi
sudo touch /etc/machine-id
- Windows
-
Setelah pipeline Image Builder menyesuaikan gambar Windows, ia menjalankan utilitas Microsoft Sysprep. Tindakan ini mengikuti praktik AWS terbaik untuk pengerasan dan pembersihan gambar.
Ganti skrip pembersihan Linux
Image Builder membuat gambar yang aman secara default dan mengikuti praktik terbaik keamanan kami. Namun, beberapa kasus penggunaan yang lebih canggih mungkin mengharuskan Anda untuk melewati satu atau lebih bagian dari skrip pembersihan bawaan. Jika Anda perlu melewatkan beberapa pembersihan, kami sangat menyarankan Anda menguji AMI keluaran Anda untuk memastikan keamanan gambar Anda.
Melewatkan bagian dalam skrip pembersihan dapat menghasilkan informasi sensitif, seperti detail akun pemilik atau kunci SSH yang disertakan dalam gambar akhir, dan dalam hal apa pun diluncurkan dari gambar itu. Anda mungkin juga mengalami masalah dengan peluncuran di Availability Zone, Region, atau akun yang berbeda.
Tabel berikut menguraikan bagian skrip pembersihan, file yang dihapus di bagian itu, dan nama file yang dapat Anda gunakan untuk menandai bagian yang harus dilewati oleh Image Builder. Untuk melewati bagian tertentu dari skrip pembersihan, Anda dapat menggunakan modul tindakan CreateFile komponen atau perintah dalam data pengguna Anda (jika diganti) untuk membuat file kosong dengan nama yang ditentukan dalam kolom Nama file bagian Lewati.
File yang Anda buat untuk melewati bagian skrip pembersihan tidak boleh menyertakan ekstensi file. Misalnya, jika Anda ingin melewati CLOUD_INIT_FILES
bagian skrip, tetapi Anda membuat file bernamaskip_cleanup_cloudinit_files.txt
, Image Builder tidak akan mengenali file skip.
Input
Bersihkan bagian |
File dihapus |
Lewati nama file bagian |
CLOUD_INIT_FILES
|
/etc/sudoers.d/90-cloud-init-users
/etc/locale.conf
/var/log/cloud-init.log
/var/log/cloud-init-output.log
|
skip_cleanup_cloudinit_files
|
INSTANCE_FILES
|
/etc/.updated
/etc/aliases.db
/etc/hostname
/var/lib/misc/postfix.aliasesdb-stamp
/var/lib/postfix/master.lock
/var/spool/postfix/pid/master.pid
/var/.updated
/var/cache/yum/x86_64/2/.gpgkeyschecked.yum
|
skip_cleanup_instance_files
|
SSH_FILES
|
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub
/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ecdsa_key.pub
/etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_ed25519_key.pub
/root/.ssh/authorized_keys
/home/<all users>/.ssh/authorized_keys;
|
skip_cleanup_ssh_files
|
INSTANCE_LOG_FILES
|
/var/log/audit/audit.log
/var/log/boot.log
/var/log/dmesg
/var/log/cron
|
skip_cleanup_instance_log_files
|
TOE_FILES
|
{{workingDirectory}}/TOE_*
|
skip_cleanup_toe_files
|
SSM_LOG_FILES
|
/var/log/amazon/ssm/*
|
skip_cleanup_ssm_log_files
|