Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Buat AMI Linux dengan tombol Boot Aman UEFI kustom
Prosedur ini menunjukkan kepada Anda cara membuat AMI Linux dengan UEFI Secure Boot dan kunci pribadi yang dibuat khusus. Amazon Linux mendukung UEFI Secure Boot dimulai dengan rilis AL2 023 2023.1. Untuk informasi selengkapnya, lihat Boot Aman UEFI di Panduan Pengguna AL2023.
penting
Prosedur berikut ditujukan untuk pengguna tingkat lanjut saja. Anda harus memiliki pengetahuan yang cukup tentang alur boot distribusi SSL dan Linux untuk menggunakan prosedur ini.
Prasyarat
-
Alat-alat berikut akan digunakan:
-
Instans Linux Anda harus telah diluncurkan dengan AMI Linux yang mendukung mode boot UEFI, dan memiliki data non-volatile.
Instans yang baru dibuat tanpa kunci UEFI Secure Boot akan dibuat di SetupMode
, yang memungkinkan Anda untuk mendaftarkan kunci Anda sendiri. Beberapa AMIs datang pra-konfigurasi dengan UEFI Secure Boot dan Anda tidak dapat mengubah kunci yang ada. Jika Anda ingin mengubah kunci, Anda harus membuat AMI baru berdasarkan AMI yang asli.
Anda memiliki dua cara untuk menyebarkan kunci di penyimpanan variabel, yang dijelaskan dalam Opsi A dan Opsi B di bawah ini. Opsi A menjelaskan bagaimana melakukan ini dari dalam instans, meniru aliran perangkat keras nyata. Opsi B menjelaskan cara membuat gumpalan biner, yang kemudian diteruskan sebagai file base64 saat Anda membuat AMI. Untuk kedua opsi, Anda harus terlebih dahulu membuat tiga pasang kunci, yang digunakan untuk rantai kepercayaan.
Untuk membuat AMI Linux yang mendukung UEFI Secure Boot, pertama-tama buat tiga pasangan kunci, lalu selesaikan Opsi A atau Opsi B, tetapi tidak keduanya:
Langkah 1
UEFI Secure Boot didasarkan pada tiga basis data utama berikut, yang digunakan dalam rantai kepercayaan: kunci platform (PK), kunci untuk pertukaran kunci (KEK), dan basis data (db) tanda tangan.¹
Anda membuat setiap kunci pada instans. Untuk menyiapkan kunci publik dalam format yang valid untuk standar UEFI Secure Boot, Anda membuat sertifikat untuk setiap kunci. DER
mendefinisikan format SSL (pengodean biner suatu format). Anda kemudian mengonversi setiap sertifikat menjadi daftar tanda tangan UEFI, yang merupakan format biner yang dipahami oleh UEFI Secure Boot. Terakhir, Anda menandatangani setiap sertifikat dengan kunci yang relevan.
Tugas
Bersiap untuk membuat pasangan kunci
Sebelum membuat pasangan kunci, buat pengidentifikasi unik global (GUID) untuk digunakan dalam pembuatan kunci.
-
Jalankan perintah berikut di prompt shell.
uuidgen --random > GUID.txt
Pasangan kunci 1: Buat kunci platform (PK)
PK adalah root kepercayaan untuk instans UEFI Secure Boot. PK privat digunakan untuk memperbarui KEK, yang nantinya dapat digunakan untuk menambahkan kunci resmi ke basis data (db) tanda tangan.
Standar X.509 digunakan untuk membuat pasangan kunci. Untuk informasi tentang standar yang digunakan, lihat X.509
Untuk membuat PK
-
Buat kunci. Anda harus memberi nama variabel
PK
.openssl req -newkey rsa:4096 -nodes -keyout PK.key -new -x509 -sha256 -days 3650 -subj "/CN=
Platform key
/" -out PK.crtParameter berikut ditentukan:
-
-keyout PK.key
– File kunci privat. -
-days 3650
– Jumlah hari sertifikat tersebut valid. -
-out PK.crt
– Sertifikat yang digunakan untuk membuat variabel UEFI. -
CN=
– Nama umum (CN) untuk kunci. Anda dapat memasukkan nama organisasi Anda sendiri alih-alihPlatform key
Platform key
.
-
-
Buat sertifikat.
openssl x509 -outform DER -in PK.crt -out PK.cer
-
Konversi sertifikat menjadi daftar tanda tangan UEFI.
cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
-
Tanda tangani daftar tanda tangan UEFI dengan PK privat (yang ditandatangani sendiri).
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt PK PK.esl PK.auth
Pasangan kunci 2: Buat kunci untuk pertukaran kunci (KEK)
KEK privat digunakan untuk menambahkan kunci ke db, yang merupakan daftar tanda tangan resmi untuk boot pada sistem.
Untuk membuat PK
-
Buat kunci.
openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj "/CN=Key Exchange Key/" -out KEK.crt
-
Buat sertifikat.
openssl x509 -outform DER -in KEK.crt -out KEK.cer
-
Konversi sertifikat menjadi daftar tanda tangan UEFI.
cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
-
Tanda tangani daftar tanda tangan dengan PK privat.
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth
Pasangan kunci 3: Buat basis data (db) tanda tangan
Daftar db berisi kunci resmi yang diizinkan untuk di-boot pada sistem. Untuk memodifikasi daftar ini, diperlukan KEK privat. Gambar boot akan ditandatangani dengan kunci privat yang dibuat pada langkah ini.
Untuk membuat PK
-
Buat kunci.
openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=Signature Database key/" -out db.crt
-
Buat sertifikat.
openssl x509 -outform DER -in db.crt -out db.cer
-
Konversi sertifikat menjadi daftar tanda tangan UEFI.
cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
-
Tanda tangani daftar tanda tangan dengan KEK privat.
sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db db.esl db.auth
Tanda tangani gambar boot (kernel) dengan kunci privat
Untuk Ubuntu 22.04, gambar berikut memerlukan tanda tangan.
/boot/efi/EFI/ubuntu/shimx64.efi
/boot/efi/EFI/ubuntu/mmx64.efi
/boot/efi/EFI/ubuntu/grubx64.efi
/boot/vmlinuz
Untuk menandatangani gambar
Gunakan sintaksis berikut untuk menandatangani gambar.
sbsign --key db.key --cert db.crt --output
/boot/vmlinuz
/boot/vmlinuz
catatan
Anda harus menandatangani semua kernel baru.
biasanya akan symlink ke kernel yang terakhir diinstal./boot/vmlinuz
Lihat dokumentasi distribusi Anda untuk menemukan rantai boot dan gambar yang diperlukan.
¹ Terima kasih kepada ArchWiki komunitas untuk semua pekerjaan yang telah mereka lakukan. Perintah untuk membuat PK, membuat KEK, membuat DB, dan menandatangani gambar berasal dari Creating keys
Langkah 2 (Opsi A): Tambahkan kunci ke penyimpanan variabel dari dalam instance
Setelah Anda membuat tiga pasang kunci, Anda dapat terhubung ke instans Anda dan menambahkan kunci ke penyimpanan variabel dari dalam instans dengan menyelesaikan langkah-langkah berikut. Atau, selesaikan langkah-langkah untukLangkah 2 (Opsi B): Buat gumpalan biner yang berisi penyimpanan variabel yang telah diisi sebelumnya.
Langkah-langkah Opsi A:
Langkah 1: Luncurkan instans yang akan mendukung UEFI Secure Boot
Ketika Anda meluncurkan sebuah instans dengan prasyarat berikut, instans kemudian akan siap untuk dikonfigurasi untuk mendukung UEFI Secure Boot. Anda hanya dapat mengaktifkan dukungan untuk UEFI Secure Boot pada instans saat peluncuran; Anda tidak dapat mengaktifkannya nanti.
Prasyarat
-
AMI – AMI Linux harus mendukung mode boot UEFI. Untuk memverifikasi bahwa AMI mendukung mode boot UEFI, parameter mode boot AMI harus uefi. Untuk informasi selengkapnya, lihat Tentukan parameter mode boot Amazon EC2 AMI.
Perhatikan bahwa AWS hanya menyediakan Linux yang AMIs dikonfigurasi untuk mendukung UEFI untuk jenis instans berbasis Graviton. AWS saat ini tidak menyediakan x86_64 Linux AMIs yang mendukung mode boot UEFI. Anda dapat mengonfigurasi AMI Anda sendiri untuk mendukung mode boot UEFI untuk semua arsitektur. Untuk mengonfigurasi AMI Anda sendiri untuk mendukung mode boot UEFI, Anda harus melakukan sejumlah langkah konfigurasi pada AMI Anda sendiri. Untuk informasi selengkapnya, lihat Mengatur mode boot Amazon EC2 AMI.
-
Tipe instans – Semua tipe instans virtual yang mendukung UEFI juga mendukung UEFI Secure Boot. Tipe instans bare metal tidak mendukung UEFI Secure Boot. Untuk tipe instans yang mendukung UEFI Secure Boot, lihat Persyaratan untuk mode boot UEFI.
-
Luncurkan instans Anda setelah rilis UEFI Secure Boot. Hanya instans yang diluncurkan setelah 10 Mei 2022 (saat UEFI Secure Boot dirilis) yang dapat mendukung UEFI Secure Boot.
Setelah Anda meluncurkan instans Anda, Anda dapat memverifikasi bahwa instans siap dikonfigurasi untuk mendukung UEFI Secure Boot (dengan kata lain, Anda dapat melanjutkan ke Langkah 2) dengan memeriksa apakah tersedia data UEFI. Keberadaan data UEFI menunjukkan bahwa data non-volatile tetap ada.
Untuk memverifikasi apakah instans Anda siap untuk Langkah 2
Gunakan get-instance-uefi-data
aws ec2 get-instance-uefi-data --instance-id
i-0123456789example
Instans siap untuk Langkah 2 jika data UEFI sudah tersedia dalam output. Jika output kosong, instans tidak dapat dikonfigurasi untuk mendukung UEFI Secure Boot. Hal ini dapat terjadi jika instans Anda diluncurkan sebelum dukungan UEFI Secure Boot tersedia. Luncurkan instans baru dan coba lagi.
Langkah 2: Konfigurasikan instans untuk mendukung UEFI Secure Boot
Daftarkan pasangan kunci di penyimpanan variabel UEFI Anda pada instans
Awas
Anda harus menandatangani gambar boot Anda setelah Anda mendaftarkan kunci, jika tidak, Anda tidak akan dapat melakukan boot instans Anda.
Setelah Anda membuat daftar tanda tangan UEFI yang ditandatangani (PK
, KEK
, dan db
), tanda tangan tersebut harus terdaftar ke firmware UEFI.
Penulisan ke variabel PK
hanya dapat dilakukan jika:
-
Belum ada PK yang terdaftar, yang ditunjukkan jika variabel
SetupMode
nya1
. Periksa ini dengan menggunakan perintah berikut. Outputnya adalah1
atau0
.efivar -d -n 8be4df61-93ca-11d2-aa0d-00e098032b8c-SetupMode
-
PK yang baru ditandatangani oleh kunci privat dari PK yang ada.
Untuk mendaftarkan kunci di penyimpanan variabel UEFI Anda
Perintah berikut harus dijalankan pada instans.
Jika SetupMode diaktifkan (nilainya1
), kunci dapat didaftarkan dengan menjalankan perintah berikut pada instance:
[ec2-user ~]$
efi-updatevar -f db.auth db
[ec2-user ~]$
efi-updatevar -f KEK.auth KEK
[ec2-user ~]$
efi-updatevar -f PK.auth PK
Untuk memverifikasi bahwa UEFI Secure Boot diaktifkan
Untuk memverifikasi bahwa UEFI Secure Boot diaktifkan, ikuti langkah-langkah di Verifikasi apakah EC2 instans Amazon diaktifkan untuk UEFI Secure Boot.
Anda sekarang dapat mengekspor toko variabel UEFI Anda dengan get-instance-uefi-data
Langkah 3: Buat AMI dari instans
Untuk membuat AMI dari instance, Anda dapat menggunakan konsol atau CreateImage
API, CLI, atau. SDKs Untuk instruksi konsol, lihat Buat AMI yang didukung Amazon EBS-Backed. Untuk petunjuk API, lihat CreateImage.
catatan
API CreateImage
secara otomatis menyalin penyimpanan variabel UEFI dari instans ke AMI. Konsol menggunakan API CreateImage
. Setelah Anda meluncurkan instans menggunakan AMI ini, instans akan memiliki penyimpanan variabel UEFI yang sama.
Langkah 2 (Opsi B): Buat gumpalan biner yang berisi penyimpanan variabel yang telah diisi sebelumnya
Setelah Anda membuat tiga pasangan kunci, Anda dapat membuat gumpalan biner yang berisi penyimpanan variabel yang telah diisi sebelumnya yang berisi kunci UEFI Secure Boot. Atau, selesaikan langkah-langkah untukLangkah 2 (Opsi A): Tambahkan kunci ke penyimpanan variabel dari dalam instance.
Awas
Anda harus menandatangani gambar boot Anda sebelum mendaftarkan kunci, jika tidak, Anda tidak akan dapat melakukan boot instans Anda.
Langkah-langkah Opsi B:
Langkah 1: Buat penyimpanan variabel baru atau perbarui yang sudah ada
Anda dapat membuat penyimpanan variabel offline tanpa instans yang berjalan dengan menggunakan python-uefivars. Alat ini dapat membuat penyimpanan variabel baru dari kunci Anda. Skrip saat ini mendukung EDK2 format, AWS format, dan representasi JSON yang lebih mudah diedit dengan perkakas tingkat yang lebih tinggi.
Untuk membuat penyimpanan variabel offline tanpa instans yang berjalan
-
Unduh alat di tautan berikut.
https://github.com/awslabs/python-uefivars
-
Buat penyimpanan variabel baru dari kunci Anda dengan menjalankan perintah berikut. Ini akan membuat gumpalan biner berenkode base64 di.bin.
your_binary_blob
Alat ini juga mendukung pembaruan gumpalan biner melalui parameter-I
../uefivars.py -i none -o aws -O
your_binary_blob
.bin -P PK.esl -K KEK.esl --db db.esl --dbx dbx.esl
Langkah 2: Unggah gumpalan biner pada pembuatan AMI
Gunakan register-image--uefi-data
, tentukan gumpalan biner Anda, dan untuk parameter --boot-mode
, tentukan uefi
.
aws ec2 register-image \ --name uefi_sb_tpm_register_image_test \ --uefi-data $(cat
your_binary_blob
.bin) \ --block-device-mappings "DeviceName=/dev/sda1,Ebs= {SnapshotId=snap-0123456789example
,DeleteOnTermination=true}" \ --architecture x86_64 \ --root-device-name /dev/sda1 \ --virtualization-type hvm \ --ena-support \ --boot-mode uefi