Organizace vzdálené práce ve firmě SMB pomocí OpenVPN

Formulace úkolu

Článek popisuje organizaci vzdáleného přístupu zaměstnanců pomocí produktů s otevřeným zdrojovým kódem a může být použit jak pro vytvoření plně autonomního systému, tak bude nápomocný při rozšíření, když v existujícím komerčním systému dojde k nedostatku licencí nebo když jeho výkon nebude dostatečný.

Cílem článku je implementovat kompletní systém poskytování vzdáleného přístupu organizaci, což je něco více než "instalace OpenVPN za 10 minut".

V důsledku toho získáme systém, ve kterém budou pro autentizaci uživatelů použity certifikáty a (volitelně) firemní adresář Active Directory. Tím získáme systém se dvěma faktory ověření — co mám (certifikát) a co vím (heslo).

Známkou, že uživateli bylo dovoleno se připojit, je jeho členství ve skupině myVPNUsr. Centrální certifikační autorita bude použita autonomní.

Cena implementace řešení — pouze malé hardwarové zdroje a 1 hodina práce systémového administrátora.

Budeme používat virtuální stroj s OpenVPN a Easy-RSA 3. verze na CentOS 7, který je, na základě 100 připojení, vybaven 4 vCPU a 4 GiB RAM.

V příkladu je síť naší organizace 172.16.0.0/16, ve které je VPN server s adresou 172.16.19.123 umístěn v segmentu 172.16.19.0/24, DNS servery 172.16.16.16 a 172.16.17.17, a pro VPN klienty je vyhrazena podsíť 172.16.20.0/23.

Pro připojení zvenčí se používá připojení přes port 1194/udp, a v DNS pro náš server byla vytvořena A-záznam gw.abc.ru.

Kategoricky se nedoporučuje vypínat SELinux! OpenVPN funguje bez vypnutí bezpečnostních politik.

Obsah

  1. Instalace OS a aplikačního SW
  2. Nastavení kryptografie
  3. Nastavení OpenVPN
  4. Autentizace v AD
  5. Spuštění a diagnostika
  6. Vydání a odvolání certifikátu
  7. Nastavení sítě
  8. Co dál

Instalace OS a aplikačního SW

Používáme distribuci CentOS 7.8.2003. Potřebujeme instalaci OS v minimální konfiguraci. Je praktičtější to provést pomocí kickstart, klonováním dříve nainstalovaného obrazu OS a dalšími prostředky.

Po instalaci a přiřazení adresy síťovému rozhraní (podle úkolu 172.16.19.123) provedeme aktualizaci OS:

$ sudo yum update -y && reboot

Také je nutné zajistit, aby na našem stroji probíhala synchronizace času.
Pro instalaci aplikačního SW potřebujeme balíčky openvpn, openvpn-auth-ldap, easy-rsa a vim jako hlavní editor (bude potřeba repozitář EPEL).

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

Pro virtuální stroj je užitečné nainstalovat hostitelského agenta:

$ sudo yum install open-vm-tools

pro hosty VMware ESXi, nebo pro oVirt

$ sudo yum install ovirt-guest-agent

Nastavení kryptografie

Přejdeme do adresáře easy-rsa:

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

Vytvoříme soubor proměnných:

$ sudo vim vars

následujícího obsahu:

export KEY_COUNTRY="CZ"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="admin@abc.cz"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.cz"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652

Zde jsou popsány parametry pro hypotetickou organizaci s.r.o. „ABC“, lze je opravit na skutečné nebo ponechat jako příklad. Nejdůležitější v parametrech je poslední řádek, který určuje platnost certifikátu v dnech. V příkladu je použita hodnota 10 let (365*10+2 přestupné roky). Tato hodnota bude muset být upravena před vydáním certifikátů pro uživatele.

Dále nastavujeme certifikační autoritu.

Nastavení zahrnuje export proměnných, inicializaci CA, vydání kořenového klíče a certifikátu CA, klíče Diffie-Hellmana, klíče TLS a také klíče a certifikátu serveru. Klíč certifikační autority musí být pečlivě chráněn a uchováván v tajnosti! Všechny parametry při dotazech lze ponechat ve výchozím nastavení.

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

