
Proste hasła nie zapewniają bezpieczeństwa, a skomplikowane są zbyt trudne do zapamiętania. Dlatego często znajdują się na karteczkach pod klawiaturą lub na monitorze. Aby hasła pozostawały w głowach "zapomnianych" użytkowników, a bezpieczeństwo nie było narażone – istnieje uwierzytelnianie dwuskładnikowe (2FA).
Dzięki połączeniu czynników posiadania urządzenia i znajomości jego kodu PIN, sam kod PIN może być prostszy i łatwiejszy do zapamiętania. Niedobory w długości lub losowości kodu PIN są kompensowane wymaganiem fizycznego posiadania oraz ograniczeniami dotyczącymi odgadywania kodu PIN.
Ponadto w instytucjach publicznych bywa, że wymagają, aby wszystko działało zgodnie z normami. O takim wariancie 2FA do logowania w Linuxie będzie mowa. Zaczynając od podstaw.
Moduły PAM
Moduły uwierzytelniania instalowalne (Pluggable Authentication Modules, PAM) to moduły o standardowym API oraz implementacjach różnych mechanizmów uwierzytelniania w aplikacjach.
Wszystkie narzędzia i aplikacje, które potrafią pracować z PAM, wykorzystują je do uwierzytelnienia użytkownika.
W praktyce działa to mniej więcej tak: polecenie login zwraca się do PAM, które przeprowadza wszystkie niezbędne kontrole za pomocą modułów określonych w pliku konfiguracyjnym i zwraca wynik do polecenia login.
librtpam
Moduł opracowany przez firmę "Aktyw" dodaje uwierzytelnianie dwuskładnikowe dla użytkowników za pomocą kart inteligentnych lub tokenów USB z wykorzystaniem asymetrycznych kluczy zgodnie z najnowszymi standardami krajowej kryptografii.
Rozważmy zasadę jego działania:
- na tokenie przechowywany jest certyfikat użytkownika oraz jego klucz prywatny;
- certyfikat jest zapisany w katalogu domowym użytkownika jako zaufany.
Proces uwierzytelnienia przebiega następująco:
- Na Rutokenie następuje wyszukiwanie osobistego certyfikatu użytkownika.
- Zostaje poproszony o kod PIN tokena.
- Następuje podpisanie losowych danych swoim kluczem prywatnym bezpośrednio w chipie Rutokena.
- Uzyskany podpis jest weryfikowany przy użyciu klucza publicznego z certyfikatu użytkownika.
- Moduł zwraca wynik weryfikacji podpisu do aplikacji, która go wywołała.
Można uwierzytelnić się za pomocą kluczy zgodnych z normą ГОСТ Р 34.10-2012 (o długości 256 lub 512 bitów) lub przestarzałą normą ГОСТ Р 34.10-2001.
Nie musisz się martwić o bezpieczeństwo kluczy – są generowane bezpośrednio w Rutokenie i nigdy nie opuszczają jego pamięci podczas operacji kryptograficznych.

