Sistem önyükleme sırasında bir LUKS kabının şifresini çözme

Herkese iyi günler ve geceler! Bu gönderi, LUKS veri şifreleme kullanan ve üzerinde Linux (Debian, Ubuntu) altında disklerin şifresini çözmek isteyenler için yararlı olacaktır. kök bölümün şifresini çözme aşamaları. Ve internette böyle bir bilgi bulamadım.

Daha yakın zamanlarda, raflardaki disk sayısının artmasıyla birlikte, /etc/crypttab üzerinden bilinenden daha fazla bilinen yöntemi kullanarak disklerin şifresini çözme sorunuyla karşılaştım. Şahsen, bu yöntemi kullanmayla ilgili birkaç sorunu, yani dosyanın okunduğunu vurguluyorum. yalnızca kök bölümü yükledikten (bağladıktan) sonra, özellikle bir *_crypt aygıtındaki bölümlerden oluşturulduysa veya bölümlerden oluşturulmuş mdadm baskınları varsa, ZFS içe aktarmalarını olumsuz etkiler. Hepimiz LUKS konteynerlerinde parted kullanabileceğinizi biliyoruz, değil mi? Ve ayrıca, henüz dizi olmadığında, ancak diğer hizmetlerin erken başlaması sorunu kullanmak Zaten bir şeye ihtiyacım var (kümelenmiş Proxmox VE 5.x ve iSCSI üzerinden ZFS ile çalışıyorum).

ZFSoverISCSI hakkında biraziSCSI benim için LIO aracılığıyla çalışıyor ve aslında, iscsi hedefi başladığında ve ZVOL aygıtlarını görmediğinde, onları yalnızca yapılandırmadan kaldırarak konuk sistemlerin önyüklenmesini engelliyor. Bu nedenle, ya bir json dosyası yedeğini geri yüklemek ya da her VM için tanımlayıcılara sahip cihazları manuel olarak eklemek, bu tür düzinelerce makine olduğunda ve her yapılandırmada 1'den fazla disk olduğunda, bu tek kelimeyle korkunçtur.

Ve ele alacağım ikinci soru, şifrenin nasıl çözüleceğidir (bu, makalenin kilit noktasıdır). Ve bunun hakkında aşağıda konuşacağız, kesimin altına girin!

Çoğu zaman, İnternette bir anahtar dosyası kullanılır (bundan önce yuvaya cryptsetup luksAddKey komutuyla eklenir) veya nadir istisnalarda (Rusça İnternette çok az bilgi vardır) - decrypt_derived komut dosyası /lib/cryptsetup/script/ içinde bulunur (elbette başka yollar da var ama ben makalenin temelini oluşturan bu ikisini kullandım). Ayrıca, yeniden başlatmalardan sonra, konsolda herhangi bir ek komut olmadan tam otonom katılım için çabaladım, böylece her şey benim için bir anda "uçup gidecekti". Bu nedenle, neden bekleyelim? —

Başlayalım!

Debian gibi bir sistemin bir sda3_crypt kripto bölümüne ve şifrelenmeye ve istediğiniz gibi oluşturulmaya hazır bir düzine diske yüklendiğini varsayalım. sda3_crypt'in kilidini açmak için bir parolamız (parolamız) var ve bu bölümden, çalışan (şifresi çözülmüş) sistemdeki paroladan "karma"yı kaldıracağız ve onu diğer disklere ekleyeceğiz. Her şey basit, yürüttüğümüz konsolda:

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

X, disklerimiz, bölümlerimiz vb.

Diskleri parolamızdan bir "karma" ile şifreledikten sonra, kimin neye ve neye alıştığına bağlı olarak UUID veya kimliği bulmanız gerekir. Sırasıyla /dev/disk/by-uuid ve by-id'den veri alıyoruz.

Bir sonraki adım, ihtiyacımız olan işlevler için dosyalar ve mini komut dosyaları hazırlamaktır, devam edelim:

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/

daha fazla

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

../decrypt içeriği

#!/bin/sh

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

daha fazla

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

../partcopy içeriği

#!/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"

biraz daha

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

İçerik ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

ve son olarak, update-initramfs'ten önce, ~360 satırından başlayarak /etc/initramfs-tools/scripts/local-top/cryptroot dosyasını, aşağıdaki kod parçacığını düzenlemeniz gerekir

Orijinal


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

ve bu forma getir

düzenlendi


                # 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

UUID veya ID'nin burada kullanılabileceğini unutmayın. Önemli olan HDD / SSD aygıtları için gerekli sürücülerin /etc/initramfs-tools/modules.conf dizinine eklenmesidir. komutu ile hangi sürücünün kullanıldığını öğrenebilirsiniz. udevadm bilgisi -a -n /dev/sdX | egrep 'arıyor|SÜRÜCÜ'.

Artık işimiz bittiğine ve tüm dosyalar yerinde olduğuna göre, çalıştırın güncelleme-initramfs -u -k tümü -v, günlük kaydında olmamalı betiklerimizin yürütme hataları. Yeniden başlatıyoruz, parolayı giriyoruz ve disk sayısına bağlı olarak biraz bekliyoruz. Ardından, sistem başlayacak ve başlatmanın son aşamasında, yani kök bölümü "bağladıktan" sonra, partprobe komutu yürütülecek - LUKS cihazlarında ve ZFS veya herhangi bir dizide oluşturulan tüm bölümleri bulacak ve alacaktır. mdadm, sorunsuz bir şekilde kurulacak! Ve tüm bunlar yüklemeden önce çekirdek hizmetler ve bu disklere/dizilere ihtiyaç duyan hizmetler.

update1: Nasıl farkettim AEP, bu yöntem yalnızca LUKS1 için çalışır.

Kaynak: habr.com

Yorum ekle