Stanovenie úlohy
Článok popisuje organizáciu vzdialeného prístupu zamestnancov na produktoch s otvoreným zdrojovým kódom a môže byť použitý ako na vybudovanie plne autonómneho systému, tak aj na rozšírenie, keď existujúci komerčný systém zaostáva za potrebnými licenciami alebo jeho výkon nie je dostatočný.
Cieľom článku je implementovať komplexný systém poskytovania vzdialeného prístupu organizácii, čo predstavuje niečo viac ako „inštalácia OpenVPN za 10 minút“.
Výsledkom bude systém, v ktorom sa na autentifikáciu používateľov budú používať certifikáty a (voliteľne) firemný adresár Active Directory. Tým získame systém s dvojfaktorovou autentifikáciou — čo mám (certifikát) a čo viem (heslo).
Príznakom, že užívateľovi je povolené pripojenie, je jeho členstvo v skupine myVPNUsr. Na certifikáciu sa použije autonómne certifikačné centrum.
Cena implementácie riešenia — len malé hardvérové zdroje a 1 hodina práce systémového administrátora.
Budeme používať virtuálny stroj s OpenVPN a Easy-RSA 3. verzie na CentOS 7, ktorému bolo pridelených 4 vCPU a 4 GiB RAM, pričom je počítané na 100 pripojení.
V príklade je sieť našej organizácie 172.16.0.0/16, v ktorej je VPN server s adresou 172.16.19.123 umiestnený v segmente 172.16.19.0/24, DNS servery 172.16.16.16 a 172.16.17.17 a pre VPN klientov je vyhradená podsieť 172.16.20.0/23.
Na pripojenie z vonku sa používa pripojenie na porte 1194/udp a v DNS je pre náš server vytvorená A-záznam gw.abc.ru.
Kategoricky sa neodporúča vypínať SELinux! OpenVPN funguje bez vypínania bezpečnostných politík.
Obsah
Inštalácia OS a aplikačného softvéru
Používame distribúciu CentOS 7.8.2003. Potrebujeme inštaláciu OS v minimálnej konfigurácii. Je pohodlné to robiť s použitím , klonovaním predtým nainštalovaného obrazu OS a inými prostriedkami.
Po inštalácii, priradení adresy sieťovému rozhraniu (podľa podmienok úlohy 172.16.19.123), vykonáme aktualizáciu OS:
$ sudo yum update -y && reboot
Tiež je potrebné zabezpečiť, že na našej mašine prebieha synchronizácia času.
Na inštaláciu aplikačného softvéru sú potrebné balíky openvpn, openvpn-auth-ldap, easy-rsa a vim ako hlavný editor (bude potrebné repozitár EPEL).
$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim
Pre virtuálny stroj je užitočné nainštalovať hosťovského agenta:
$ sudo yum install open-vm-toolspre hostiteľov VMware ESXi alebo pre oVirt
$ sudo yum install ovirt-guest-agent
Nastavenie kryptografie
Prejdeme do adresára easy-rsa:
$ cd /usr/share/easy-rsa/3/Vytvoríme súbor premenných:
$ sudo vim varsnasledujúceho obsahu:
export KEY_COUNTRY="SK"
export KEY_PROVINCE="MojeRegion"
export KEY_CITY="MojeMesto"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="admin@abc.sk"
export KEY_CN="vsetciPouzivatelia"
export KEY_OU="vsetciPouzivatelia"
export KEY_NAME="gw.abc.sk"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652
Tu sú popísané parametre pre fiktívnu organizáciu s.r.o. „ABC“, môžete ich opraviť na skutočné alebo nechať z príkladu. Najdôležitejšia je posledná riadok určujúca dobu platnosti certifikátu v dňoch. Príklad obsahuje hodnotu 10 rokov (365*10+2 prestupné roky). Túto hodnotu bude potrebné upraviť pred vydaním certifikátov používateľov.
Ďalej nastavíme autonómne certifikačné centrum.
Nastavenie zahŕňa export premenných, inicializáciu CA, vydanie koreňových kľúčov a certifikátu CA, kľúč Diffieho-Hellmana, kľúč TLS, ako aj kľúč a certifikát servera. Kľúč certifikačného centra je potrebné starostlivo chrániť a uchovávať v tajnosti! Všetky parametre pri požiadavkách môžete nechať ako predvolené.
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
Týmto je hlavná časť nastavenia kryptografického mechanizmu ukončená.
Nastavenie OpenVPN
Prejdeme do adresára OpenVPN, vytvoríme systémové adresáre a pridá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/
Vytvoríme hlavnú konfiguračnú súbor OpenVPN:
$ sudo vim server.confnasledujúcej obsah
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
Niektoré poznámky k parametrom:
- ak bolo pri vydaní certifikátu zadané iné meno — zadajte ho;
- Adresu poolu nastavte podle svých úkolů*;
- může být jedna nebo více tras a DNS serverů;
- Poslední 2 řádky jsou potřebné pro implementaci autentizace v AD**.
*Vybraný rozsah adres v příkladu umožní současné připojení až 127 klientům, protože byla vybrána síť /23, a OpenVPN vytváří pro každého klienta podsíť s maskou /30.
V případě potřeby lze změnit port a protokol, mějte však na paměti, že změna čísla portu si vyžádá úpravu SELinuxu, a použití protokolu tcp zvýší režijní náklady, protože kontrola doručení tcp paketů již probíhá na úrovni zabalitelných paketů v tunelu.
**Pokud autentizace v AD není potřeba, zakomentujte je, následující část - přeskočte, a v šabloně odstraňte řádek auth-user-pass.
Autentifikácia v AD
Pro podporu druhého faktoru budeme používat ověřování účtu v AD.
Potřebujeme účet v doméně s právy obyčejného uživatele a skupinu, jejíž členství bude určovat možnost připojení.
Vytváříme konfigurační soubor:
/etc/openvpn/ldap.confnasledujúcej obsah
URL "ldap://ldap.abc.sk"
BindDN "CN=bindUsr,CN=Users,DC=abc,DC=sk"
Password b1ndP@SS
Timeout 15
TLSEnable no
FollowReferrals yes
BaseDN "OU=allUsr,DC=abc,DC=sk"
SearchFilter "(sAMAccountName=%u)"
RequireGroup true
BaseDN "OU=myGrp,DC=abc,DC=sk"
SearchFilter "(cn=myVPNUsr)"
MemberAttribute "member"
Hlavní parametry:
- URL „ldap://ldap.abc.sk“ — adresa řadiče domény;
- BindDN „CN=bindUsr,CN=Users,DC=abc,DC=sk“ — kanonické jméno pro připojení k LDAP (uživatel — bindUsr v kontejneru abc.sk/Users);
- Heslo b1ndP@SS — heslo uživatele pro připojení;
- BaseDN „OU=allUsr,DC=abc,DC=sk“ — cesta, od které začínáme vyhledávání uživatele;
- BaseDN „OU=myGrp,DC=abc,DC=sk“ — kontejner povolující skupinu (skupina myVPNUsr v kontejneru abc.sk/myGrp);
- SearchFilter "(cn=myVPNUsr)" — jméno povolující skupiny.
Spustenie a diagnostika
Nyní můžeme zkusit povolit a spustit náš server:
$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service
Ověření spuštění:
systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log
Vydanie a odvolanie certifikátu
Vzhledem k tomu, že kromě samotných certifikátů jsou potřeba klíče a další nastavení, je velmi pohodlné zabalit to všechno do jednoho profilu. Tento soubor je pak předán uživateli a profil se již importuje na klientovi OpenVPN. Pro to vytvoříme šablonu nastavení a skript, který generuje profil.
Do profilu je potrebné pridať obsah súborov koreňového certifikátu (ca.crt) a TLS kľúča (ta.key).
Pred vydaním certifikátov pre používateľov nezabudnite nastaviť požadovanú dobu platnosti certifikátov v súbore parametrov. Nemal by byť príliš dlhý, odporúčam obmedziť ho na maximálne 180 dní.
vim /usr/share/easy-rsa/3/vars...
export EASYRSA_CERT_EXPIRE=180
vim /usr/share/easy-rsa/3/client/template.ovpnclient
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-----
PUT YOUR CA CERT (ca.crt) HERE
-----END CERTIFICATE-----
key-direction 1
-----BEGIN OpenVPN Static key V1-----
PUT YOUR TA KEY (ta.key) HERE
-----END OpenVPN Static key V1-----
Poznámky:
- riadky PUT YOUR… meníme na obsah svojich certifikátov;
- v direktíve remote uveďte meno/adresu vášho brány;
- direktíva auth-user-pass sa používa na dodatočné externé overenie.
V domácom adresári (alebo inom pohodlnom mieste) vytvorte skript pre požiadavku certifikátu a vytvorenie 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 ~
Robíme súbor spustiteľným:
chmod a+x ~/make.profile.shA môžeme vypustiť náš prvý certifikát.
~/make.profile.sh my-first-userOdvolanie
V prípade kompromitácie certifikátu (strata, krádež) je potrebné tento certifikát odvolať:
cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl
Zobrazenie vydaných a odvolaných certifikátov
Na zobrazenie vydaných a odvolaných certifikátov stačí zobraziť indexový súbor:
cd /usr/share/easy-rsa/3/
cat pki/index.txt
Vysvetlenia:
- prvým riadkom ide certifikát servera;
- prvý symbol
- V (Valid) — platný;
- R (Revoked) — odvolaný.
Nastavenie siete
Posledné kroky — nastavenie siete prenosu — smerovania a firewallov.
Povolenie pripojení v lokálnom firewalle:
$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent
Ďalej zapneme smerovanie IP prevádzky:
$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf
V korporátnom prostredí sa určite nachádza delenie na podsiete a je potrebné oznámiť smerovaču(-om), akým spôsobom posielať pakety, adresované našim VPN klientom. V príkazovom riadku vykonajte príkaz podobne (závisí od používaného zariadenia):
# ip route 172.16.20.0 255.255.254.0 172.16.19.123a uložiť konfiguráciu.
Okrem toho na rozhraní okrajového smerovača, kde sa spravuje externá adresa gw.abc.ru, je potrebné povoliť prechod paketov udp/1194.
Ak v organizácii platia prísne bezpečnostné pravidlá, je potrebné na našom VPN serveri nastaviť aj firewall. Z môjho pohľadu poskytuje najväčšiu flexibilitu konfigurácia reťazcov iptables FORWARD, aj keď ich nastavenie je menej pohodlné. Trochu podrobnejšie o ich nastavení. Na tento účel je najlepšie použiť „priame pravidlá“ — direct rules, uložené v súbore /etc/firewalld/direct.xml. Aktuálnu konfiguráciu pravidiel môžete zistiť takto:
$ sudo firewall-cmd --direct --get-all-rulePred zmenou súboru si vytvorte jeho zálohu:
cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bakPríkladné obsah súboru je nasledujúce:
-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 '
Vysvetlenia
Vo svojej podstate sa jedná o bežné pravidlá iptables, inak zabalené po príchode firewalld.
Priradené rozhranie pri predvolenom nastavení je tun0, a vonkajšie pre tunel môže byť iné, napr. ens192, v závislosti od použitej platformy.
Posledný riadok je určený na zaznamenávanie odmietnutých paketov. Aby zaznamenávanie fungovalo, je potrebné zmeniť úroveň laditeľnosti v konfigurácii firewalld:
vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2
Aplikácia nastavení — bežný príkaz firewalld pre prečítanie nastavení:
$ sudo firewall-cmd --reloadOdmietnuté pakety môžete zobraziť takto:
grep forward_fw /var/log/messages
Čo ďalej
Týmto je nastavenie dokončené!
Je potrebné na strane klienta nainštalovať klientský softvér, importovať profil a pripojiť sa. Pre systémy Windows je distribúcia umiestnená na .
Na záver pripojíme náš nový server k systémom monitorovania a archívovania a nezabudneme pravidelne inštalovať aktualizácie.
Stabilné pripojenie!
Zdroj: habr.com
