ProHoster > Blog > administracja > Konfigurowanie uwierzytelniania w sieci L2TP przy użyciu Rutoken EDS 2.0 i Rutoken PKI
Konfigurowanie uwierzytelniania w sieci L2TP przy użyciu Rutoken EDS 2.0 i Rutoken PKI
Problemy
Jeszcze niedawno wiele osób nie wiedziało, jak to jest pracować z domu. Pandemia radykalnie zmieniła sytuację na świecie, wszyscy zaczęli przyzwyczajać się do obecnej sytuacji, a mianowicie do tego, że wychodzenie z domu stało się po prostu niebezpieczne. A wielu musiało szybko zorganizować pracę zdalną dla swoich pracowników.
Jednak brak kompetentnego podejścia do doboru rozwiązań do pracy zdalnej może prowadzić do nieodwracalnych strat. Hasła użytkowników mogą zostać skradzione, co umożliwi atakującemu niekontrolowane połączenie się z siecią i zasobami informatycznymi przedsiębiorstwa.
Dlatego obecnie wzrosła potrzeba tworzenia niezawodnych korporacyjnych sieci VPN. Opowiem ci o niezawodny, bezpieczna и prosty w korzystaniu z sieci VPN.
Działa w oparciu o schemat IPsec/L2TP, który do uwierzytelniania klientów wykorzystuje nieodzyskiwalne klucze i certyfikaty zapisane na tokenach, a także przesyła dane przez sieć w postaci zaszyfrowanej.
Jako stanowiska demonstracyjne konfiguracji wykorzystano serwer z systemem CentOS 7 (adres: centos.vpn.server.ad) oraz klienta z systemem Ubuntu 20.04, a także klienta z systemem Windows 10.
Opis systemu
VPN będzie działać zgodnie ze schematem IPSec + L2TP + PPP. Protokół Protokół Point-to-Point (PPP) działa w warstwie łącza danych modelu OSI i zapewnia uwierzytelnianie użytkowników oraz szyfrowanie przesyłanych danych. Jego dane są hermetyzowane w danych protokołu L2TP, który faktycznie zapewnia utworzenie połączenia w sieci VPN, ale nie zapewnia uwierzytelnienia i szyfrowania.
Dane L2TP są hermetyzowane w protokole IPSec, który również zapewnia uwierzytelnianie i szyfrowanie, ale w przeciwieństwie do protokołu PPP uwierzytelnianie i szyfrowanie odbywa się na poziomie urządzenia, a nie użytkownika.
Ta funkcja umożliwia uwierzytelnianie użytkowników tylko z określonych urządzeń. Będziemy używać protokołu IPSec w niezmienionej postaci i umożliwimy uwierzytelnianie użytkownika z dowolnego urządzenia.
Uwierzytelnianie użytkowników za pomocą kart inteligentnych będzie realizowane na poziomie protokołu PPP z wykorzystaniem protokołu EAP-TLS.
Bardziej szczegółowe informacje na temat działania tego obwodu można znaleźć w ten artykuł.
Dlaczego ten schemat spełnia wszystkie trzy wymagania dobrej sieci VPN?
Niezawodność tego schematu została sprawdzona przez czas. Jest używany do wdrażania sieci VPN od 2000 roku.
Bezpieczne uwierzytelnianie użytkownika zapewnia protokół PPP. Standardowa implementacja protokołu PPP opracowana przez Paula Mackerrasa nie zapewnia wystarczającego poziomu bezpieczeństwa, ponieważ Do uwierzytelnienia w najlepszym przypadku stosuje się uwierzytelnianie za pomocą loginu i hasła. Wszyscy wiemy, że hasło do logowania można prześledzić, odgadnąć lub ukraść. Jednak już od dłuższego czasu deweloper Jana Justa Keijsera в jego wdrożenie Ten protokół rozwiązał ten problem i dodał możliwość korzystania z protokołów opartych na szyfrowaniu asymetrycznym, takich jak EAP-TLS, do uwierzytelniania. Dodatkowo dodał możliwość wykorzystania kart inteligentnych do uwierzytelniania, co zwiększyło bezpieczeństwo systemu.
Obecnie trwają aktywne negocjacje w sprawie połączenia tych dwóch projektów i można być pewnym, że prędzej czy później i tak do tego dojdzie. Na przykład poprawiona wersja protokołu PPP znajduje się w repozytoriach Fedory od dłuższego czasu i wykorzystuje bezpieczne protokoły do uwierzytelniania.
Do niedawna z tej sieci mogli korzystać wyłącznie użytkownicy systemu Windows, ale nasi koledzy z Moskiewskiego Uniwersytetu Państwowego Wasilij Szokow i Aleksander Smirnow odkryli, że stary projekt klienta L2TP dla systemu Linux i zmodyfikowałem go. Wspólnie naprawiliśmy wiele błędów i niedociągnięć w pracy klienta, uprościliśmy instalację i konfigurację systemu, nawet przy budowaniu ze źródeł. Najważniejsze z nich to:
Naprawiono problemy ze zgodnością starego klienta z interfejsem nowych wersji openssl i qt.
Usunięto pppd z przekazywania PIN-u tokena przez plik tymczasowy.
Naprawiono nieprawidłowe uruchamianie programu żądania hasła poprzez interfejs graficzny. Dokonano tego poprzez zainstalowanie odpowiedniego środowiska dla usługi xl2tpd.
Kompilacja demona L2tpIpsecVpn jest teraz przeprowadzana razem z kompilacją samego klienta, co upraszcza proces kompilacji i konfiguracji.
Aby ułatwić programowanie, system Azure Pipelines jest podłączony w celu przetestowania poprawności kompilacji.
Dodano możliwość wymuszenia obniżenia wersji poziom bezpieczeństwa w kontekście openssl. Jest to przydatne do prawidłowej obsługi nowych systemów operacyjnych, w których standardowy poziom bezpieczeństwa jest ustawiony na 2, z sieciami VPN korzystającymi z certyfikatów niespełniających wymagań bezpieczeństwa tego poziomu. Ta opcja będzie przydatna do pracy z istniejącymi starymi sieciami VPN.
Ten klient obsługuje użycie kart inteligentnych do uwierzytelniania, a także ukrywa w jak największym stopniu wszystkie trudy i trudności związane z konfiguracją tego schematu pod Linuksem, dzięki czemu konfiguracja klienta jest tak prosta i szybka, jak to możliwe.
Oczywiście dla wygodnego połączenia pomiędzy PPP a GUI klienta nie było to możliwe bez dodatkowych edycji każdego z projektów, niemniej jednak zostały one zminimalizowane i zredukowane do minimum:
Naprawiony błąd w kolejności ładowania konfiguracji i inicjowania kontekstu openssl. Ten błąd nie pozwolił nam wczytać niczego z lokalnego pliku konfiguracyjnego /etc/ppp/openssl.cnf za wyjątkiem informacji o silnikach openssl do pracy z kartami inteligentnymi, co było poważną niedogodnością, jeśli oprócz informacji o silnikach, np. chcieliśmy ustawić coś innego. Na przykład napraw poziom bezpieczeństwa podczas nawiązywania połączenia.
Teraz możesz rozpocząć konfigurację.
Strojenie serwera
Zainstalujmy wszystkie niezbędne pakiety.
Instalowanie strongswana (IPsec)
Na początek skonfigurujmy zaporę sieciową do pracy w trybie ipsec
Ustalimy także wspólne hasło do logowania. W celu uwierzytelnienia wspólne hasło musi być znane wszystkim uczestnikom sieci. Ta metoda jest oczywiście zawodna, ponieważ hasło to może łatwo poznać osoby, którym nie chcemy zapewniać dostępu do sieci.
Jednak nawet ten fakt nie będzie miał wpływu na bezpieczeństwo sieci, ponieważ Podstawowe szyfrowanie danych i uwierzytelnianie użytkowników odbywa się poprzez protokół PPP. Ale uczciwie warto zauważyć, że strongswan obsługuje bezpieczniejsze technologie uwierzytelniania, na przykład przy użyciu kluczy prywatnych. Strongswan ma również możliwość zapewnienia uwierzytelniania za pomocą kart inteligentnych, ale jak dotąd obsługiwana jest tylko ograniczona gama urządzeń, dlatego uwierzytelnianie za pomocą tokenów Rutoken i kart inteligentnych jest nadal trudne. Ustawmy ogólne hasło poprzez plik /etc/strongswan/ipsec.secrets:
Skonfigurujmy to poprzez plik /etc/xl2tpd/xl2tpd.conf:
[global]
force userspace = yes
listen-addr = 0.0.0.0
ipsec saref = yes
[lns default]
exclusive = no
; определяет статический адрес сервера в виртуальной сети
local ip = 100.10.10.1
; задает диапазон виртуальных адресов
ip range = 100.10.10.1-100.10.10.254
assign ip = yes
refuse pap = yes
require authentication = yes
; данную опцию можно отключить после успешной настройки сети
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
; указывает адрес сервера в сети
name = centos.vpn.server.ad
Wystawiamy certyfikat główny i certyfikat serwera:
#директория с сертификатами пользователей, УЦ и сервера
sudo mkdir /etc/ppp/certs
#директория с закрытыми ключами сервера и УЦ
sudo mkdir /etc/ppp/keys
#запрещаем любой доступ к этой дирректории кроме администатора
sudo chmod 0600 /etc/ppp/keys/
#генерируем ключ и выписываем сертификат УЦ
sudo openssl genrsa -out /etc/ppp/keys/ca.pem 2048
sudo openssl req -key /etc/ppp/keys/ca.pem -new -x509 -out /etc/ppp/certs/ca.pem -subj "/C=RU/CN=L2TP CA"
#генерируем ключ и выписываем сертификат сервера
sudo openssl genrsa -out /etc/ppp/keys/server.pem 2048
sudo openssl req -new -out server.req -key /etc/ppp/keys/server.pem -subj "/C=RU/CN=centos.vpn.server.ad"
sudo openssl x509 -req -in server.req -CAkey /etc/ppp/keys/ca.pem -CA /etc/ppp/certs/ca.pem -out /etc/ppp/certs/server.pem -CAcreateserial
W ten sposób zakończyliśmy podstawową konfigurację serwera. Pozostała część konfiguracji serwera polega na dodaniu nowych klientów.
Dodawanie nowego klienta
Aby dodać nowego klienta do sieci należy dodać jego certyfikat do listy zaufanych dla tego klienta.
Jeśli użytkownik chce zostać członkiem sieci VPN, tworzy parę kluczy i aplikację certyfikatu dla tego klienta. Jeśli użytkownik jest zaufany, można podpisać tę aplikację, a powstały certyfikat zapisać w katalogu certyfikatów:
UWAGA
Aby uniknąć nieporozumień, lepiej, aby: Nazwa zwyczajowa, nazwa pliku certyfikatu i nazwa użytkownika były unikalne.
Warto także sprawdzić, czy nazwa dodawanego przez nas użytkownika nie pojawia się nigdzie w innych plikach uwierzytelniających, w przeciwnym razie wystąpią problemy ze sposobem uwierzytelnienia użytkownika.
Ten sam certyfikat należy odesłać użytkownikowi.
Generowanie pary kluczy i certyfikatu
Aby uwierzytelnienie przebiegło pomyślnie, klient musi:
wygeneruj parę kluczy;
posiadać certyfikat główny urzędu certyfikacji;
mieć certyfikat dla pary kluczy podpisany przez główny urząd certyfikacji.
dla klienta na Linuksie
Najpierw wygenerujmy parę kluczy na tokenie i utwórzmy aplikację dla certyfikatu:
Wyślij aplikację client.req, która pojawi się do urzędu certyfikacji. Po otrzymaniu certyfikatu dla pary kluczy zapisz go na tokenie o tym samym identyfikatorze co klucz:
dla klientów Windows i Linux (metoda bardziej uniwersalna)
Ta metoda jest bardziej uniwersalna, ponieważ umożliwia wygenerowanie klucza i certyfikatu, który zostanie pomyślnie rozpoznany przez użytkowników systemów Windows i Linux, jednak do przeprowadzenia procedury generowania klucza wymaga komputera z systemem Windows.
Przed wygenerowaniem żądań i zaimportowaniem certyfikatów musisz dodać certyfikat główny sieci VPN do listy zaufanych. Aby to zrobić, otwórz go i w oknie, które zostanie otwarte, wybierz opcję „Zainstaluj certyfikat”:
W oknie, które zostanie otwarte wybierz instalację certyfikatu dla użytkownika lokalnego:
Zainstalujmy certyfikat w zaufanym głównym magazynie certyfikatów urzędu certyfikacji:
Po tych wszystkich działaniach zgadzamy się ze wszystkimi dalszymi punktami. System jest teraz skonfigurowany.
Następnie wygenerujemy parę kluczy i stworzymy wniosek o wydanie certyfikatu. Aby to zrobić, otwórz PowerShell i wprowadź następujące polecenie:
certreq.exe -new -pin $PIN .cert.tmp .client.req
Wyślij utworzoną aplikację client.req do swojego urzędu certyfikacji i poczekaj na otrzymanie certyfikatu client.pem. Można go zapisać w tokenie i dodać do bazy certyfikatów systemu Windows za pomocą następującego polecenia:
certreq.exe -accept .client.pem
Warto zaznaczyć, że podobne działania można odtworzyć korzystając z interfejsu graficznego programu mmc, jednak metoda ta jest bardziej czasochłonna i mniej programowalna.
Konfigurowanie klienta Ubuntu
UWAGA
Konfigurowanie klienta na Linuksie jest obecnie dość czasochłonne, ponieważ... wymaga zbudowania oddzielnych programów ze źródeł. Postaramy się, aby w najbliższej przyszłości wszystkie zmiany zostały uwzględnione w oficjalnych repozytoriach.
Aby zapewnić połączenie z serwerem na poziomie IPSec wykorzystywany jest pakiet strongswan oraz demon xl2tp. Aby uprościć łączenie się z siecią za pomocą kart inteligentnych, użyjemy pakietu l2tp-ipsec-vpn, który zapewnia powłokę graficzną ułatwiającą konfigurację połączenia.
Zacznijmy krok po kroku składać elementy, ale wcześniej zainstalujemy wszystkie niezbędne pakiety, aby VPN działał bezpośrednio:
sudo apt-get install xl2tpd strongswan libp11-3
Instalowanie oprogramowania do pracy z tokenami
Zainstaluj najnowszą bibliotekę librtpkcs11ecp.so z сайта, także biblioteki do pracy z kartami inteligentnymi:
sudo apt-get -y install git make gcc libssl-dev
git clone "https://github.com/jjkeijser/ppp"
cd ppp
./configure --prefix /usr
make -j4
sudo make install
Instalowanie klienta L2tpIpsecVpn
W tej chwili klient wymaga również skompilowania z kodu źródłowego. Odbywa się to za pomocą następującej sekwencji poleceń:
sudo apt-get -y install git qt5-qmake qt5-default build-essential libctemplate-dev libltdl-dev
git clone "https://github.com/Sander80/l2tp-ipsec-vpn"
cd l2tp-ipsec-vpn
make -j4
sudo make install
Konfigurowanie klienta L2tpIpsecVpn
Uruchom zainstalowanego klienta:
Po uruchomieniu powinien otworzyć się aplet L2tpIpsecVPN. Kliknij go prawym przyciskiem myszy i skonfiguruj połączenie:
Aby pracować z tokenami, przede wszystkim wskazujemy ścieżkę do silnika opensc silnika OpenSSL i biblioteki PKCS#11. Aby to zrobić, otwórz zakładkę „Preferencje” i skonfiguruj parametry openssl:
.
Zamknijmy okno ustawień OpenSSL i przejdźmy do konfiguracji sieci. Dodajmy nową sieć klikając w przycisk Dodaj... w panelu ustawień i wpisując nazwę sieci:
Następnie ta sieć stanie się dostępna w panelu ustawień. Kliknij dwukrotnie prawym przyciskiem myszy nową sieć, aby ją skonfigurować. Na pierwszej karcie musisz dokonać ustawień IPsec. Ustawmy adres serwera i klucz publiczny:
Następnie przejdź do zakładki Ustawienia PPP i wskaż tam nazwę użytkownika, pod którą chcemy uzyskać dostęp do sieci:
Następnie otwórz zakładkę Właściwości i określ ścieżkę do klucza, certyfikatu klienta i urzędu certyfikacji:
Zamknijmy tę zakładkę i dokonajmy ostatecznych ustawień, w tym celu otwórz zakładkę „Ustawienia IP” i zaznacz pole obok opcji „Uzyskaj adres serwera DNS automatycznie”:
Ta opcja pozwoli klientowi otrzymać osobisty adres IP w sieci z serwera.
Po skonfigurowaniu wszystkich ustawień zamknij wszystkie karty i uruchom ponownie klienta:
Połączenie sieciowe
Po ustawieniach możesz połączyć się z siecią. W tym celu otwórz zakładkę apletu i wybierz sieć, z którą chcemy się połączyć:
Podczas nawiązywania połączenia Klient poprosi nas o podanie kodu PIN Rutoken:
Jeśli na pasku stanu pojawi się powiadomienie o pomyślnym nawiązaniu połączenia, oznacza to, że konfiguracja przebiegła pomyślnie:
W przeciwnym razie warto dowiedzieć się, dlaczego połączenie nie zostało nawiązane. W tym celu należy zajrzeć do logu programu wybierając w aplecie polecenie „Informacje o połączeniu”:
Konfigurowanie klienta Windows
Konfiguracja klienta w systemie Windows jest znacznie łatwiejsza niż w systemie Linux, ponieważ... Całe niezbędne oprogramowanie jest już wbudowane w system.
Ustawienia systemu
Zainstalujemy wszystkie niezbędne sterowniki do pracy z Rutokens, pobierając je z z. strona.
Importowanie certyfikatu głównego w celu uwierzytelnienia
Pobierz certyfikat główny serwera i zainstaluj go w systemie. Aby to zrobić, otwórz go i w oknie, które zostanie otwarte, wybierz opcję „Zainstaluj certyfikat”:
W oknie, które zostanie otwarte, wybierz instalację certyfikatu dla użytkownika lokalnego. Jeśli chcesz, aby certyfikat był dostępny dla wszystkich użytkowników komputera, powinieneś zdecydować się na instalację certyfikatu na komputerze lokalnym:
Zainstalujmy certyfikat w zaufanym głównym magazynie certyfikatów urzędu certyfikacji:
Po tych wszystkich działaniach zgadzamy się ze wszystkimi dalszymi punktami. System jest teraz skonfigurowany.
Konfigurowanie połączenia VPN
Aby skonfigurować połączenie VPN, przejdź do panelu sterowania i wybierz opcję utworzenia nowego połączenia.
W wyskakującym oknie wybierz opcję utworzenia połączenia w celu połączenia się z miejscem pracy:
W kolejnym oknie wybierz połączenie VPN:
i wprowadź szczegóły połączenia VPN, a także określ opcję korzystania z karty inteligentnej:
Konfiguracja nie jest jeszcze ukończona. Pozostaje tylko określić klucz współdzielony dla protokołu IPsec; w tym celu należy przejść do zakładki „Ustawienia połączenia sieciowego”, a następnie przejść do zakładki „Właściwości tego połączenia”:
W oknie, które zostanie otwarte, przejdź do zakładki „Zabezpieczenia”, jako typ sieci określ „Sieć L2TP/IPsec” i wybierz „Ustawienia zaawansowane”:
W oknie, które zostanie otwarte, określ udostępniony klucz IPsec:
Połączenie
Po zakończeniu konfiguracji możesz spróbować połączyć się z siecią:
Podczas procesu łączenia będziemy zobowiązani do wprowadzenia kodu PIN tokena:
Stworzyliśmy bezpieczną sieć VPN i upewniliśmy się, że nie jest to trudne.
Podziękowanie
Chciałbym jeszcze raz podziękować naszym kolegom Wasilijowi Szokowowi i Aleksandrowi Smirnowowi za wspólną pracę, którą wykonali, aby uprościć tworzenie połączeń VPN dla klientów z systemem Linux.