Hallo allemaal, goede dag of nacht! Deze post is nuttig voor degenen die data-encryptie met LUKS gebruiken en schijven onder Linux (Debian, Ubuntu) willen ontsleutelen op de fase van het ontsleutelen van de root-partitie. En dergelijke informatie kon ik op internet niet vinden.
Onlangs, met het toenemende aantal schijven in de rekken, stuitte ik op het probleem van het ontsleutelen van schijven met behulp van de welbekende methode via /etc/crypttab. Persoonlijk zie ik verschillende problemen bij het gebruik van deze methode, met name dat het bestand wordt gelezen pas nadat de root-partitie is geladen (mounted), wat een negatieve invloed heeft op de import van ZFS, vooral als ze zijn opgebouwd uit partities op een *_crypt apparaat, of mdadm RAID's die ook uit partities zijn opgebouwd. We weten allemaal dat je parted kunt gebruiken op LUKS-containers? En ook het probleem van het vroeg opstarten van andere diensten wanneer de array's er nog niet zijn, maar gebruikt er al iets moet gebeuren (ik werk met geclusterde Proxmox VE 5.x en ZFS over iSCSI).
Een beetje over ZFS over iSCSIiSCSI werkt bij mij via LIO, en wanneer de iscsi-target start en de ZVOL-apparaten niet kan zien, verwijdert het ze gewoon uit de configuratie, wat het onmogelijk maakt voor de gastsystemen om te booten. Vandaar ofwel het herstellen van de backup json-bestand, of handmatig het toevoegen van apparaten met de identificaties van elke VM, wat gewoon vreselijk is wanneer er tientallen van dergelijke machines zijn en in de configuratie van elke meer dan 1 schijf.
En de tweede vraag die ik zal bespreken, is hoe de ontsleuteling moet worden uitgevoerd (dit is een cruciaal punt van het artikel). En daarover zullen we hieronder praten, kom onder de kat!
Vaak wordt op internet een sleutelbestand gebruikt (natuurlijk vooraf toegevoegd aan de slot met het commando — cryptsetup luksAddKey), of in zeldzame uitzonderingen (op de Russischtalige internet is de informatie erg schaars) — het script decrypt_derived, dat zich bevindt in /lib/cryptsetup/script/ (natuurlijk zijn er nog andere manieren, maar ik heb deze twee gebruikt, die de basis van het artikel vormden). Ook streefde ik naar een volledig autonome opstart na herstarts, zonder enige aanvullende commando's in de console, zodat alles direct werkte. Dus, waarom wachten? —
Laten we beginnen!
Laten we een systeem aannemen, bijvoorbeeld Debian, geïnstalleerd op de crypto-partitie sda3_crypt en een dozijn schijven klaar voor versleuteling en het creëren van wat men maar wil. We hebben een wachtwoordzin (passphrase) om sda3_crypt te ontgrendelen en vanaf deze partitie gaan we op het uitgerolde (gedecrypteerde) systeem een 'hash' van het wachtwoord maken en deze toevoegen aan de andere schijven. Het is heel eenvoudig, in de console voeren we uit:
/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdXwaarbij X onze schijven, partities, enz. is.
Na het versleutelen van de schijven met de 'hash' van onze wachtwoordzin, moeten we de UUID of ID kennen - afhankelijk van wat men gewend is. We halen de gegevens uit /dev/disk/by-uuid en by-id.
De volgende stap is het voorbereiden van bestanden en mini-scripts voor de benodigde functies, laten we beginnen:
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/verder
touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decryptInhoud van .. /decrypt
#!/bin/sh
cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"verder
touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopyInhoud van .. /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"nog een beetje
touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobeInhoud van .. /partprobe
#!/bin/sh
$DESTDIR/bin/partprobeen als laatste, voordat we update-initramfs uitvoeren, moeten we het bestand /etc/initramfs-tools/scripts/local-top/cryptroot bewerken, vanaf regel ~360, hieronder een stukje code
Origineel
# decrease $count by 1, apparently last try was successful.
count=$(( $count - 1 ))
message "cryptsetup ($crypttarget): set up successfully"
break
en we brengen het in deze vorm
Bewerkte
# 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"
breakLet op, dat hier zowel UUID als ID gebruikt kan worden. Het belangrijkste is dat de juiste stuurprogramma's voor HDD/SSD-apparaten aan /etc/initramfs-tools/modules zijn toegevoegd. Je kunt het gebruikte stuurprogramma achterhalen met de opdracht udevadm info -a -n /dev/sdX | egrep 'looking|DRIVER'.
Nu we klaar zijn en alle bestanden op hun plaats zijn, voeren we uit update-initramfs -u -k all -v, in de logging mogen geen zijn uitvoeringsfouten van onze scripts. We starten opnieuw op, voeren de wachtwoordzin in en wachten even, afhankelijk van het aantal schijven. Dan zal het systeem opstarten en in de eindfase van de opstart, na het 'mounten' van de root-partitie, wordt de opdracht partprobe uitgevoerd — deze zal alle aangemaakte partities op LUKS-apparaten vinden en aansluiten, en eventuele opslagarray's, of het nu ZFS of mdadm is, zullen zonder problemen worden samengesteld! En dat alles voor het opstarten van de belangrijkste diensten en services die deze schijven/arrays nodig hebben.
update1: Hoe : deze methode werkt alleen voor LUKS1.
Bron: habr.com
