Portál AbcLinuxu, 4. května 2025 02:07
Možná jsem se špatně rozhlížel a někdo mě vyvede z omylu, ale dle mého zjištění, nelze bez úpravy na CentOS nastartovat systém, který má šifrovanou root partition jinak, než v interaktivním režimu a vyťukat heslo pro odemčení root partition. Tak jsem to přemluvil a zde je „návod“ jak…
mdadm
RAID a na něm LUKS(cryptsetup) a na něm LVM,
/boot je mimo a nešifrovaná (a může být i na flašce).
Klíč k odemčení je na na flašce (či jiném médiu).
Systém musí nastartovat „bezobslužně“.
Protože flaška s klíčem je trvale instalovaná, tak takto šifrovaná partition zajišťuje jen to, že disk samostatně lze následně použít kdekoliv, či jej reklamovat, bez jakéhokoliv zásahu a obav a lze při případné změně podmínek, tuto flasku po nastartovaní systému odebrat (nejlépe i s /boot-em) a zakopat na zahradě.
Každá distribuce to má trochu jinak, tento postup je platný pro CentOS 6+.
Vytvořil jsem tři patch-e (viz níže) a použil:
patch -u /usr/share/dracut/modules.d/90crypt/install 90crypt_install.patch patch -u /usr/share/dracut/modules.d/90crypt/parse-crypt.sh 90crypt_parse-crypt.sh.patch patch -u /usr/share/dracut/modules.d/90crypt/cryptroot-ask.sh 90crypt_cryptroot-ask.sh.patch
Připravil nový initrd
(, na konci je doplněno „-modified“). Je třeba vyřadit modul plymouth
aby se použil modul crypt
.
dracut -f -o plymouth /boot/initramfs-$(uname -r)-modified.img $(uname -r)
V /etc/grub.conf
(linka na /boot/grub/grub.conf
) vsunul novou položku s tímto novým initrd
.
Patch-e přidávájí možnost k parametru
předřadit i cestu ke klíči uvozenou rd_LUKS_UUID=
cryptkey-
a ukončenou posledním-
před luks=
.
Původní a stále funkční zápis <code>rd_LUKS_UUID=luks-<UuidOfLuksBlockDevice></code> lze rozšířit na:
rd_LUKS_UUID=cryptkey-<sleep sec>:<uuidOfPartitionWithKey>:<filesystem>:<FileNameKey>-luks-<UuidOfLuksBlockDevice>pro zadání klíče ze souboru.
Nebo
rd_LUKS_UUID=cryptkey-<sleep sec>:/dev/sd<X>:<offset>:<size>-luks-<UuidOfLuksBlockDevice>pro zadání klíče přečteného přímo ze zařízení z adresy <offset> a o délce <size>.
Vzhledem k tomu „jak“ systém startuje, může se stát, že zařízení nebude ještě připraveno, proto je možnost zadat <sleep sec>.
Když uložíme klíč na zařízení dle uuid ddddddddd-aaaa-bbbb-bbbb-aaaaaaaaaaaa
s ext4 a klíč bude v cestě /private/mykey
, tak parametr bude vypadat takto (2 sec prodleva):
rd_LUKS_UUID=cryptkey-2:/dev/disk/by-uuid/ddddddddd-aaaa-bbbb-bbbb-aaaaaaaaaaaa:ext4:/private/mykey-luks-ffffffff-eeee-4444-aaaa-333333333333(
luks-ffffffff-eeee-4444-aaaa-333333333333
je to odemykané zařízení, tedy žádná změna - původní hodnota)
Nebo pokud klíč délky 2048 zapíšeme na pozici 1024 (dd of=/dev/sdX if=mykeyfile bs=1 seek=1024
), tak paramter bude vypadat takto (1 sec prodleva):
rd_LUKS_UUID=cryptkey-1:/dev/sdX:1024:2048-luks-ffffffff-eeee-4444-aaaa-333333333333
¡BINGO! těmito patch-i, touto úpravou parametru jádra a použití nového initrd si systém sám odemkne podkladový šifrovaný „RAID“, a z použitých disků bez flašky nikdo nic nepřečte.
Bo zde nejdou vložit přílohy (nebo mi zas něco uniklo), tak jednotlivé patch-e zde inline.
90crypt_install.patch:
--- /usr/share/dracut/modules.d/90crypt/install 2013-02-22 06:03:43.000000000 +0100 +++ usr/share/dracut/modules.d.patch.cryptsetup/90crypt/install 2013-09-29 17:13:42.000000000 +0200 @@ -5,3 +5,5 @@ inst_hook pre-pivot 30 "$moddir/crypt-cleanup.sh" inst_hook pre-pivot 31 "$moddir/crypt-cleanup.sh" inst /etc/crypttab +inst dd +inst rmdir90crypt_parse-crypt.sh.patch:
--- /usr/share/dracut/modules.d/90crypt/parse-crypt.sh 2013-02-22 06:03:45.000000000 +0100 +++ usr/share/dracut/modules.d.patch.cryptsetup/90crypt/parse-crypt.sh 2013-09-29 16:01:09.000000000 +0200 @@ -11,8 +11,15 @@ if [ -n "$LUKS" ]; then echo '. /lib/dracut-lib.sh' > /emergency/90-crypt.sh for luksid in $LUKS; do - luksid=${luksid##luks-} - printf 'ENV{ID_FS_TYPE}=="crypto_LUKS", ENV{ID_FS_UUID}=="%s*", RUN+="/sbin/initqueue --unique --onetime --name cryptroot-ask-%%k /sbin/cryptroot-ask $env{DEVNAME} luks-$env{ID_FS_UUID}"\n' $luksid \ + cryptkey=${luksid%luks-*} + cryptkey=${cryptkey##*cryptkey-} + cryptkey=${cryptkey%-*} + if [ -z "$cryptkey" ]; then + $cryptkey=- + fi + luksid=${luksid##*-luks-} + luksid=${luksid##*luks-} + printf 'ENV{ID_FS_TYPE}=="crypto_LUKS", ENV{ID_FS_UUID}=="%s*", RUN+="/sbin/initqueue --unique --onetime --name cryptroot-ask-%%k /sbin/cryptroot-ask $env{DEVNAME} luks-$env{ID_FS_UUID} '$cryptkey'"\n' $luksid \ >> /etc/udev/rules.d/70-luks.rules printf '[ -e /dev/disk/by-uuid/*%s* ] || exit 1 \n' $luksid >> /initqueue-finished/crypt.sh printf '[ -e /dev/disk/by-uuid/*%s* ] || warn "crypto LUKS UUID "%s" not found" \n' $luksid $luksid >> /emergency/90-crypt.sh90crypt_cryptroot-ask.sh.patch: (upraveno 2013-09-30 19:18 v duchu vlastního komentáře)
--- /usr/share/dracut/modules.d/90crypt/cryptroot-ask.sh 2013-02-22 06:03:43.000000000 +0100 +++ usr/share/dracut/modules.d.patch.cryptsetup/90crypt/cryptroot-ask.sh 2013-09-30 18:58:21.976944456 +0200 @@ -51,15 +51,65 @@ unset name dev rest fi +#parse key file params +par0='-' +par0=${3%%:*} +par1=${3#*:} +par2=${par1#*:} +par1=${par1%%:*} +par2=${par2%%:*} +par3=${3##*:} + +if [ "$par2" = "0" -o "$((${par2}+0))" -gt "0" ]; then + par2num='1' +else + par2num='0' +fi + info "luksOpen $device $luksname" # flock against other interactive activities -{ flock -s 9; - echo -n "$device ($luksname) is password protected" - cryptsetup luksOpen -T1 $1 $luksname +{ flock -s 9; + #key file params exist or not + if [ "$par0" != "-" ]; then + #use key file + echo "$device ($luksname) is key file protected" + sleep $((${par0}+0)) + if [ "$par2num" = "1" ]; then + echo 'Use raw data as key file...' + dd if=$par1 bs=1 skip=$par2 count=$par3 | cryptsetup luksOpen --key-file - $1 $luksname + if [ $? -ne 0 ]; then + echo "Error when using key file, try password..." + cryptsetup luksOpen -T3 $1 $luksname + fi + else + echo 'Mount and use the key file...' + tmfile='/tmp/cryptroot-keyfile-mnt' + cryptsetup_open='0' + mkdir "$tmfile" + if [ $? -eq 0 ]; then + mount -r -t $par2 "$par1" "$tmfile" + if [ $? -eq 0 ]; then + cryptsetup luksOpen --key-file "${tmfile}${par3}" $1 $luksname + if [ $? -eq 0 ]; then + cryptsetup_open='1' + fi + umount "$tmfile" + fi + rmdir "$tmfile" + fi + if [ "$cryptsetup_open" = "0" ]; then + echo "Error when using key file, try password..." + cryptsetup luksOpen -T3 $1 $luksname + fi + fi + else + echo "$device ($luksname) is password protected" + cryptsetup luksOpen -T3 $1 $luksname + fi } 9>/.console.lock # mark device as asked >> /tmp/cryptroot-asked-$2 exit 0 -# vim:ts=8:sw=4:sts=4:et \ No newline at end of file +# vim:ts=8:sw=4:sts=4:et
Tiskni
Sdílej:
Má to výhodu, že když si dáš fotku své nahé Rúty do domovské složky Roota , tak ani v případě RMA disku ji nikdo neuvidí (nebo do DB ve VAR). Prostě celý disk je šifrovaný, ale nepotřebuješ zadávat heslo (neopakuju se )…
V tomto případě je to tak, že se lze připojit jedním klíčem a jedním hnusným 32 znaků dlouhým heslem (když můžeš a nemusíš ho zadávat proč ne…) a oba jsou samozřejmě jinde „schované“.
V Grub-u jsou dvě položky v menu, takže lze zvolit položku s interaktivním zadáním hesla.
Ale pomohl jsi si mi uvědomit, že i když bylo cílem, aby při zklamání přihlášení klíčem se to zeptalo na heslo, tak v případě zadání klíče ze souboru, tomu tak není, protože se to zeptá jen v případě když zklame odemčení klíčem, ale ne v případě pokud zklame mkdir či mount (tedy třeba i neexistence flašky) - musím to opravit, i když mám ten 2. případ (klíč přímo ze zařízeni), kde to funguje správně .
To tam určitě nebude, ale najdou se recepty na pečení chleba s tajnou přísadou….
Nicméně „proč ne, když můžu“, a navíc Arch a Bubuntu to snad umí out-of-box, tak jsem to musel naučit i CentOS (a navíc jsem se musel zamyslet „jak bez bashismů“, což neuškodí)
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.