Mendekripsi wadah LUKS saat boot sistem

Selamat siang dan malam semuanya! Posting ini akan berguna bagi mereka yang menggunakan enkripsi data LUKS dan ingin mendekripsi disk di Linux (Debian, Ubuntu) di tahapan mendekripsi partisi root. Dan saya tidak dapat menemukan informasi seperti itu di Internet.

Baru-baru ini, dengan bertambahnya jumlah disk di rak, saya mengalami masalah mendekripsi disk menggunakan metode yang lebih terkenal melalui /etc/crypttab. Secara pribadi, saya menyoroti beberapa masalah dengan menggunakan metode ini, yaitu file sedang dibaca hanya setelah memuat (mount) partisi root, yang secara negatif memengaruhi impor ZFS, khususnya jika dibuat dari partisi pada perangkat *_crypt, atau serangan mdadm juga dibuat dari partisi. Kita semua tahu bahwa Anda dapat menggunakan parted pada wadah LUKS, bukan? Dan juga masalah mulai awal layanan lain, ketika belum ada array, tapi untuk menggunakan Saya sudah membutuhkan sesuatu (saya bekerja dengan clustered Proxmox VE 5.x dan ZFS melalui iSCSI).

Sedikit tentang ZFSoverISCSIiSCSI bekerja untuk saya melalui LIO, dan pada kenyataannya, ketika target iscsi dimulai dan tidak melihat perangkat ZVOL, itu hanya menghapusnya dari konfigurasi, yang mencegah booting sistem tamu. Oleh karena itu, memulihkan cadangan file json, atau menambahkan perangkat secara manual dengan pengidentifikasi untuk setiap VM, yang sangat buruk ketika ada lusinan mesin seperti itu dan setiap konfigurasi memiliki lebih dari 1 disk.

Dan pertanyaan kedua yang akan saya pertimbangkan adalah bagaimana mendekripsi (ini adalah poin kunci dari artikel ini). Dan kita akan membicarakannya di bawah ini, lanjutkan!

Paling sering, di Internet, file kunci digunakan (ditambahkan sendiri ke slot sebelum ini dengan perintah - cryptsetup luksAddKey), atau dalam pengecualian yang jarang (di Internet berbahasa Rusia hanya ada sedikit informasi) - skrip decrypt_derived terletak di /lib/cryptsetup/script/ (tentu saja, ada cara lain, tapi saya menggunakan dua ini, yang menjadi dasar artikel). Saya juga berusaha untuk penyertaan otonom penuh setelah reboot, tanpa perintah tambahan di konsol, sehingga semuanya akan "terbang" untuk saya sekaligus. Karena itu, mengapa menunggu? β€”

Ayo mulai!

Mari kita asumsikan sebuah sistem, seperti Debian, diinstal pada partisi crypto sda3_crypt dan selusin disk siap untuk dienkripsi dan dibuat sesuka hati Anda. Kami memiliki frasa sandi (frasa sandi) untuk membuka sda3_crypt, dan dari partisi inilah kami akan menghapus "hash" dari kata sandi pada sistem yang sedang berjalan (didekripsi) dan menambahkannya ke disk lainnya. Semuanya dasar, di konsol kami mengeksekusi:

/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdX

di mana X adalah disk, partisi, dll.

Setelah mengenkripsi disk dengan "hash" dari frasa sandi kami, Anda perlu mengetahui UUID atau ID - tergantung siapa yang terbiasa dengan apa dan apa. Kami mengambil data masing-masing dari /dev/disk/by-uuid dan by-id.

Langkah selanjutnya adalah menyiapkan file dan skrip mini untuk fungsi yang kita butuhkan, mari kita lanjutkan:

cp -p /usr/share/initramfs-tools/hooks/cryptroot /etc/initramfs-tools/hooks/
cp -p /usr/share/initramfs-tools/scripts/local-top/cryptroot /etc/initramfs-tools/scripts/local-top/

lebih lanjut

touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decrypt

Isi dari ../dekripsi

#!/bin/sh

cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"

lebih lanjut

touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopy

Isi dari ../partcopy

#!/bin/sh

cp -p /sbin/partprobe "$DESTDIR/bin/partprobe"
cp -p /lib/x86_64-linux-gnu/libparted.so.2 "$DESTDIR/lib/x86_64-linux-gnu/libparted.so.2"
cp -p /lib/x86_64-linux-gnu/libreadline.so.7 "$DESTDIR/lib/x86_64-linux-gnu/libreadline.so.7"

lebih lagi

touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobe

Konten ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

dan terakhir, sebelum update-initramfs, Anda perlu mengedit file /etc/initramfs-tools/scripts/local-top/cryptroot, mulai dari baris ~360, potongan kode di bawah

Asli


                # decrease $count by 1, apparently last try was successful.
                count=$(( $count - 1 ))
                
                message "cryptsetup ($crypttarget): set up successfully"
                break

dan membawanya ke formulir ini

Diedit


                # decrease $count by 1, apparently last try was successful.
                count=$(( $count - 1 ))
                

                /bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-uuid/ *CRYPT_MAP*
                /bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-id/ *CRYPT_MAP*

                message "cryptsetup ($crypttarget): set up successfully"
                break

Perhatikan bahwa UUID atau ID dapat digunakan di sini. Hal utama adalah driver yang diperlukan untuk perangkat HDD / SSD ditambahkan ke /etc/initramfs-tools/modules. Anda dapat mengetahui driver mana yang digunakan dengan perintah info udevadm -a -n /dev/sdX | egrep 'mencari|DRIVER'.

Sekarang setelah kita selesai dan semua file sudah ada, jalankan perbarui-initramfs -u -k semua -v, dalam pencatatan tidak harus kesalahan eksekusi skrip kami. Kami mem-boot ulang, memasukkan frasa sandi dan menunggu sebentar, tergantung pada jumlah disk. Selanjutnya, sistem akan mulai dan pada tahap akhir peluncuran, yaitu setelah "memasang" partisi root, perintah partprobe akan dijalankan - ia akan menemukan dan mengambil semua partisi yang dibuat pada perangkat LUKS dan larik apa pun, baik itu ZFS atau mdadm, akan dirakit tanpa masalah! Dan semua ini sebelum memuat layanan inti dan layanan yang membutuhkan disk/array ini.

pemutakhiran1: Bagaimana diperhatikan AEP, metode ini hanya berfungsi untuk LUKS1.

Sumber: www.habr.com

Tambah komentar