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.

Zawartość

  1. Instalacja systemu operacyjnego i oprogramowania aplikacyjnego
  2. Konfigurowanie kryptografii
  3. Konfigurowanie OpenVPN
  4. Uwierzytelnianie AD
  5. Uruchomienie i diagnostyka
  6. Wydanie i unieważnienie certyfikatu
  7. Konfiguracja sieci
  8. Co dalej

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).

$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim

Przydatne jest zainstalowanie agenta gościa dla maszyny wirtualnej:

$ sudo yum install open-vm-tools

dla hostów VMware ESXi lub oVirt

$ sudo yum install ovirt-guest-agent

Konfigurowanie kryptografii

Przejdź do katalogu easy-rsa:

$ cd /usr/share/easy-rsa/3/

Utwórz plik zmienny:

$ sudo vim vars

następującą treść:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="[email protected]"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.ru"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652

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.

cd /usr/share/easy-rsa/3/
. ./vars
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-dh
./easyrsa gen-req myvpngw nopass
./easyrsa sign-req server myvpngw
./easyrsa gen-crl
openvpn --genkey --secret pki/ta.key

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ę.

Utwórz plik konfiguracyjny:

/etc/openvpn/ldap.conf

następującą treść

<LDAP>
        URL             "ldap://ldap.abc.ru"
        BindDN          "CN=bindUsr,CN=Users,DC=abc,DC=ru"
        Password        b1ndP@SS
        Timeout         15
        TLSEnable       no
        FollowReferrals yes
</LDAP>
<Authorization>
        BaseDN          "OU=allUsr,DC=abc,DC=ru"
        SearchFilter    "(sAMAccountName=%u)"
        RequireGroup    true
        <Group>
                BaseDN          "OU=myGrp,DC=abc,DC=ru"
                SearchFilter    "(cn=myVPNUsr)"
                MemberAttribute "member"
        </Group>
</Authorization>

Główne parametry:

  • URL „ldap://ldap.abc.ru” – adres kontrolera domeny;
  • BindDN „CN=bindUsr,CN=Users,DC=abc,DC=ru” - nazwa kanoniczna dla powiązania z LDAP (UZ - bindUsr w kontenerze abc.ru/Users);
  • Hasło b1ndP@SS — hasło użytkownika do powiązania;
  • BaseDN „OU=allUsr,DC=abc,DC=ru” — ścieżka, od której należy rozpocząć wyszukiwanie użytkownika;
  • BaseDN „OU=myGrp,DC=abc,DC=ru” – kontener grupy zezwalającej (grupa myVPNUsr w kontenerze abc.rumyGrp);
  • SearchFilter „(cn=myVPNUsr)” to nazwa grupy zezwalającej.

Uruchomienie i diagnostyka

Teraz możemy spróbować włączyć i uruchomić nasz serwer:

$ sudo systemctl enable [email protected]
$ sudo systemctl start [email protected]

Kontrola uruchomienia:

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:

$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent

Następnie włącz routing ruchu IP:

$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf

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:

$ sudo firewall-cmd --direct --get-all-rule

Przed zmianą pliku wykonaj jego kopię zapasową:

cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bak

Przybliżona zawartość pliku to:

<?xml version="1.0" encoding="utf-8"?>
<direct>
 <!--Common Remote Services-->
  <!--DNS-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o ens192 -p udp --dport 53 -j ACCEPT</rule>
  <!--web-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.200 --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.201 --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
  <!--Some Other Systems-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p udp -d 172.16.19.100 --dport 7000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
  <!--just logging-->
    <rule priority="1" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '</rule>
</direct>

Objaśnienia

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.

Stabilne połączenie!

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

Dodaj komentarz