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
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í , 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-toolspro 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 varsná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.confná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.confná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.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-----
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.shA můžeme vydat náš první certifikát.
~/make.profile.sh my-first-userOdvolá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.123a 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-rulePřed změnou souboru si udělejte jeho zálohu:
cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bakPř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 --reloadOdhozené 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 .
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
