Szyfrowany system plików w OpenWrt
Ostatnia zmiana: 2018-07-14 17:53

Zdarza się potrzeba posiadania szyfrowanego systemu plików. Co na nim trzymamy to już indywidualna sprawa: być może np. lista haseł bankowych, do serwisów internetowych itd. OpenWrt, podobnie jak w inne systemy linuksowe, umożliwia stworzenie i obsługę szyfrowanego systemu plików. Wydajność routerów pozwala na miarę bezproblemowe korzystanie z takich partycji. W tym przykładzie zostanie wykorzystany LUKS - Linux Unified Key Setup, który może być także używany przez systemy Windows. Porównanie poszczególnych programów do szyfrowania można znaleźć np. w Wikipedii.

W sieci znajduje się bardzo dużo przepisów i porad dotyczących sposobów odpowiedniego przygotowania dysków i zabezpieczenia danych. Omówione są także poszczególne algorytmy, ich zalety i wady, więc w razie wątpliwości - należy posłużyć się mocą.
Rozwiązanie przetestowano w LEDE 17.01.

Przygotowanie nośnika

Konieczny będzie zewnętrzny nośnik, na którym zostanie umieszczony szyfrowany system plików. Może to być pendrive, dysk USB czy karta SD. Zakładamy że całość zostanie wykonana na pierwszej partycji (sda1) nośnika. Partycja nie może być zamontowane w systemie.
Niezbędnym elementem jest wyczyszczenie zawartości tej partycji. Można wykonać to na co najmniej na kilka sposobów - w systemach linuksowych często wykorzystywany jest program shred. W OpenWrt można wykonać nadpisanie partycji losowymi danymi:


    # dd if=/dev/urandom of=/dev/sda1

Szybszą metodą, choć mniej bezpieczną z punktu widzenia kryptografii jest po prostu wyzerowanie zawartości:


    # dd if=/dev/zero of=/dev/sda1

Instalacja oprogramowania



    # opkg update
    # opkg install kmod-crypto-misc kmod-crypto-xts kmod-crypto-iv kmod-crypto-sha256
    # opkg install cryptsetup

Zostanie zainstalowanych także sporo zależności. Jeżeli podczas dalszych czynności pojawi się komunikat typu "Failed to open temporary keystore device..." należy doinstalować pakiet kmod-crypto-user.

Przygotowanie partycji

Przed wykonaniem jakichkolwiek czynności należy załadować jeden z modułów w celu obsługi określonego algorytmu:


    # insmod sha256_generic

Można tą linię dodać np. do pliku /etc/rc.local, aby automatycznie wykonywała się po starcie systemu.
Zakładamy teraz partycję LUKS. Wykonuje się to przez polecenie:


    # cryptsetup -v -c aes-cbc-essiv:sha256 -s 256 -y luksFormat /dev/sda1

Można wykorzystać różne algorytmy szyfrowania, aes-cbc-essiv jest domyślnym. Jeżeli nasz router posiada sprzętowy akcelerator kryptograficzny (Alix, Asus WL-500gP, Iomaga iConnect), można wykorzystać algorytm wspierany przez to urządzenie, dzięki czemu operacje wykorzystujące szyfrowany system plików będą o wiele szybsze.

NIST zaleca stosowanie XTS-AES, jest on szybszy (co przy stosunkowo słabej mocy routerów może mieć znaczenie), ale też w mniejszym stopniu sprawdzony. Jeżeli chcemy użyć tego algorytmu to polecenie przyjmie następującą postać:


    # cryptsetup -v -c aes-xts-plain -y luksFormat /dev/sda1

Potwierdzamy chęć utworzenia partycji ("YES" pisane dużymi literami!), a następnie wprowadzamy silne i skomplikowane hasło:


WARNING!
========
This will overwrite data on /dev/sda1 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:
Command successful.

Tworzenie systemu plików

"Otwieramy" partycję:


    # cryptsetup luksOpen /dev/sda1 tajne

(zostaniemy zapytani o hasło). W katalogu /dev/mapper pojawi się nowe urządzenie blokowe o nazwie tajne z którego będziemy korzystać:


    # ls /dev/mapper/*
    /dev/mapper/control /dev/mapper/tajne

Tworzymy na nim normalny system plików, np. ext2:


    # mkfs.ext2 -m0 /dev/mapper/tajne

I to wszystko. Można zamontować taki system:


    # mkdir -p /mnt/dysk
    # mount -t ext2 /dev/mapper/tajne /mnt/dysk

i normalnie z niego korzystać jak z każdego innego nośnika.

Odmontowanie partycji

Po zakończeniu pracy należy partycję odmontować:


    # umount /dev/mapper/tajne

oraz koniecznie odłączyć szyfrowaną partycję


    # cryptsetup luksClose tajne

Praca z zaszyfrowaną partycją

Podłączenie dysku



    # cryptsetup luksOpen /dev/sda1 tajne
    # mkdir -p /tmp/tajne
    # mount /dev/mapper/tajne /tmp/tajne

Odłączenie dysku



    # sync
    # umount /dev/mapper/tajne
    # cryptsetup luksClose tajne

Zakończenie

Tak przygotowany dysk jest kompatybilny w nowszymi wydaniami dystrybucji Linuksa - po podłączeniu nośnika w większości przypadków nastąpi pytanie o hasło i będzie można zamontować daną partycję.