
Problematyka
Jeszcze niedawno wielu nie wiedziało, jak to jest pracować z domu. Pandemia drastycznie zmieniła sytuację na świecie, wszyscy zaczęli dostosowywać się do nowej rzeczywistości, a mianowicie do tego, że wychodzenie z domu stało się po prostu niebezpieczne. Wiele osób musiało szybko zorganizować pracę zdalną dla swoich pracowników.
Jednak brak przemyślanego podejścia w wyborze rozwiązań do pracy zdalnej może prowadzić do nieodwracalnych strat. Hasła użytkowników mogą zostać skradzione, co daje przestępcom możliwość niekontrolowanego łączenia się z siecią i zasobami IT przedsiębiorstwa.
Właśnie dlatego wzrosła potrzeba tworzenia niezawodnych korporacyjnych sieci VPN. Opowiem ci o niezawodnej, bezpiecznej i prostej w użyciu sieci VPN.
Działa ona w schemacie IPsec/L2TP, wykorzystując do uwierzytelniania klientów nieodwracalne klucze i certyfikaty przechowywane na tokenach, a także przesyła dane po sieci w postaci zaszyfrowanej.
Jako platformy demonstracyjne do konfiguracji użyto serwera z CentOS 7 (adres: centos.vpn.server.ad) oraz klienta z Ubuntu 20.04, a także klienta z Windows 10.
Opis systemu
VPN będzie działać w schemacie IPSec + L2TP + PPP. Protokół Point-to-Point Protocol (PPP) działa na poziomie łącza modelu OSI i zapewnia uwierzytelnianie użytkownika oraz szyfrowanie przesyłanych danych. Jego dane są inkapsulowane w danych protokołu L2TP, który z kolei zapewnia utworzenie połączenia w sieci VPN, ale nie zapewnia uwierzytelniania i szyfrowania.
Dane L2TP są inkapsulowane 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ądzeń, a nie na poziomie użytkowników.
Ta cecha pozwala na uwierzytelnianie użytkowników tylko z określonych urządzeń. My natomiast będziemy używać protokołu IPSec i pozwolimy na uwierzytelnianie użytkowników z dowolnego urządzenia.