Rutoken ECP 2.0 jest certyfikowany przez FSB i FSTEK zgodnie z NDV 4, dlatego może być stosowany w systemach informacyjnych przetwarzających poufne informacje.
Praktyczne zastosowanie
Pasuje praktycznie każdy nowoczesny Linux, jako przykład użyjemy xUbuntu 18.10.
1) Instalujemy niezbędne pakiety
sudo apt-get install libccid pcscd opensc
Jeśli chcesz dodać blokadę ekranu przez wygaszacz ekranu – dodatkowo zainstaluj pakiet libpam-pkcs11.
2) Dodajemy moduł PAM z obsługą GOST
Ładujemy bibliotekę z
Kopiujemy zawartość folderu PAM librtpam.so.1.0.0 do folderu systemowego
/usr/lib/ lub /usr/lib/x86_64-linux-gnu/lub /usr/lib64
3) Instalujemy pakiet z librtpkcs11ecp.so
Ładujemy i instalujemy pakiet DEB lub RPM pod tym linkiem:
4) Sprawdzamy, czy Rutoken ECP 2.0 działa w systemie
W terminalu wykonujemy
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -T
Jeśli zobaczysz linię Rutoken ECP – oznacza to, że wszystko jest w porządku.
5) Odczytujemy certyfikat
Sprawdzamy, czy na urządzeniu jest certyfikat
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O
Jeśli po linii:
Using slot 0 with a present token (0x0)
- wyświetla się informacja o kluczach i certyfikatach, należy odczytać certyfikat i zapisać na dysku. W tym celu wykonaj następujące polecenie, gdzie zamiast {id} wstaw ID certyfikatu, który widziałeś w wyniku poprzedniego polecenia:
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -r -y cert --id {id} --output-file cert.crt
W przypadku, gdy plik cert.crt jest utworzony, przechodzimy do punktu 6). - nie ma nic, oznacza to, że urządzenie jest puste. Skontaktuj się z administratorem lub stwórz klucze i certyfikat samodzielnie, postępując zgodnie z kolejnym punktem.
5.1) Tworzymy testowy certyfikat
Uwaga! Opisane metody tworzenia kluczy i certyfikatów nadają się do testów i nie są przeznaczone do użycia w trybie produkcyjnym. W tym celu należy używać kluczy i certyfikatów wydanych przez zaufany urząd certyfikacji Twojej organizacji lub akredytowane biuro certyfikacji.
Moduł PAM został stworzony w celu ochrony lokalnych komputerów i zakłada pracę w małych organizacjach. Ponieważ użytkowników jest niewielu, Administrator może samodzielnie monitorować status certyfikatów oraz ręcznie blokować konta, podobnie jak czas ich ważności. Moduł PAM obecnie nie potrafi sprawdzać certyfikatów w oparciu o CRL ani budować łańcuchów zaufania.
Prosta ścieżka (przez przeglądarkę)
Aby uzyskać certyfikat testowy, użyj . Proces zajmie nie więcej niż 5 minut.
Ścieżka geeków (przez konsolę i być może kompilator)
Sprawdź wersję OpenSC
$ opensc-tool --version
Jeśli wersja jest niższa niż 0.20, zaktualizuj lub skompiluj z naszego GitHub-a (w momencie publikacji tego artykułu wersja 0.20 jeszcze nie została wydana) lub z gałęzi master głównego projektu OpenSC nie później niż
Generujemy parę kluczy z parametrami:
--key-type: GOSTR3410-2012-512:A (GOST-2012 512 bit z parametrem A), GOSTR3410-2012-256:A (GOST-2012 256 bit z parametrem A)
--id: identyfikator obiektu (CKA_ID) w postaci dwucyfrowych numerów szesnastkowych z tabeli ASCII. Używaj tylko kodów ASCII znaków drukowanych, ponieważ id musi zostać przekazane OpenSSL w postaci ciągu. Na przykład kod ASCII '3132' odpowiada ciągowi „12”. Dla ułatwienia można skorzystać z .
$ ./pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type GOSTR3410-2012-512:A -l --id 3132
Następnie stworzymy certyfikat. Poniżej zostaną opisane dwie ścieżki: pierwsza przez UCe (użyjemy testowych UCe), druga – samopodpisany. W tym celu najpierw musisz zainstalować i skonfigurować OpenSSL wersji 1.1 lub nowszej, aby pracować z RUTOKEN za pomocą specjalnego modułu rtengine według instrukcji .
Na przykład: dla ‘--id 3132w OpenSSL należy podać „pkcs11:id=12«.
Możesz skorzystać z usług testowego UCe, których jest wiele, na przykład, , i , w tym celu stwórzmy żądanie certyfikatu
Inna opcja – można się leniwy i stworzyć certyfikat samopodpisany
$ openssl req -utf8 -new -keyform engine -key "pkcs11:id=12" -engine rtengine -out req.csr
Ładujemy certyfikat na urządzenie
$ openssl req -utf8 -x509 -silnik keyform -key "pkcs11:id=12" -engine rtengine -out cert.cer
6) Rejestrujemy certyfikat w systemie
Upewnij się, że twój certyfikat wygląda jak plik base64:

Jeśli twój certyfikat wygląda tak:

