Decoding wadah LUKS saat boot

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

Baru-baru ini, dengan peningkatan jumlah disk di rak, saya menemui masalah mendekripsi disk menggunakan metode yang lebih dikenal melalui / etc / crypttab. Secara pribadi, saya menyoroti beberapa masalah menggunakan metode ini, yaitu, bahwa file tersebut dibaca hanya setelah partisi root di-mount (mount) , yang secara negatif mempengaruhi impor ZFS, khususnya jika mereka dikumpulkan dari partisi pada perangkat * _crypt, atau penggerebekan mdadm dikumpulkan juga dari bagian. Kita semua tahu bahwa Anda dapat menggunakan parted pada wadah LUKS? Dan juga masalah awal dimulainya layanan lain ketika belum ada array, tetapi sesuatu perlu digunakan (saya bekerja dengan Proxmox VE 5.x yang dikelompokkan dan ZFS melalui iSCSI).

Sedikit tentang ZFSoverISCSI
iSCSI bekerja untuk saya melalui LIO, dan sebenarnya ketika target iscsi dimulai dan tidak melihat perangkat ZVOL, itu hanya menghapusnya dari konfigurasi, yang tidak memungkinkan sistem tamu untuk boot. Oleh karena itu, baik mengembalikan cadangan file json, atau secara manual menambahkan perangkat dengan pengidentifikasi masing-masing VM, yang hanya mengerikan ketika ada puluhan mesin seperti itu dan ada lebih dari 1 disk dalam konfigurasi masing-masing.

Dan pertanyaan kedua yang akan saya pertimbangkan adalah bagaimana mendekripsi (ini adalah poin utama artikel). Dan kita akan membicarakan ini di bawah, potonglah!

Paling sering, di Internet, mereka menggunakan file kunci (perintah cryptsetup luksAddKey ditambahkan ke slot dengan sendirinya sebelum ini), atau dalam pengecualian langka (Internet berbahasa Rusia adalah informasi yang sangat langka) - skrip decrypt_derived, yang ada di / lib / cryptsetup / script / (tentu saja, masih ada cara, tapi saya menggunakan keduanya, yang menjadi dasar artikel). Saya juga berusaha untuk inklusi otonom penuh setelah reboot, tanpa ada perintah tambahan di konsol, sehingga semuanya akan "lepas landas" sekaligus. Jadi mengapa harus menunggu? -

Ayo mulai!

Kami berasumsi sebuah sistem, misalnya, Debian, diinstal pada sda3_crypt crypto-partisi dan selusin disk siap untuk enkripsi dan membuat apa pun yang Anda suka. Kami memiliki frasa sandi untuk membuka kunci sda3_crypt dan dari bagian inilah kami akan menghapus "hash" dari kata sandi pada sistem yang berjalan (didekripsi) dan menambahkannya ke drive lain. Semuanya dasar, di konsol kita jalankan:

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

di mana X adalah disk, partisi, dll.

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

Tahap selanjutnya adalah persiapan file dan skrip mini untuk fungsi yang diperlukan untuk bekerja, kami melanjutkan:

 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/ 

selanjutnya

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

Konten ../decrypt
 #!/bin/sh cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived" 


selanjutnya

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

Konten ../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" 


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 pembaruan-initramfs, Anda perlu mengedit file / etc / initramfs-tools / script / local-top / cryptroot, mulai dari baris ~ 360, sepotong kode di bawah ini

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


dan bawa 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 


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

Sekarang kita telah selesai dan semua file di tempat, jalankan update-initramfs -u -k all -v , seharusnya tidak ada kesalahan dalam pelaksanaan skrip kami di logging. Kami reboot, masukkan frasa sandi dan tunggu sebentar, tergantung pada jumlah disk. Selanjutnya, sistem akan mulai dan pada tahap akhir startup, yaitu, setelah "memasang" partisi root, perintah partprobe akan dieksekusi - ia akan menemukan dan mengambil semua partisi yang dibuat pada perangkat LUKS dan setiap array, apakah ZFS atau mdadm, akan berkumpul tanpa masalah! Dan semua ini sebelum memuat layanan dasar dan layanan yang membutuhkan disk / array ini.

update1 : Seperti yang dicatat AEP , metode ini hanya berfungsi untuk LUKS1.

Source: https://habr.com/ru/post/id457260/


All Articles