Uwierzytelnienie użytkownika za pomocą kart inteligentnych będzie odbywać się na poziomie protokołu PPP przy użyciu protokołu EAP-TLS.
Szczegółowe informacje o działaniu tego schematu można znaleźć w .
Dlaczego ten schemat spełnia wszystkie trzy wymagania dobrej sieci VPN
- Niezawodność tego schematu została potwierdzona przez czas. Jest on stosowany do wdrażania sieci VPN od 2000 roku.
- Bezpieczną autoryzację użytkownika zapewnia protokół PPP. nie zapewnia wystarczającego poziomu bezpieczeństwa, ponieważ do autoryzacji w najlepszym przypadku wykorzystuje się autoryzację za pomocą loginu i hasła. Wszyscy wiemy, że login i hasło można podejrzeć, odgadnąć lub ukraść. Niemniej jednak, już dawno programista do tego protokołu naprawił ten problem i dodał możliwość używania do autoryzacji protokołów opartych na asymetrycznym szyfrowaniu, takich jak EAP-TLS. Ponadto dodał możliwość używania kart inteligentnych do autoryzacji, co uczyniło ten system bardziej bezpiecznym.
W tej chwili prowadzone są aktywne negocjacje dotyczące fuzji tych dwóch projektów i można być pewnym, że prędzej czy później będzie to miało miejsce. Na przykład w repozytoriach Fedory od dawna znajduje się załatana wersja PPP, która wykorzystuje bezpieczne protokoły do autoryzacji. - Jeszcze niedawno z tej sieci mogli korzystać tylko użytkownicy Windows, ale nasi koledzy z MGU, Wasił Szokow i Aleksander Smirnow, znaleźli i zaktualizowali go. Wspólnymi siłami poprawiliśmy wiele błędów i niedociągnięć w działaniu klienta, uprościliśmy instalację i konfigurację systemu, nawet przy budowie z kodu źródłowego. Najważniejszymi z nich są:
- Naprawiono problemy z kompatybilnością starego klienta z interfejsem nowych wersji openssl i qt.
- Usunięto przesyłanie PIN-u pppd tokena przez tymczasowy plik.
- Naprawiono nieprawidłowe uruchomienie programu żądania hasła przez interfejs graficzny. Zrealizowano to poprzez ustawienie poprawnego środowiska dla usługi xl2tpd.
- Budowa demona L2tpIpsecVpn odbywa się teraz wspólnie z budową samego klienta, co ułatwia proces budowy i konfiguracji.
- Dla ułatwienia rozwoju włączono system Azure Pipelines do testowania poprawności budowy.
- Dodano możliwość wymuszonego obniżania w kontekście openssl. Jest to przydatne dla poprawnej obsługi nowych systemów operacyjnych, w których standardowy poziom bezpieczeństwa ustawiony jest na 2, z sieciami VPN, które używają certyfikatów, które nie spełniają wymagań bezpieczeństwa tego poziomu. Ta opcja będzie przydatna do pracy z już istniejącymi starymi sieciami VPN.
Poprawioną wersję można znaleźć w .
Ten klient wspiera użycie kart inteligentnych do uwierzytelniania, a także maksymalnie ukrywa wszystkie trudności i niedogodności związane z konfiguracją tej schemy w systemie Linux, czyniąc konfigurację klienta maksymalnie prostą i szybką.
Oczywiście, dla wygodnej komunikacji PPP i GUI klienta nie obyło się bez dodatkowych poprawek w każdym z projektów, jednak udało się je zminimalizować:
- Naprawiono
- Naprawiono . Ten błąd uniemożliwia ładowanie z lokalnego /etc/ppp/openssl.cnf pliku z konfiguracją czegokolwiek poza informacjami o silnikach openssl dla pracy z kartami inteligentnymi, co stwarzało poważne niedogodności, jeśli na przykład chcieliśmy ustawić coś więcej. Na przykład, zdefiniować poziom bezpieczeństwa podczas nawiązywania połączenia.
Teraz można przystąpić do konfiguracji.
Konfiguracja serwera
Zainstalujemy wszystkie niezbędne pakiety.
Instalacja strongswan (IPsec)
Najpierw skonfigurujemy zaporę ogniową do pracy z ipsec
sudo firewall-cmd --permanent --add-port=1701/{tcp,udp}
sudo firewall-cmd --permanent --add-service=ipsec
sudo firewall-cmd --reloadNastępnie przystąpimy do instalacji
sudo yum install epel-release ipsec-tools dnf
sudo dnf install strongswanPo instalacji należy ustawić konfigurację dla strongswan (jednej z implementacji IPSec). Aby to zrobić, edytujemy plik /etc/strongswan/ipsec.conf :
config setup
nat_traversal=yes
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
oe=off
protostack=netkey
conn L2TP-PSK-NAT
rightsubnet=vhost:%priv
also=L2TP-PSK-noNAT
conn L2TP-PSK-noNAT
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=1h
type=transport
left=%any
leftprotoport=udp/1701
right=%any
rightprotoport=udp/%any
ike=aes128-sha1-modp1536,aes128-sha1-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha1-modp1536,3des-sha1-modp1024,3des-md5-modp1536,3des-md5-modp1024
esp=aes128-sha1-modp1536,aes128-sha1-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha1-modp1536,3des-sha1-modp1024,3des-md5-modp1536,3des-md5-modp1024Ustalmy również wspólne hasło do logowania. Wspólne hasło powinno być znane wszystkim uczestnikom sieci w celu autoryzacji. Ta metoda jest zasadniczo niepewna, ponieważ hasło to łatwo może stać się znane osobom, którym nie chcemy udostępniać dostępu do sieci.
Jednak ten fakt nie wpłynie na bezpieczeństwo organizacji sieci, ponieważ główne szyfrowanie danych i autoryzacja użytkowników odbywa się za pomocą protokołu PPP. Jednak należy zauważyć, że strongswan wspiera bardziej bezpieczne technologie autoryzacji, na przykład z wykorzystaniem kluczy prywatnych. W strongswan istnieje również możliwość zapewnienia autoryzacji za pomocą kart inteligentnych, ale obecnie wspierany jest ograniczony krąg urządzeń, przez co autoryzacja za pomocą tokenów i kart inteligentnych RarToken jest obecnie utrudniona. Ustalmy wspólne hasło poprzez plik. /etc/strongswan/ipsec.secrets:
# ipsec.secrets - strongSwan IPsec secrets file
%any %any : PSK "SECRET_PASSPHRASE"Uruchommy ponownie strongswan:
sudo systemctl enable strongswan
sudo systemctl restart strongswanInstalacja xl2tp
sudo dnf install xl2tpdSkonfigurujemy go poprzez plik /etc/xl2tpd/xl2tpd.conf:
[global]
force userspace = yes
listen-addr = 0.0.0.0
ipsec saref = yes
[lns default]
exclusive = no
; definiuje statyczny adres serwera w wirtualnej sieci
local ip = 100.10.10.1
; ustawia zakres adresów wirtualnych
ip range = 100.10.10.1-100.10.10.254
assign ip = yes
refuse pap = yes
require authentication = yes
; tę opcję można wyłączyć po pomyślnej konfiguracji sieci
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
; wskazuje na adres serwera w sieci
name = centos.vpn.server.adUruchommy ponownie usługę:
sudo systemctl enable xl2tpd
sudo systemctl restart xl2tpdKonfiguracja PPP
Zaleca się zainstalowanie najnowszej wersji pppd. W tym celu wykonajmy następujące polecenia:
sudo yum install git make gcc openssl-devel
git clone "https://github.com/jjkeijser/ppp"
cd ppp
./configure --prefix /usr
make -j4
sudo make installWpisz do pliku /etc/ppp/options.xl2tpd następujące (jeśli znajdują się tam jakieś wartości, można je usunąć):
ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8
ms-dns 1.1.1.1
noccp
auth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
proxyarp
connect-delay 5000Wydrukuj certyfikat root 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 -CAcreateserialW ten sposób zakończyliśmy podstawową konfigurację serwera. Reszta konfiguracji serwera dotyczy dodawania nowych klientów.
Dodanie nowego klienta
Aby dodać nowego klienta do sieci, należy zapisać jego certyfikat na liście zaufanych dla tego klienta.
Jeśli użytkownik chce stać się uczestnikiem sieci VPN, tworzy parę kluczy i wniosek o certyfikat dla danego klienta. Jeśli użytkownik jest zaufany, wniosek ten można podpisać, a uzyskany certyfikat zapisać w katalogu certyfikatów:
sudo openssl x509 -req -in client.req -CAkey /etc/ppp/keys/ca.pem -CA /etc/ppp/certs/ca.pem -out /etc/ppp/certs/client.pem -CAcreateserialDodajemy linię do pliku /etc/ppp/eaptls-server, aby dopasować nazwę klienta do jego certyfikatu:
"client" * /etc/ppp/certs/client.pem /etc/ppp/certs/server.pem /etc/ppp/certs/ca.pem /etc/ppp/keys/server.pem *UWAGA
Aby uniknąć zamieszania, lepiej, aby: Common Name, nazwa pliku certyfikatu i nazwa użytkownika były unikalne.
Należy również upewnić się, że w innych plikach autoryzacji nie pojawia się nazwa użytkownika, którego dodajemy, w przeciwnym razie wystąpią problemy z metodą autoryzacji użytkownika.
Ten certyfikat należy również odesłać użytkownikowi.
Generowanie pary kluczy i certyfikatu
Aby autoryzacja była skuteczna, klient musi:
- wygenerować parę kluczy;
- mieć root certificate CA;
- mieć certyfikat dla swojej pary kluczy, podpisany przez root CA.
dla klienta na systemie Linux
Na początek wygenerujmy parę kluczy na tokenie i utwórzmy wniosek o certyfikat:
#идентификатор ключа (параметр --id) можно заменить на любой другой.
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 45
openssl
OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:librtpkcs11ecp.so
...
OpenSSL> req -engine pkcs11 -new -key 45 -keyform engine -out client.req -subj "/C=RU/CN=client"Wniosek client.req należy wysłać do CA. Po otrzymaniu certyfikatu dla swojej pary kluczy zapisz go na tokenie z tym samym identyfikatorem co klucz:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./client.pem --id 45dla klientów Windows i Linux (bardziej uniwersalny sposób)
Ten sposób jest bardziej uniwersalny, ponieważ pozwala wygenerować klucz i certyfikat, który będzie poprawnie rozpoznawany przez użytkowników Windows i Linux, ale wymaga posiadania maszyny z systemem Windows do przeprowadzenia procedury generowania kluczy.
Przed generowaniem wniosków i importem certyfikatów należy dodać root certificate VPN do listy zaufanych. Aby to zrobić, otwórz go i w nowym oknie wybierz opcję "Zainstaluj certyfikat":

