Praktik terbaik keamanan untuk EC2 Image Builder - EC2 Image Builder

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.

catatan

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.

penting

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.

penting

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.

catatan

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