to należy przekonwertować certyfikat z formatu DER na format PEM (base64)
$ openssl x509 -in cert.crt -out cert.pem -inform DER -outform PEM
Jeszcze raz sprawdzamy, czy teraz wszystko jest w porządku.
Dodajemy certyfikat do listy zaufanych certyfikatów
$ mkdir ~/.eid
$ chmod 0755 ~/.eid
$ cat cert.pem >> ~/.eid/authorized_certificates
$ chmod 0644 ~/.eid/authorized_certificates
Ostatnia linia chroni listę zaufanych certyfikatów przed przypadkowymi lub zamierzonymi zmianami przez innych użytkowników. Wyklucza to sytuację, w której ktoś doda swój certyfikat i mógłby logować się jako Ty.
7) Konfigurujemy uwierzytelnianie
Konfiguracja naszego modułu PAM jest całkowicie standardowa i jest wykonywana tak samo jak konfiguracja innych modułów. Tworzymy w pliku /usr/share/pam-configs/rutoken-gost-pam pełną nazwę modułu, czy jest on domyślnie włączony, priorytet modułu i parametry uwierzytelniania.
W parametrach uwierzytelniania znajdują się wymagania dotyczące pomyślności operacji:
- required (wymagany): takie moduły muszą zwrócić pozytywną odpowiedź. Jeśli wynik wywołania modułu zawiera odpowiedź negatywną, prowadzi to do błędu uwierzytelniania. Żądanie zostanie odrzucone, ale pozostałe moduły zostaną wywołane.
- requisite (konieczny): podobny do required, ale od razu prowadzi do awarii uwierzytelniania i ignoruje pozostałe moduły.
- sufficient (wystarczający): jeśli przed takim modułem żaden z modułów required lub sufficient nie zwrócił negatywnego wyniku, moduł zwraca pozytywną odpowiedź. Pozostałe moduły zostaną zignorowane.
- optional (dodatkowy): jeśli w stosie brak modułów required i żaden z modułów sufficient nie zwrócił pozytywnego wyniku, to przynajmniej jeden z modułów optional musi zwrócić pozytywną odpowiedź.
Pełna treść pliku /usr/share/pam-configs/rutoken-gost-pam:
Nazwa: Rutoken PAM GOST
Domyślnie: tak
Priorytet: 800
Rodzaj autoryzacji: Podstawowy
Autoryzacja: wystarczająca /usr/lib/librtpam.so.1.0.0 /usr/lib/librtpkcs11ecp.so

zapisujemy plik, a następnie wykonujemy
$ sudo pam-auth-update
w pojawiającym się oknie stawiamy gwiazdkę przy Rutoken PAM GOST i klikamy OK

8) Sprawdzamy ustawienia
Aby upewnić się, że wszystko jest skonfigurowane, ale nie stracić możliwości logowania, wprowadź polecenie
$ sudo login
Wprowadź nazwę użytkownika. Wszystko jest skonfigurowane poprawnie, jeśli system poprosi o kod PIN urządzenia.

9) Konfigurujemy blokowanie komputera przy wyjmowaniu tokena
W skład pakietu libpam-pkcs11 wchodzi narzędzie pkcs11_eventmgr, które pozwala na wykonywanie różnych działań w przypadku wystąpienia zdarzeń PKCS#11.
Aby skonfigurować pkcs11_eventmgr służy plik konfiguracyjny: /etc/pam_pkcs11/pkcs11_eventmgr.conf
Dla różnych dystrybucji Linuksa, komenda, która wywołuje blokadę konta przy wyjmowaniu kart inteligentnych lub tokena, będzie różna. Zob. event card_remove.
Przykład pliku konfiguracyjnego przedstawiony poniżej:
pkcs11_eventmgr
{
# Uruchom w tle
daemon = true;
# Ustawienia wiadomości debugowania
debug = false;
# Czas zapytania w sekundach
polling_time = 1;
# Ustawienie limitu czasowego na usunięcie karty
# Domyślnie 0
expire_time = 0;
# Wybór biblioteki pkcs11 do pracy z RUToken
pkcs11_module = usr/lib/librtpkcs11ecp.so;
# Działania z kartą
# Karta włożona:
event card_insert {
# Pozostawiamy wartości domyślne (nic się nie dzieje)
on_error = ignore;
action = "\/bin\/false";
}
# Karta wyciągnięta
event card_remove {
on_error = ignore;
# Wywołaj funkcję blokady ekranu
# Dla GNOME
action = "dbus-send --type=method_call --dest=org.gnome.ScreenSaver \/org\/gnome\/ScreenSaver org.gnome.ScreenSaver.Lock";
# Dla XFCE
# action = "xflock4";
# Dla Astra Linux (FLY)
# action = "fly-wmfunc FLYWM_LOCK";
}
# Karta długo nie była wyciągnięta
event expire_time {
# Pozostawiamy wartości domyślne (nic się nie dzieje)
on_error = ignore;
action = "\/bin\/false";
}
}Po tym dodaj aplikację pkcs11_eventmgr do autostartu. W tym celu edytuj plik .bash_profile:
$ nano /home//.bash_profile
Dodaj na końcu pliku linię pkcs11_eventmgr i zrestartuj komputer.
Opisane kroki konfiguracji systemu operacyjnego można wykorzystać jako instrukcję w każdym nowoczesnym dystrybucji Linuxa, w tym krajowym.

Podsumowanie
Komputery z Linuxem w rosyjskich instytucjach państwowych stają się coraz popularniejsze, a skonfigurowanie niezawodnej dwuetapowej autoryzacji w tym systemie operacyjnym nie zawsze jest proste. Będziemy zadowoleni, że poprzez ten przewodnik pomożemy rozwiązać "problem haseł" i niezawodnie zabezpieczyć dostęp do komputera, nie poświęcając na to dużo czasu.
Źródło: habr.com
