Organizacja pracy zdalnej organizacji SMB na OpenVPN
Stwierdzenie problemu
W artykule opisano organizację zdalnego dostępu pracowników do produktów open source i można go wykorzystać zarówno do zbudowania całkowicie autonomicznego systemu, jak i przyda się przy rozbudowie, gdy w istniejącym systemie komercyjnym zabraknie licencji lub jego wydajność będzie niewystarczająca.
Celem artykułu jest wdrożenie kompletnego systemu umożliwiającego zdalny dostęp do organizacji, czyli niewiele więcej niż „instalacja OpenVPN w 10 minut”.
W efekcie otrzymamy system, w którym do uwierzytelniania użytkowników wykorzystywane będą certyfikaty oraz (opcjonalnie) korporacyjny Active Directory. To. otrzymamy system z dwoma współczynnikami weryfikacji – tym, co mam (certyfikat) i tym, co wiem (hasło).
Znakiem, że użytkownik może się połączyć, jest jego członkostwo w grupie myVPNUsr. Urząd certyfikacji będzie używany w trybie offline.
Koszt wdrożenia rozwiązania to jedynie niewielkie zasoby sprzętowe i 1 godzina pracy administratora systemu.
Będziemy korzystać z maszyny wirtualnej z OpenVPN i Easy-RSA w wersji 3 na CetntOS 7, która ma przydzielone 100 vCPU i 4 GiB RAM na 4 połączeń.
W przykładzie sieć naszej organizacji to 172.16.0.0/16, w której serwer VPN o adresie 172.16.19.123 znajduje się w segmencie 172.16.19.0/24, serwery DNS 172.16.16.16 i 172.16.17.17, a podsieć 172.16.20.0 .23/XNUMX jest przydzielany klientom VPN.
Aby połączyć się z zewnątrz, wykorzystywane jest połączenie przez port 1194/udp, a w DNS naszego serwera utworzono rekord A gw.abc.ru.
Zdecydowanie nie zaleca się wyłączania SELinux! OpenVPN działa bez wyłączania zasad bezpieczeństwa.
Instalacja systemu operacyjnego i oprogramowania aplikacyjnego
Korzystamy z dystrybucji CentOS 7.8.2003. Musimy zainstalować system operacyjny w minimalnej konfiguracji. Wygodnie jest to zrobić za pomocą Kickstart, klonowanie wcześniej zainstalowanego obrazu systemu operacyjnego i inne sposoby.
Po instalacji, przypisaniu adresu do interfejsu sieciowego (zgodnie z warunkami zadania 172.16.19.123) aktualizujemy system operacyjny:
$ sudo yum update -y && reboot
Musimy także upewnić się, że na naszej maszynie przeprowadzana jest synchronizacja czasu.
Aby zainstalować oprogramowanie aplikacyjne, jako główny edytor potrzebujesz pakietów openvpn, openvpn-auth-ldap, easy-rsa i vim (będziesz potrzebować repozytorium EPEL).
Opisano tutaj parametry organizacji warunkowej ABC LLC, można je poprawić do rzeczywistych lub pozostawić z przykładu. Najważniejszą rzeczą w parametrach jest ostatnia linia, która określa okres ważności certyfikatu w dniach. W przykładzie użyto wartości 10 lat (365*10+2 lata przestępne). Wartość tę należy dostosować przed wydaniem certyfikatów użytkownika.
Następnie konfigurujemy autonomiczny urząd certyfikacji.
Konfiguracja obejmuje eksportowanie zmiennych, inicjowanie urzędu certyfikacji, wydawanie klucza głównego urzędu certyfikacji i certyfikatu, klucza Diffiego-Hellmana, klucza TLS oraz klucza i certyfikatu serwera. Klucz CA musi być starannie chroniony i utrzymywany w tajemnicy! Wszystkie parametry zapytania można pozostawić domyślne.
To kończy główną część konfigurowania mechanizmu kryptograficznego.
Konfigurowanie OpenVPN
Przejdź do katalogu OpenVPN, utwórz katalogi usług i dodaj link do easy-rsa:
cd /etc/openvpn/
mkdir /var/log/openvpn/ /etc/openvpn/ccd /usr/share/easy-rsa/3/client
ln -s /usr/share/easy-rsa/3/pki/ /etc/openvpn/
Utwórz główny plik konfiguracyjny OpenVPN:
$ sudo vim server.conf
następującą treść
port 1194
proto udp
dev tun
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/myvpngw.crt
key /etc/openvpn/pki/private/myvpngw.key
crl-verify /etc/openvpn/pki/crl.pem
dh /etc/openvpn/pki/dh.pem
server 172.16.20.0 255.255.254.0
ifconfig-pool-persist ipp.txt
push "route 172.16.0.0 255.255.255.0"
push "route 172.17.0.0 255.255.255.0"
client-config-dir ccd
push "dhcp-option DNS 172.16.16.16"
push "dhcp-option DNS 172.16.17.17"
keepalive 10 120
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 1
username-as-common-name
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so /etc/openvpn/ldap.conf
Kilka uwag na temat parametrów:
jeżeli przy wydawaniu certyfikatu podano inną nazwę, należy ją wskazać;
określ pulę adresów dostosowaną do Twoich zadań*;
może istnieć jedna lub więcej tras i serwerów DNS;
Ostatnie 2 linie są potrzebne do wdrożenia uwierzytelniania w AD**.
*Zakres adresów wybrany w przykładzie pozwoli na jednoczesne połączenie aż 127 klientów, ponieważ wybrana jest sieć /23, a OpenVPN tworzy podsieć dla każdego klienta przy użyciu maski /30.
Jeśli jest to szczególnie konieczne, można zmienić port i protokół, należy jednak pamiętać, że zmiana numeru portu portu będzie się wiązać z konfiguracją SELinuksa, a użycie protokołu tcp zwiększy narzut, ponieważ Kontrola dostarczania pakietów TCP jest już wykonywana na poziomie pakietów kapsułkowanych w tunelu.
**Jeśli uwierzytelnianie w AD nie jest potrzebne, skomentuj je, pomiń następną sekcję i w szablonie usuń linię aut-user-pass.
Uwierzytelnianie AD
Aby wesprzeć drugi czynnik, użyjemy weryfikacji konta w AD.
Potrzebujemy konto w domenie z uprawnieniami zwykłego użytkownika i grupy, do której przynależność będzie decydowała możliwość łączenia się.
systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log
Wydanie i unieważnienie certyfikatu
Ponieważ Oprócz samych certyfikatów potrzebne są klucze i inne ustawienia, bardzo wygodnie jest umieścić to wszystko w jednym pliku profilu. Plik ten jest następnie przesyłany do użytkownika, a profil jest importowany do klienta OpenVPN. W tym celu utworzymy szablon ustawień oraz skrypt generujący profil.
Musisz dodać do profilu zawartość plików certyfikatu głównego (ca.crt) i klucza TLS (ta.key).
Przed wydaniem certyfikatów użytkownika nie zapomnij ustawić wymaganego okresu ważności certyfikatów w pliku parametrów. Nie należy go przedłużać, radzę ograniczyć się do maksymalnie 180 dni.
vim /usr/share/easy-rsa/3/vars
...
export EASYRSA_CERT_EXPIRE=180
vim /usr/share/easy-rsa/3/client/template.ovpn
client
dev tun
proto udp
remote gw.abc.ru 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
verb 3
auth-user-pass
<ca>
-----BEGIN CERTIFICATE-----
PUT YOUR CA CERT (ca.crt) HERE
-----END CERTIFICATE-----
</ca>
key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
PUT YOUR TA KEY (ta.key) HERE
-----END OpenVPN Static key V1-----
</tls-auth>
Uwagi:
struny POŁOŻ SWOJE... zmienić treść ze swoich dni certyfikaty;
w dyrektywie zdalnej podaj nazwę/adres swojej bramy;
dyrektywa auth-user-pass służy do dodatkowego uwierzytelniania zewnętrznego.
W katalogu domowym (lub innym dogodnym miejscu) tworzymy skrypt żądania certyfikatu i utworzenia profilu:
vim ~/make.profile.sh
#!/bin/bash
if [ -z "$1" ] ; then
echo Missing mandatory client name. Usage: $0 vpn-username
exit 1
fi
#Set variables
basepath=/usr/share/easy-rsa/3
clntpath=$basepath/client
privpath=$basepath/pki/private
certpath=$basepath/pki/issued
profile=$clntpath/$1.ovpn
#Get current year and lowercase client name
year=`date +%F`
client=${1,,}
echo Processing $year year cert for user/device $client
cd $basepath
if [ -f client/$client* ]; then
echo "*** ERROR! ***"
echo "Certificate $client already issued!"
echo "*** ERROR! ***"
exit 1
fi
. ./vars
./easyrsa --batch --req-cn=$client gen-req $client nopass
./easyrsa --batch sign-req client $client
#Make profile
cp $clntpath/template.ovpn $profile
echo "<key>" >> $profile
cat $privpath/$1.key >> $profile
echo "</key>" >> $profile
echo -e "n" >> $profile
openssl x509 -in $certpath/$1.crt -out $basepath/$1.crt
echo "<cert>" >> $profile
cat $basepath/$1.crt >> $profile
echo "</cert>" >> $profile
echo -e "n" >> $profile
#remove tmp file
rm -f $basepath/$1.crt
echo Complete. See $profile file.
cd ~
Uczynienie pliku wykonywalnym:
chmod a+x ~/make.profile.sh
I możemy wystawić nasz pierwszy certyfikat.
~/make.profile.sh my-first-user
wycofanie
W przypadku naruszenia bezpieczeństwa certyfikatu (utrata, kradzież) konieczne jest unieważnienie tego certyfikatu:
cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl
Wyświetl wydane i unieważnione certyfikaty
Aby wyświetlić wydane i unieważnione certyfikaty, wystarczy wyświetlić plik indeksu:
cd /usr/share/easy-rsa/3/
cat pki/index.txt
Wyjaśnienie:
pierwsza linia to certyfikat serwera;
pierwsza postać
V (Ważny) - ważny;
R (Odwołany) - odwołany.
Konfiguracja sieci
Ostatnią czynnością jest skonfigurowanie sieci transmisyjnej – routingu i firewalli.
Zezwalanie na połączenia w lokalnej zaporze sieciowej:
W środowisku korporacyjnym prawdopodobnie występuje podsieć i musimy poinformować router(y), jak wysyłać pakiety przeznaczone dla naszych klientów VPN. Z linii poleceń wykonujemy polecenie w sposób (w zależności od używanego sprzętu):
# ip route 172.16.20.0 255.255.254.0 172.16.19.123
i zapisz konfigurację.
Ponadto na interfejsie routera granicznego, na którym obsługiwany jest adres zewnętrzny gw.abc.ru, konieczne jest zezwolenie na przepływ pakietów udp/1194.
Jeśli organizacja ma rygorystyczne zasady bezpieczeństwa, na naszym serwerze VPN należy również skonfigurować zaporę sieciową. Moim zdaniem największą elastyczność zapewnia ustawienie łańcuchów iptables FORWARD, choć ich ustawienie jest mniej wygodne. Trochę więcej o ich konfigurowaniu. Aby to zrobić, najwygodniej jest użyć „reguł bezpośrednich” - reguł bezpośrednich przechowywanych w pliku /etc/firewalld/direct.xml. Aktualną konfigurację reguł można znaleźć w następujący sposób:
Są to zasadniczo zwykłe reguły iptables, w przeciwnym razie spakowane po pojawieniu się zapory ogniowej.
Interfejs docelowy z ustawieniami domyślnymi to tun0, natomiast interfejs zewnętrzny dla tunelu może być inny, na przykład ens192, w zależności od używanej platformy.
Ostatnia linia służy do rejestrowania upuszczonych pakietów. Aby logowanie działało, musisz zmienić poziom debugowania w konfiguracji firewalla:
vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2
Zastosowanie ustawień to zwykłe polecenie zapory ogniowej umożliwiające ponowne odczytanie ustawień:
$ sudo firewall-cmd --reload
Możesz przeglądać upuszczone pakiety w następujący sposób:
grep forward_fw /var/log/messages
Co dalej
To kończy konfigurację!
Pozostaje tylko zainstalować oprogramowanie klienckie po stronie klienta, zaimportować profil i połączyć się. W przypadku systemów operacyjnych Windows pakiet dystrybucyjny znajduje się na stronie strona dewelopera.
Na koniec podłączamy nasz nowy serwer do systemów monitorowania i archiwizacji oraz nie zapominamy o regularnym instalowaniu aktualizacji.