Red Hat 6.x / CentOS 6.x
O zaletach szyfrowania partycji chyba nikogo nie trzeba przekonywać. W systemach z rodziny RH rozwiązania takie dostępne są bez konieczności instalacji dodatkowych pakietów.Szyfrowanie partycji możemy przeprowadzić zarówno na zwykłych partycjach, partycjach logicznych opartych o LVOL, jak i na plikach zainicjowanych jako partycje. Procedura dla wszystkich rodzajów partycji jest w zasadzie identyczna.
Na potrzeby ćwiczenia dodałem do maszyny wirtualnej nowy dysk, który przedtawił się w systemie jako sdb:
[root@centos67 ~]# cat /proc/partitions
major minor #blocks name
8 0 8388608 sda
8 1 512000 sda1
8 2 7875584 sda2
8 16 8388608 sdb
253 0 7036928 dm-0
253 1 835584 dm-1
major minor #blocks name
8 0 8388608 sda
8 1 512000 sda1
8 2 7875584 sda2
8 16 8388608 sdb
253 0 7036928 dm-0
253 1 835584 dm-1
Na dysku utworzyłem partycję logiczną opartą o LVOL (zgodnie z przepisem, który pojawi siępvcre pewnie niebawem). W grupie vg_luks utworzyłem lvola o nazwie lv_luks zajmującego 100% powierzchni grupy.
Tworzenie partycji szyfrowanej
Możemy przejść zatem do samej procedury szyfrowania dysku:
[root@centos67 ~]# cryptsetup luksFormat /dev/mapper/vg_luks-lv_luks
WARNING!
========
This will overwrite data on /dev/mapper/vg_luks-lv_luks irrevocably.
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: [haslo]
Verify passphrase: [haslo]
WARNING!
========
This will overwrite data on /dev/mapper/vg_luks-lv_luks irrevocably.
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: [haslo]
Verify passphrase: [haslo]
Zgodnie z informacją, wszystkie dane na takiej partycji zostają nadpisane. Oczywiście, jeśli nie chcemy korzystać z LVOL, możemy zaszyfrować bezpośrednio partycję sdb poprzez cryptsetup luksFormat /dev/sdb
Partycja jest utworzona. Teraz, aby nadawała się do użycia, należy na niej stworzyć filesystem. Korzystanie w jakikolwiek sposób z naszej partycji wymaga jej "otwarcia", czyli zainicjowania w systemie.
[root@centos67 ~]# cryptsetup luksOpen /dev/mapper/vg_luks-lv_luks partycja_luks
Enter passphrase for /dev/mapper/vg_luks-lv_luks: [haslo]
Enter passphrase for /dev/mapper/vg_luks-lv_luks: [haslo]
Tutaj jedna uwaga. Otwarcie partycji luksowej wymaga, poza podaniem ścieżki takiej partycji, podania również nazwy pod jaką będzie ona widnieć w naszym systemie.Od momentu otwarcia naszej partycji, wszelkich operacji na niej dokonujemy po wybranej nazwie, i odnosząc się do niej po ścieżce /dev/mapper/nazwa_partycji.
Zgodnie z tą zasadą tworzymy filesystem na naszej partycji_luks:
[root@centos67 ~]# mkfs.ext4 /dev/mapper/partycja_luks
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
524288 inodes, 2095616 blocks
104780 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2147483648
64 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 27 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
524288 inodes, 2095616 blocks
104780 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2147483648
64 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 27 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
Pozostaje nam już tylko zamountować partycję:
[root@centos67 ~]# mkdir /secret
[root@centos67 ~]# mount /dev/mapper/partycja_luks /secret/
[root@centos67 ~]# mount /dev/mapper/partycja_luks /secret/
Możemy zweryfikować, czy nasza partycja jest faktycznie zaszyfrowana. Dobrym wyznacznikiem, będzie sprawdzenie jej typu poleceniem:
[root@centos67 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
sda 8:0 0 8G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 7.5G 0 part
├─vg_centos-lv_root (dm-0) 253:0 0 6.7G 0 lvm /
└─vg_centos-lv_swap (dm-1) 253:1 0 816M 0 lvm [SWAP]
sdb 8:16 0 8G 0 disk
└─vg_luks-lv_luks (dm-2) 253:2 0 8G 0 lvm
└─partycja_luks (dm-3) 253:3 0 8G 0 crypt /secret
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
sda 8:0 0 8G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 7.5G 0 part
├─vg_centos-lv_root (dm-0) 253:0 0 6.7G 0 lvm /
└─vg_centos-lv_swap (dm-1) 253:1 0 816M 0 lvm [SWAP]
sdb 8:16 0 8G 0 disk
└─vg_luks-lv_luks (dm-2) 253:2 0 8G 0 lvm
└─partycja_luks (dm-3) 253:3 0 8G 0 crypt /secret
Widać, że partycja jest typu crypt.
Partycja LUKS a fstab
Inicjalizacja partycji szyfrowanej podczas startu systemu wygląda inaczej, niż mountowanie zwyczajnej partycji. Dzieje się tak oczywiście za sprawą konieczności inicjalizacji partycji, oraz konieczności podania hasła.Najprostsza metoda wymagać będzie od nas podania podczas startu systemu hasła do partycji. W przypadku podania błędnego hasła, partycja nie zainicjalizuje się. Aby zrealizować taki scenariusz musimy dodać informację o partycji:
[root@centos67 ~]# vi /etc/crypttab
partycja_luks /dev/mapper/vg_luks-lv_luks
partycja_luks /dev/mapper/vg_luks-lv_luks
Wpis ten będzie odpowiadał za inicjalizację partycji z nazwą partycja_luks, analogicznie do wcześniejszej komendy cryptsetup luksOpen /dev/mapper/vg_luks-lv_luks partycja_luks.
Oczywiście, tak jak w przypadku ręcznego mountowania, musimy również dokonfigurować fstaba.
[root@centos67 ~]# echo "/dev/mapper/partycja_luks /secret ext4 rw 1 2" >> /etc/fstab
Po reboocie maszyny uzyskamy prompt:
/secret is password protected:
a inicjalizacja zatrzyma się, w oczekiwaniu na hasło.
Partycja z kluczem plikowym
Ciekawą i często wykorzystywaną opcją partycji szyfrowanych, jest możliwość zastąpienia hasła do partycji kluczem plikowym. Kluczem takim może być w zasadzie dowolny plik, który podczas startowania systemu będzie dla niego dostępny do odczytu. Oznacza to, że plik klucza nie może znajdować się na samej partycji szyfrowanej.Najczęstszym wykorzystaniem tej możliwości, szczególnie w stacjach roboczych pracujących na systemach linuksowych, jest umieszczenie pliku klucza na zewnętrznym napędzie jak np. pendrive. Gwarantuje nam to, że nikt niepowołany nie dobierze się do naszych danych (o ile nie zostawimy pendrive w slocie usb). Rozwiązanie takie, w połączeniu z możliwościami udev może zagwarantować nam również, że partycja będzie dostępna jedynie w obecności konkretnego pendrive ze znanym nam id producenta, ale to przykład bardziej zaawansowany, który może kiedyś opiszę.
Na nasze potrzeby, aby zademonstrować możliwości i procedurę tworzenia klucza plikowego umieścimy nasz klucz na partycji podstawowej serwera.
Jak pisałe, kluczem może być dowolny plik, np. zdjęcie czy plik tekstowy wypełniony losowymi danymi. Ja na potrzeby przykładu utworzę taki plik tekstowy.
[root@centos67 ~]# dd if=/dev/urandom of=/root/klucz_luks bs=10240 count=100
100+0 records in
100+0 records out
1024000 bytes (1.0 MB) copied, 0.10728 s, 9.5 MB/s
[root@centos67 ~]# ls -lh /root/klucz_luks
-rw-r--r--. 1 root root 1000K Sep 5 13:49 /root/klucz_luks
100+0 records in
100+0 records out
1024000 bytes (1.0 MB) copied, 0.10728 s, 9.5 MB/s
[root@centos67 ~]# ls -lh /root/klucz_luks
-rw-r--r--. 1 root root 1000K Sep 5 13:49 /root/klucz_luks
Pokrótce, dd to narzędzie do kopiowania i konwersji plików. Użyte tutaj opcje oznaczają, że dd skopiuje nam do pliku wynikowego (of) dane pobrane z pliku wejściowego (if - w tym przypadku dane losowe). Rozmiar pliku wynikowego to 100 bloków (count) o pojemności 10240B (bs) każdy.
Jak widać, w wyniku polecenia otrzymaliśmy plik ~1MB, wypełniony wygenerowanymi losowo danymi.
Dla bezpieczeństwa warto ograniczyć uprawnienia dla pliku klucza:
[root@centos67 ~]# chmod 600 /root/klucz_luks
Kiedy zdecydowaliśmy już co będzie naszym kluczem partycji, należy poinformować o tym sam system:
[root@centos67 ~]# cryptsetup luksAddKey /dev/mapper/vg_luks-lv_luks /root/klucz_luks
Enter any passphrase: [haslo_partycji]
Enter any passphrase: [haslo_partycji]
Prompt o hasło może być nieco mylący. Mówi on o podaniu jakiegokolwiek hasła, gdy faktycznie należy podać hasło partycji ustawione przy jej tworzeniu.
Dodaliśmy klucz deszyfrujący do partycji. Teraz musimy przekonfigurować crypttab, aby wiedział, gdzie tego pliku szukać:
[root@centos67 ~]# vi /etc/crypttab
partycja_luks /dev/mapper/vg_luks-lv_luks /root/klucz_luks
partycja_luks /dev/mapper/vg_luks-lv_luks /root/klucz_luks
Przy kolejnym restarcie nie zobaczymy już pytania o hasło partycji. Nie trzeba chyba wspominać, że warto mieć kopię zapasową takiego pliku, ponieważ bez niego nie odzyskamy naszych danych.
Deinicjalizacja partycji
Do tej pory mówiliśmy ciągle o restartach systemu jako o elemencie powodującym zabezpieczenie danych na naszej partycji.Jak się można spodziewać nie jest to jedyna możliwość ukrycia naszych danych.
Partycja LUKS może zostać przez nas "zamknięta" w dowolnym momencie. Przy użyciu wspomnianego już wcześniej udeva i pendrive'a z kluczem, możemy również spowodować zamykanie partycji po wyjęciu napędu ze slotu usb.
Do ręcznego zamknięcia partycji konieczne będzie jej odmountowanie, a następnie deinicjalizacja poprzez cryptsetup:
[root@centos67 ~]# umount /secret/
[root@centos67 ~]# cryptsetup luksClose partycja_luks
[root@centos67 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
sdb 8:16 0 8G 0 disk
└─vg_luks-lv_luks (dm-2) 253:2 0 8G 0 lvm
sda 8:0 0 8G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 7.5G 0 part
├─vg_centos-lv_root (dm-0) 253:0 0 6.7G 0 lvm /
└─vg_centos-lv_swap (dm-1) 253:1 0 816M 0 lvm [SWAP]
[root@centos67 ~]# cryptsetup luksClose partycja_luks
[root@centos67 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
sdb 8:16 0 8G 0 disk
└─vg_luks-lv_luks (dm-2) 253:2 0 8G 0 lvm
sda 8:0 0 8G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 7.5G 0 part
├─vg_centos-lv_root (dm-0) 253:0 0 6.7G 0 lvm /
└─vg_centos-lv_swap (dm-1) 253:1 0 816M 0 lvm [SWAP]
Jak widać, po deinicjalizacji partycja "znika" nam z systemu a sam lvol przedstawia się jako tym lvm. Możemy sprawdzić, czy bez znajomości hasła uda nam się dobrać do danych na partycji, np próbując ją zamountować w sposób tradycyjny:
[root@centos67 ~]# mount /dev/mapper/vg_luks-lv_luks /secret
mount: unknown filesystem type 'crypto_LUKS'
mount: unknown filesystem type 'crypto_LUKS'
Wygląda na to, że nasze dane są bezpieczne.
Brak komentarzy:
Prześlij komentarz