W nowym oknie wybierzemy instalację certyfikatu dla lokalnego użytkownika:

Zainstalujemy certyfikat w magazynie zaufanych root certificates CA:

Po wykonaniu tych kroków zgadzamy się na wszystkie dalsze punkty. Teraz system jest skonfigurowany.
Utworzymy plik cert.tmp z następującą zawartością:
[NewRequest]
Subject = "CN=client"
KeyLength = 2048
KeySpec = "AT_KEYEXCHANGE"
ProviderName = "Microsoft Base Smart Card Crypto Provider"
KeyUsage = "CERT_KEY_ENCIPHERMENT_KEY_USAGE"
KeyUsageProperty = "NCRYPT_ALLOW_DECRYPT_FLAG"
RequestType = PKCS10
SMIME = FALSENastępnie wygenerujemy parę kluczy i stworzymy wniosek o certyfikat. W tym celu otworzymy PowerShell i wprowadzimy następujące polecenie:
certreq.exe -new -pin $PIN .cert.tmp .client.reqWyślij stworzony wniosek client.req do twojego centrum certyfikacji i poczekaj na otrzymanie certyfikatu client.pem. Można go zapisać na tokenie i dodać do magazynu certyfikatów Windows za pomocą następującego polecenia:
certreq.exe -accept .client.pemWarto zauważyć, że analogiczne działania można przeprowadzić za pomocą graficznego interfejsu programu mmc, jednak ta metoda jest bardziej czasochłonna i mniej programowalna.
Konfiguracja klienta Ubuntu
UWAGA
Konfiguracja klienta na Linuxie w tej chwili jest dość czasochłonna, ponieważ wymaga kompilacji poszczególnych programów z kodu źródłowego. Postaramy się w najbliższym czasie, aby wszystkie zmiany trafiły do oficjalnych repozytoriów.
Aby zapewnić połączenie na poziomie IPSec z serwerem — wykorzystuje się pakiet strongswan i demon xl2tp. Aby uprościć połączenie do sieci za pomocą kart inteligentnych – użyjemy pakietu l2tp-ipsec-vpn, który zapewnia graficzny interfejs do uproszczonej konfiguracji połączenia.
Rozpoczniemy zbieranie elementów etapami, ale przed tym zainstalujemy wszystkie niezbędne pakiety do działania VPN:
sudo apt-get install xl2tpd strongswan libp11-3Instalacja oprogramowania do pracy z tokenami
Zainstaluj najnowszą wersję biblioteki librtpkcs11ecp.so z , a także biblioteki do pracy z kartami inteligentnymi:
sudo apt-get install pcscd pcsc-tools opensc libengine-pkcs11-opensslPodłącz Rutoken i sprawdź, czy system go rozpoznaje:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -lInstalacja poprawionego ppp
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 installInstalacja klienta L2tpIpsecVpn
Obecnie klient również musi być kompilowany z kodu źródłowego. Robi 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 installKonfiguracja klienta L2tpIpsecVpn
Uruchamiamy zainstalowanego klienta:

Po uruchomieniu powinien otworzyć się aplet L2tpIpsecVPN. Kliknij na niego prawym przyciskiem myszy i skonfiguruj połączenie:

Aby pracować z tokenami, najpierw wskażemy ścieżkę do silnika opensc OpenSSL i biblioteki PKCS#11. W tym celu otwórz zakładkę „Preferencje”, aby skonfigurować parametry openssl:
.
Zamkniemy okno ustawień OpenSSL i przejdziemy do konfiguracji sieci. Dodamy nową sieć, klikając przycisk Dodaj… na panelu ustawień i wprowadzimy nazwę sieci:

Po tym nowa sieć stanie się dostępna w panelu ustawień. Klikniemy prawym przyciskiem myszy na nową sieć, aby ją skonfigurować. Na pierwszej zakładce musimy skonfigurować IPsec. Ustawimy adres serwera i wspólny klucz:

Po tym przechodzimy do zakładki konfiguracji PPP i podajemy tam nazwę użytkownika, pod którą chcemy się zalogować do sieci:

Następnie otworzymy zakładkę Właściwości i wskażemy ścieżkę do klucza, certyfikatu klienta i CA:

Zamkniemy tę zakładkę i przeprowadzimy finalną konfigurację, otwierając zakładkę „Ustawienia IP” i zaznaczając opcję „Uzyskaj adres serwera DNS automatycznie”:

Ta opcja pozwoli klientowi uzyskać osobisty adres IP od serwera wewnątrz sieci.
Po wszystkich ustawieniach zamkniemy wszystkie zakładki i zrestartujemy klienta:

Połączenie z siecią
Po ustawieniach możemy połączyć się z siecią. W tym celu otworzymy zakładkę appletu i wybierzemy sieć, z którą chcemy się połączyć:

Podczas łączenia klient poprosi nas o podanie kodu PIN RUTOKEN:

Jeśli w pasku statusu pojawi się powiadomienie, że połączenie zostało pomyślnie nawiązane, oznacza to, że konfiguracja została przeprowadzona pomyślnie:

W przeciwnym razie warto sprawdzić, dlaczego połączenie nie zostało nawiązane. W tym celu należy zajrzeć do dziennika programu, wybierając w appletcie polecenie „Informacje o połączeniu”:

Konfiguracja klienta Windows
Konfiguracja klienta w Windows jest znacznie prostsza niż w Linuxie, ponieważ całe potrzebne oprogramowanie jest już wbudowane w system.
Konfiguracja systemu
Zainstalujemy wszystkie niezbędne sterowniki do pracy z RUTOKENAMI, pobierając je z .
Import certyfikatu root do uwierzytelniania
Pobierzemy certyfikat root serwera i zainstalujemy go w systemie. W tym celu otworzymy go i w otwartym oknie wybierzemy opcję „Zainstaluj certyfikat”:

W otwartym oknie wybierzemy instalację certyfikatu dla lokalnego użytkownika. Jeśli chcemy, aby certyfikat był dostępny dla wszystkich użytkowników komputera, należy wybrać instalację certyfikatu na lokalnym komputerze:

Zainstalujemy certyfikat w magazynie zaufanych root certificates CA:

Po wykonaniu tych kroków zgadzamy się na wszystkie dalsze punkty. Teraz system jest skonfigurowany.
Konfiguracja połączenia VPN
Aby skonfigurować połączenie VPN, przejdź do panelu sterowania i wybierz opcję utworzenia nowego połączenia.

W oknie dialogowym wybierz opcję tworzenia połączenia do miejsca pracy:

W następnym oknie wybierz połączenie VPN:

i wprowadź dane połączenia VPN oraz zaznacz opcję korzystania z karty smart:

Na tym etapie konfiguracja nie jest zakończona. Pozostaje podać wspólny klucz dla protokołu IPsec, w tym celu przejdź na zakładkę „Ustawienia połączeń sieciowych”, a następnie na zakładkę „Właściwości tego połączenia”:

W otwartym oknie przejdź na zakładkę "Zabezpieczenia", wybierz jako typ sieci "Sieć L2TP/IPsec" i wybierz "Dodatkowe opcje":

W nowym oknie podaj wspólny klucz IPsec:

Podłączenie
Po zakończeniu konfiguracji możesz spróbować połączyć się z siecią:

Podczas łączenia będziemy proszeni o wprowadzenie kodu PIN tokena:

Skonfigurowaliśmy bezpieczną sieć VPN i upewniliśmy się, że to nie jest trudne.
Podziękowania
Chciałbym jeszcze raz podziękować naszym kolegom Wasilijowi Szokowowi i Aleksandrowi Smirnowowi za wspólną pracę nad uproszczeniem tworzenia połączeń VPN dla klientów Linux.
Źródło: habr.com