Na tomto místě je hlavní část nastavení kryptografického mechanismu dokončena.

Nastavení OpenVPN

Přejdeme do adresáře OpenVPN, vytvoříme pracovní adresáře a přidáme odkaz na 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/

Vytvoříme hlavní konfigurační soubor OpenVPN:

$ sudo vim server.conf

následující názvu

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

Některé poznámky k parametrům:

  • pokud bylo při vydání certifikátu uvedeno jiné jméno — uveďte ho;
  • rozsah adres přizpůsobte svým potřebám*;
  • může být jeden nebo více tras a DNS serverů;
  • 2 poslední řádky jsou potřeba pro realizaci autentizace v AD**.

*Vybraný v příkladu rozsah adres umožní připojit současně až 127 klientů, protože byla vybrána síť /23, a OpenVPN vytváří pro každého klienta podsíť s maskou /30.
Při zvláštní potřebě lze port a protokol změnit, je však třeba mít na paměti, že změna čísla portu vyžaduje nastavení SELinuxu, a použití protokolu tcp zvýší režijní náklady, protože kontrola doručení tcp paketů se již provádí na úrovni zabalovaných v tunelu paketů.

**Pokud ověření v AD není potřeba, okomentujte je, další sekci — přeskočte, a v šabloně odstraňte řádek auth-user-pass.

Autentizace v AD

Pro podporu druhého faktoru budeme používat ověření účtu v AD.

Potřebujeme účet v doméně s právy běžného uživatele a skupinu, jejíž členství bude určovat možnost připojení.

Vytváříme konfigurační soubor:

/etc/openvpn/ldap.conf

následující názvu

URL             "ldap://ldap.abc.cz"
        BindDN          "CN=bindUsr,CN=Users,DC=abc,DC=cz"
        Password        b1ndP@SS
        Timeout         15
        TLSEnable       no
        FollowReferrals yes


        BaseDN          "OU=allUsr,DC=abc,DC=cz"
        SearchFilter    "(sAMAccountName=%u)"
        RequireGroup    true
        
                BaseDN          "OU=myGrp,DC=abc,DC=cz"
                SearchFilter    "(cn=myVPNUsr)"
                MemberAttribute "member"

Hlavní parametry:

  • URL „ldap://ldap.abc.cz“ — adresa řadiče domény;
  • BindDN „CN=bindUsr,CN=Users,DC=abc,DC=cz“ — kanonické jméno pro připojení k LDAP (uživatel — bindUsr v kontejneru abc.cz/Users);
  • Password b1ndP@SS — heslo uživatele pro připojení;
  • BaseDN „OU=allUsr,DC=abc,DC=cz“ — cesta, odkud začít hledat uživatele;
  • BaseDN „OU=myGrp,DC=abc,DC=cz“ — kontejner povolující skupiny (skupina myVPNUsr v kontejneru abc.cz/myGrp);
  • SearchFilter "(cn=myVPNUsr)" — název povolující skupiny.

Spuštění a diagnostika

Nyní můžeme zkusit zapnout a spustit náš server:

$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service

Kontrola spuštění:

systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Vydání a odvolání certifikátu

Protože kromě samotných certifikátů jsou potřeba klíče a ostatní nastavení, je velmi pohodlné to vše zabalit do jednoho souboru profilu. Tento soubor se poté předá uživateli a profil se už importuje na klientovi OpenVPN. K tomu vytvoříme šablonu nastavení a skript, který profil utváří.

Do profilu je třeba přidat obsah souborů kořenového certifikátu (ca.crt) a TLS klíče (ta.key).

Před vydáním certifikátů uživatelů nezapomeňte nastavit požadovanou platnost certifikátů v konfiguračním souboru. Není třeba jej dělat příliš velkým, doporučuji omezit se na maximálně 180 dní.

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


