Szyfrowanie LUKS niezaszyfrowanego LVM w Ubuntu 22 Server bez reinstalacji systemu
Przetłumaczone automatycznie z angielskiego. Przeczytaj oryginał
Chroń swoje dane. Skutki utraty urządzenia lub nieautoryzowanego dostępu można ograniczyć, szyfrując dysk w serwerze i stacji roboczej.
Być może masz instalację Ubuntu Linux na bare metal lub maszynie wirtualnej. Czy ma zaszyfrowany dysk? Jeśli nie, możesz mieć kłopoty, gdy urządzenie zostanie skradzione lub zgubione albo ktoś po prostu uzyska nieautoryzowany dostęp do Twojego sprzętu. W tym krótkim artykule krok po kroku zobaczysz, co zrobić, aby zaszyfrować niezaszyfrowane dyski bez konieczności reinstalacji systemu.
W przypadku stacji roboczej reinstalacja systemu jest znacznie mniejszym problemem. Wystarczy w dogodnym momencie przenieść dane i konfigurację, a potem przeprowadzić czystą instalację systemu, tym razem z poprawnie skonfigurowanym szyfrowaniem dysku. Ale chwileczkę. Skoro istnieje możliwość zaszyfrowania bez reinstalacji systemu, to dlaczego by nie spróbować?
Jest to szczególnie ważne w przypadku instalacji serwerowych z oprogramowaniem produkcyjnym przetwarzającym dane klientów. Możesz zdecydować się na wymianę systemu w oknie serwisowym i wykonać całą pracę od nowa. Czasem jednak nie wchodzi to w grę. Właściwie nie ma znaczenia, jakie nieutrzymywane i przestarzałe oprogramowanie działa na Twoich niezaszyfrowanych serwerach. Myślę, że większość z nas zna przynajmniej jeden taki przykład. Przy tak problematycznym oprogramowaniu lepiej po prostu zrobić to na istniejącym systemie, bez dodatkowych kroków.
Jak zmigrować dane? #
Tutaj dowiesz się, jak zaszyfrować istniejące dane na dyskach opartych o LVM w maszynie wirtualnej z Ubuntu 22 Server. Na początek musisz dodać do systemu dodatkowy dysk o pojemności równej lub większej niż dysk niezaszyfrowany. Załóżmy, że źródło to /dev/sda, a zapasowy dysk to /dev/sdb. Zakładam, że to domyślna konfiguracja z 3 partycjami. Pierwsza to odstęp dla GRUB-a, druga to boot, a trzecia to główny system plików.
Uruchom VM z ISO GRML. W Proxmoxie podczas startu VM naciśnij Esc i wybierz napęd z zamontowanym ISO.
Po uruchomieniu GRML…
Utwórz PV i rozszerz istniejącą VG o nowy dysk:
pvcreate /dev/sdb
vgextend ubuntu-vg /dev/sdbPrzenieś dane na nowy dysk:
pvmove /dev/sda3 /dev/sdbUsuń istniejący, niezaszyfrowany dysk źródłowy z VG i usuń PV:
vgreduce ubuntu-vg /dev/sda3
pvremove /dev/sda3Teraz czas wyczyścić istniejący niezaszyfrowany dysk:
crypt setup open --type plain -d /dev/urandom /dev/sda3 to_be_wiped
dd if=/dev/zero of=/dev/mapper/to_be_wiped bs=1M status=progress
cryptsetup close to_be_wipedTeraz najważniejszy element procedury. Utwórz punkt montowania dla boot i zapisz tam nagłówek LUKS. Zapisanie tego nagłówka na trwałym nośniku jest krytyczne. Jeśli nagłówek z kluczami zostanie utracony, utracisz również dane. Pamiętaj o tym:“`
mkdir /mnt/boot
mount /dev/sda2 /mnt/bootZaszyfruj i otwórz kontener dysku:
cryptsetup -y luksFormat /dev/sda3 --header /mnt/boot/luksheader.img
cryptsetup luksOpen /dev/sda3 lvmcrypt --header /mnt/boot/luksheader.imgUtwórz nowy PV i dołącz go do istniejącej VG.
pvcreate /dev/mapper/lvmcrypt
vgextend ubuntu-vg /dev/mapper/lvmcryptPrzenieś dane z dodatkowego, zapasowego dysku do nowo utworzonego kontenera lvmcrypt:
pvmove /dev/sdb /dev/mapper/lvmcryptI na koniec usuń ten nowy dysk z VG oraz sam PV:
vgreduce ubuntu-vg /dev/sdb
pvremove /dev/sdbJak zaktualizować initramfs z odłączonym nagłówkiem LUKS2 #
O co więc chodzi z tym odłączonym nagłówkiem LUKS2? W tym formacie pierwsze 16MB przestrzeni zajmuje nagłówek. Gdyby oryginalny dysk zawierał tę przestrzeń, nie miałby wystarczająco dużo miejsca na dane, które trzeba z powrotem przenieść. Drugim powodem odłączenia nagłówka jest w pewnym stopniu podniesienie poziomu bezpieczeństwa. Pamiętaj jednak, że w razie utraty urządzenia lub systemu plików, na którym się znajduje, bezpowrotnie tracisz również dane. Tak więc…
Jeśli ponownie uruchamiasz GRML:
mkdir /mnt/luks
cryptsetup luksOpen /dev/sdb3 lvmcrypt --header /mnt/boot/luksheader.img
vgchange -ay
mount /dev/mapper/ubuntu--vg-ubuntu--lv /mnt/luksJeśli kontynuujesz bez restartu, wystarczy utworzyć katalog punktu montowania i zamontować:
mkdir /mnt/luks
mount /dev/mapper/ubuntu--vg-ubuntu--lv /mnt/luksZamontuj i podepnij (bind) potrzebne katalogi specjalne, a następnie wykonaj chroot do systemu:
mount -t proc proc /mnt/luks/proc
mount -t sysfs sys /mnt/luks/sys
mount -o bind /dev /mnt/luks/dev
mount --bind /run /mnt/luks/run
mount /dev/sda2 /mnt/luks/boot
chroot /mnt/luks /bin/bashJesteś z powrotem w swoim Ubuntu, na zaszyfrowanym dysku. Czy to koniec? Nie. Musimy wskazać, gdzie podczas uruchamiania znajduje się nagłówek LUKS2. Skopiuj nagłówek na dowolny dodatkowy dysk. W przypadku VM może to być dysk 0.1GB. W przypadku stacji roboczej może to być pendrive USB:
dd if=/boot/luksheader.img of=/dev/sdbZmodyfikuj plik /etc/crypttab w następujący sposób:
lvmcrypt PARTUUID=A none luks,header=/dev/disk/by-uuid/Bgdzie A to wynik blkid /dev/sda3, a B to wynik blkid /dev/sdb.
Na koniec wygeneruj ponownie initramfs:
update-initramfs -c -k all
exit
rebootGotowe. Twój dysk jest teraz zaszyfrowany i przy każdym uruchomieniu systemu zostaniesz poproszony o ustawione wcześniej hasło. Dla jasności: musisz bezpiecznie przechowywać dodatkowy dysk z nagłówkiem LUKS2. Po uruchomieniu systemu dysk lub pendrive można wyjąć, ale trzeba go ponownie podłączać przy każdym kolejnym restarcie.
Dalsza lektura #
https://unix.stackexchange.com/questions/444931/is-there-a-way-to-encrypt-disk-without-formatting-it
https://www.michelebologna.net/2020/encrypt-an-existing-linux-installation-with-zero-downtime-luks-on-lvm/
https://dev.to/goober99/encrypt-an-existing-linux-installation-online-with-the-magic-of-lvm-1mjc
https://linuxconfig.org/how-to-use-luks-with-a-detached-header
https://medium.com/@privb0x23/lose-your-head-attempting-to-boot-from-luks-without-a-header-2d61174df360
https://askubuntu.com/questions/1351911/what-does-regenerate-your-initramfs-mean
https://superuser.com/questions/111152/whats-the-proper-way-to-prepare-chroot-to-recover-a-broken-linux-installation
https://unix.stackexchange.com/questions/720202/detached-luks-header-on-debian-based-gnu-linux