Uwierzytelnianie dwuskładnikowe w serwisie za pomocą tokena USB. Teraz także dla Linuksa

Uwierzytelnianie dwuskładnikowe w serwisie za pomocą tokena USB. Teraz także dla Linuksa
В jeden z naszych poprzednich artykułów rozmawialiśmy o znaczeniu uwierzytelniania dwuskładnikowego na portalach korporacyjnych firm. Ostatnim razem pokazaliśmy, jak skonfigurować bezpieczne uwierzytelnianie na serwerze internetowym IIS.

W komentarzach zostaliśmy poproszeni o napisanie instrukcji dla najpopularniejszych serwerów WWW dla Linuksa - nginx i Apache.

Pytaliście – pisaliśmy.

Czego potrzebujesz, aby zacząć?

  • Dowolna nowoczesna dystrybucja Linuksa. Zrobiłem konfigurację testową na MX Linux 18.2_x64. Nie jest to oczywiście dystrybucja serwerowa, ale jest mało prawdopodobne, aby istniały jakiekolwiek różnice w przypadku Debiana. W przypadku innych dystrybucji ścieżki do bibliotek konfiguracyjnych mogą się nieznacznie różnić.
  • Znak. Kontynuujemy korzystanie z tego modelu Rutoken EDS PKI, który jest idealny pod względem charakterystyki prędkości do użytku korporacyjnego.
  • Aby pracować z tokenem w systemie Linux, musisz zainstalować następujące pakiety:
    libccid libpcsclite1 pcscd pcsc-tools opensc

Uwierzytelnianie dwuskładnikowe w serwisie za pomocą tokena USB. Teraz także dla Linuksa

Wydawanie certyfikatów

W poprzednich artykułach opieraliśmy się na tym, że certyfikaty serwera i klienta będą wystawiane przy użyciu Microsoft CA. Ponieważ jednak wszystko konfigurujemy w Linuksie, powiemy Ci również o alternatywnym sposobie wydawania tych certyfikatów - bez opuszczania Linuksa.
Będziemy używać XCA jako CA (https://hohnstaedt.de/xca/), który jest dostępny w każdej nowoczesnej dystrybucji Linuksa. Wszystkie akcje, które wykonamy w XCA, można wykonać w trybie wiersza poleceń za pomocą narzędzi OpenSSL i pkcs11-tool, jednak dla większej prostoty i przejrzystości nie będziemy ich prezentować w tym artykule.

Pierwsze kroki

  1. Zainstalować:
    $ apt-get install xca
  2. I biegniemy:
    $ xca
  3. Tworzymy naszą bazę danych dla CA - /root/CA.xdb
    Zalecamy przechowywanie bazy danych urzędu certyfikacji w folderze, do którego dostęp ma wyłącznie administrator. Jest to ważne, aby chronić klucze prywatne certyfikatów głównych, które służą do podpisywania wszystkich pozostałych certyfikatów.

Utwórz klucze i certyfikat głównego urzędu certyfikacji

Infrastruktura klucza publicznego (PKI) opiera się na systemie hierarchicznym. Najważniejszą rzeczą w tym systemie jest główny urząd certyfikacji lub główny urząd certyfikacji. Najpierw należy utworzyć jego certyfikat.

  1. Tworzymy klucz prywatny RSA-2048 dla urzędu certyfikacji. Aby to zrobić, na karcie Klucze prywatne naciskać Nowy klucz i wybierz odpowiedni typ.
  2. Ustaw nazwę nowej pary kluczy. Nazwałem to Kluczem CA.
  3. Sam certyfikat CA wystawiamy, korzystając z utworzonej pary kluczy. W tym celu przejdź do zakładki certyfikaty i kliknij Nowy Certyfikat.
  4. Wybierz koniecznie SHA-256, ponieważ używanie SHA-1 nie może być już uważane za bezpieczne.
  5. Pamiętaj, aby wybrać jako szablon [domyślnie] CA. Nie zapomnij kliknąć Zastosuj wszystkie, w przeciwnym razie szablon nie zostanie zastosowany.
  6. W zakładce Temat wybierz naszą parę kluczy. Tam możesz wypełnić wszystkie główne pola certyfikatu.

Uwierzytelnianie dwuskładnikowe w serwisie za pomocą tokena USB. Teraz także dla Linuksa

Tworzenie kluczy i certyfikatu serwera https

  1. W podobny sposób tworzymy klucz prywatny RSA-2048 dla serwera, nazwałem go Kluczem Serwera.
  2. Tworząc certyfikat zaznaczamy, że certyfikat serwera musi być podpisany certyfikatem CA.
  3. Nie zapomnij wybrać SHA-256.
  4. Wybieramy jako szablon [domyślnie] Serwer_HTTPS. Kliknij Zastosuj wszystkie.
  5. Następnie na karcie Temat wybierz nasz klucz i wypełnij wymagane pola.

Uwierzytelnianie dwuskładnikowe w serwisie za pomocą tokena USB. Teraz także dla Linuksa

Utwórz klucze i certyfikat dla użytkownika

  1. Klucz prywatny użytkownika będzie przechowywany na naszym tokenie. Aby z nim pracować, musisz zainstalować bibliotekę PKCS#11 z naszej strony internetowej. Do popularnych dystrybucji dystrybuujemy gotowe pakiety, które znajdują się tutaj - https://www.rutoken.ru/support/download/pkcs/. Mamy również zestawy dla arm64, armv7el, armv7hf, e2k, mipso32el, które można pobrać z naszego SDK - https://www.rutoken.ru/developers/sdk/. Oprócz zestawów dla systemu Linux istnieją również zestawy dla systemów macOS, freebsd i Android.
  2. Dodanie nowego dostawcy PKCS#11 do XCA. Aby to zrobić, przejdź do menu Opcje do zakładki Dostawca PKCS#11.
  3. Naciskamy Dodaj i wybierz ścieżkę do biblioteki PKCS#11. W moim przypadku jest to usrliblibrtpkcs11ecp.so.
  4. Będziemy potrzebować sformatowanego tokena Rutoken EDS PKI. Pobierz narzędzie rtAdmin - https://dev.rutoken.ru/pages/viewpage.action?pageId=7995615
  5. Wykonujemy
    $ rtAdmin -f -q -z /usr/lib/librtpkcs11ecp.so -u <PIN-код пользователя>
  6. Jako typ klucza wybieramy klucz RSA-2048 dla Rutoken EDS PKI. Nazwałem ten klucz Kluczem Klienta.

    Uwierzytelnianie dwuskładnikowe w serwisie za pomocą tokena USB. Teraz także dla Linuksa

  7. Wprowadź kod PIN. I czekamy na zakończenie sprzętowego generowania pary kluczy

    Uwierzytelnianie dwuskładnikowe w serwisie za pomocą tokena USB. Teraz także dla Linuksa

  8. Certyfikat dla użytkownika tworzymy analogicznie do certyfikatu serwera. Tym razem wybieramy szablon [domyślnie] Klient HTTPS i nie zapomnij kliknąć Zastosuj wszystkie.
  9. W zakładce Temat wprowadzić informacje o użytkowniku. Na prośbę o zapisanie certyfikatu dla tokena odpowiadamy twierdząco.

W rezultacie na karcie Certyfikaty w XCA powinieneś dostać coś takiego.

Uwierzytelnianie dwuskładnikowe w serwisie za pomocą tokena USB. Teraz także dla Linuksa
Ten minimalny zestaw kluczy i certyfikatów wystarczy, aby rozpocząć konfigurację samych serwerów.

Aby dokonać konfiguracji musimy wyeksportować certyfikat CA, certyfikat serwera i klucz prywatny serwera.

Aby to zrobić, wybierz żądany wpis na odpowiedniej zakładce w XCA i kliknij Export.

nginx

Nie będę pisać jak zainstalować i uruchomić serwer nginx - w Internecie jest wystarczająco dużo artykułów na ten temat, nie mówiąc już o oficjalnej dokumentacji. Przejdźmy od razu do konfiguracji HTTPS i uwierzytelniania dwuskładnikowego za pomocą tokena.

Dodaj następujące wiersze do sekcji serwera w pliku nginx.conf:

server {
	listen 443 ssl;
	ssl_verify_depth 1;
	ssl_certificate /etc/nginx/Server.crt;
	ssl_certificate_key /etc/nginx/ServerKey.pem;
	ssl_client_certificate /etc/nginx/CA.crt;
	ssl_verify_client on;
}

Szczegółowy opis wszystkich parametrów związanych z konfiguracją ssl w nginx znajdziesz tutaj - https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_client_certificate

Opiszę tylko pokrótce te, które sam sobie zadałem:

  • ssl_verify_client — określa, że ​​łańcuch zaufania certyfikatu musi zostać zweryfikowany.
  • ssl_verify_length — definiuje głębokość wyszukiwania zaufanego certyfikatu głównego w łańcuchu. Ponieważ certyfikat naszego klienta jest natychmiast podpisywany na certyfikacie głównym, głębokość jest ustawiona na 1. Jeśli certyfikat użytkownika jest podpisany w pośrednim urzędzie certyfikacji, wówczas w tym parametrze należy podać 2 i tak dalej.
  • ssl_client_certificate - określa ścieżkę do zaufanego certyfikatu głównego, który jest używany podczas sprawdzania zaufania do certyfikatu użytkownika.
  • ssl_certificate/ssl_certificate_key - wskaż ścieżkę do certyfikatu/klucza prywatnego serwera.

Nie zapomnij uruchomić nginx -t, aby sprawdzić, czy w konfiguracji nie ma literówek i czy wszystkie pliki są na właściwym miejscu itd.

I to wszystko! Jak widać konfiguracja jest bardzo prosta.

Sprawdzam, czy działa w przeglądarce Firefox

Ponieważ wszystko robimy całkowicie w Linuksie, założymy, że nasi użytkownicy również pracują w Linuksie (jeśli mają Windows, to zobacz instrukcje dotyczące konfigurowania przeglądarek w poprzednim artykule.

  1. Uruchommy Firefoksa.
  2. Spróbujmy najpierw zalogować się bez tokena. Otrzymujemy taki obrazek:

    Uwierzytelnianie dwuskładnikowe w serwisie za pomocą tokena USB. Teraz także dla Linuksa

  3. Idziemy dalej about: preferencje # prywatność, i idziemy do Urządzenia bezpieczeństwa…
  4. Naciskamy Załadowaćaby dodać nowy sterownik urządzenia PKCS#11 i określić ścieżkę do naszego pliku librtpkcs11ecp.so.
  5. Aby sprawdzić, czy certyfikat jest widoczny, możesz przejść do Menedżer certyfikatów. Zostaniesz poproszony o podanie kodu PIN. Po poprawnym wprowadzeniu możesz sprawdzić, co znajduje się na zakładce Twoje certyfikaty pojawił się nasz certyfikat z tokena.
  6. Przejdźmy teraz do tokena. Firefox poprosi Cię o wybranie certyfikatu, który zostanie wybrany dla serwera. Wybierz nasz certyfikat.

    Uwierzytelnianie dwuskładnikowe w serwisie za pomocą tokena USB. Teraz także dla Linuksa

  7. ZYSK!

    Uwierzytelnianie dwuskładnikowe w serwisie za pomocą tokena USB. Teraz także dla Linuksa

Konfiguracja odbywa się raz i jak widać w oknie żądania certyfikatu, możemy zapisać nasz wybór. Od tego momentu przy każdorazowym logowaniu do portalu wystarczyć będzie nam jedynie włożenie tokena i podanie kodu PIN użytkownika, który został podany podczas formatowania. Po takim uwierzytelnieniu serwer już wie, który użytkownik się zalogował i nie można już tworzyć żadnych dodatkowych okienek do weryfikacji, tylko od razu wpuścić użytkownika na jego konto osobiste.

Apache

Podobnie jak w przypadku nginx, nikt nie powinien mieć problemów z instalacją Apache. Jeśli nie wiesz, jak zainstalować ten serwer WWW, po prostu skorzystaj z oficjalnej dokumentacji.

I zaczynamy konfigurować nasze uwierzytelnianie HTTPS i dwuskładnikowe:

  1. Najpierw musisz aktywować mod_ssl:
    $ a2enmod ssl
  2. A następnie włącz domyślne ustawienia HTTPS witryny:
    $ a2ensite default-ssl
  3. Teraz edytujemy plik konfiguracyjny: /etc/apache2/sites-enabled/default-ssl.conf:
        SSLEngine on
        SSLProtocol all -SSLv2
    
        SSLCertificateFile	/etc/apache2/sites-enabled/Server.crt
        SSLCertificateKeyFile /etc/apache2/sites-enabled/ServerKey.pem
    
        SSLCACertificateFile /etc/apache2/sites-enabled/CA.crt
    
        SSLVerifyClient require
        SSLVerifyDepth  10

    Jak widać nazwy parametrów praktycznie pokrywają się z nazwami parametrów w nginxie, więc nie będę ich wyjaśniał. Ponownie wszystkich zainteresowanych szczegółami zapraszamy do dokumentacji.
    Teraz restartujemy nasz serwer:

    $ service apache2 reload
    $ service apache2 restart

  4. Jak widać, konfiguracja uwierzytelniania dwuskładnikowego na dowolnym serwerze internetowym, czy to w systemie Windows, czy Linux, zajmuje maksymalnie godzinę. Konfiguracja przeglądarek zajmuje około 5 minut. Wiele osób uważa, że ​​konfiguracja i praca z uwierzytelnianiem dwuskładnikowym jest trudna i niejasna. Mam nadzieję, że nasz artykuł choć trochę obali ten mit.

W ankiecie mogą brać udział tylko zarejestrowani użytkownicy. Zaloguj się, Proszę.

Czy potrzebujesz instrukcji konfiguracji TLS z certyfikatami zgodnie z GOST 34.10-2012:

  • Tak, TLS-GOST jest bardzo potrzebny

  • Nie, strojenie za pomocą algorytmów GOST nie jest interesujące

Głosowało 44 użytkowników. 9 użytkowników wstrzymało się od głosu.

Źródło: www.habr.com

Dodaj komentarz