-----BEGIN CERTIFICATE-----
VLOŽTE SVŮJ CA CERT (ca.crt) SEM
-----END CERTIFICATE-----


key-direction 1

-----BEGIN OpenVPN Static key V1-----
VLOŽTE SVŮJ TA KLÍČ (ta.key) SEM
-----END OpenVPN Static key V1-----

Poznámky:

  • řádky VLOŽTE SVŮJ… měníme na obsah svých certifikátů;
  • v direktivě remote uveďte název/adresu svého brány;
  • direktiva auth-user-pass se používá pro dodatečnou externí autentizaci.

V domácím adresáři (nebo jiném vhodném místě) vytvořte skript pro požadavek certifikátu a vytvoření 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 ~

Učiníme soubor spustitelným:

chmod a+x ~/make.profile.sh

A můžeme vydat náš první certifikát.

~/make.profile.sh my-first-user

Odvolání

V případě kompromitace certifikátu (ztráta, krádež) je nutné tento certifikát odvolat:

cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl

Zobrazení vydaných a odvolaných certifikátů

Pro zobrazení vydaných a odvolaných certifikátů stačí prohlédnout indexový soubor:

cd /usr/share/easy-rsa/3/
cat pki/index.txt

Vysvětlení:

  • první řádek obsahuje certifikát serveru;
  • první znak
    • V (Valid) — platný;
    • R (Revoked) — odvolaný.

Nastavení sítě

Poslední kroky — nastavení sítě, směrování a firewallů.

Povolení připojení v lokálním firewallu:

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

Dále zapněte směrování IP provozu:

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

V korporátní sféře jistě existuje dělení na podsítě a my musíme říct směrovačům, jak mají směrovat pakety určené našim VPN klientům. V příkazovém řádku vyvolejte příkaz ve stylu (závisí na používaném zařízení):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

a uložíme konfiguraci.

Kromě toho na rozhraní okrajového směrovače, kde je spravována externí adresa gw.abc.ru, je třeba povolit průchod paketů udp/1194.

Pokud ve vaší organizaci platí přísná bezpečnostní pravidla, je také nutné nastavit firewall na našem VPN serveru. Podle mého názoru poskytuje největší flexibilitu konfigurace řetězců iptables FORWARD, i když jejich nastavení je méně pohodlné. O jejich nastavení trochu podrobněji. Nejlépe je k tomu použít "přímá pravidla" — direct rules, uložená v souboru /etc/firewalld/direct.xml. Aktuální konfiguraci pravidel lze zjistit takto:

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

Před změnou souboru si udělejte jeho zálohu:

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

Přibližný obsah souboru je následující:


  
    -i tun0 -o ens192 -p udp --dport 53 -j ACCEPT
  
    -i tun0 -o eth0 -p tcp -d 172.16.19.200 --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
    -i tun0 -o eth0 -p tcp -d 172.16.19.201 --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
  
    -i tun0 -o eth0 -p udp -d 172.16.19.100 --dport 7000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
  
    -i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '

Vysvětlení

Jedná se v podstatě o obvyklá pravidla iptables, jinak zabalena po vzniku firewalld.

Cílový rozhraní v nastavení podle výchozího nastavení je tun0, a externí pro tunel může být jiné, např. ens192, v závislosti na použité platformě.

Poslední řádek je určen pro protokolování odhozených paketů. Aby protokolování fungovalo, je třeba v konfiguraci firewalld změnit úroveň ladění:

vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2

Použití nastavení — obvyklý příkaz firewalld pro přečtení nastavení znovu:

$ sudo firewall-cmd --reload

Odhozené pakety je možné zobrazit takto:

grep forward_fw /var/log/messages

Co dál

Tím je nastavení ukončeno!

Zbývá na straně klienta nainstalovat klientský software, importovat profil a připojit se. Pro operační systémy typu Windows je distribuce umístěna na webových stránkách vývojáře.

Na závěr připojíme náš nový server k monitorovacím a archivačním systémům, a nezapomeneme pravidelně instalovat aktualizace.

Stabilní připojení!

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster