Lépjünk át a kitűzött feladatra: írjunk egy XDP mechanizmust SYN cookie-kkal.
A cikk leírja a távoli hozzáférés megszervezését nyílt forráskódú termékeken keresztül, és felhasználható teljesen autonóm rendszerek létrehozására, vagy hasznos lehet a kereskedelmi rendszerek bővítésekor, amikor a meglévő licencből kifogyunk, vagy a teljesítmény elégtelenné válik.
A cikk célja egy befejezett távoli hozzáférési rendszer bevezetése a szervezet számára, ami kissé több, mint 'OpenVPN telepítése 10 perc alatt'.
Ennek eredményeként egy olyan rendszert kapunk, amely a felhasználók hitelesítésére tanúsítványokat és (opcionálisan) vállalati Active Directory katalógust használ. Így egy kéttényezős hitelesítési rendszert kapunk - amit birtoklok (tanúsítvány) és amit tudok (jelszó).
A felhasználó csatlakozási engedélyét jelzi, hogy tagsága van a myVPNUsr csoportban. Az önálló tanúsítvány-kibocsátó központot fogunk használni.
A megoldás bevezetésének ára csupán néhány kis hardver-erőforrás és 1 óra rendszergazda munka.
Egy virtuális gépet fogunk használni OpenVPN-nel és Easy-RSA 3-as verzióval CentOS 7-en, amely 100 csatlakozásra 4 vCPU-t és 4 GiB RAM-ot kapott.
A példában a szervezetünk hálózata 172.16.0.0/16, ahol a VPN szerver 172.16.19.123 címmel a 172.16.19.0/24 szegmensen helyezkedik el, a DNS szerverek 172.16.16.16 és 172.16.17.17, a VPN kliensek számára pedig a 172.16.20.0/23 alhálózat lett kijelölve.
Külső csatlakozáshoz a 1194/udp porton történő kapcsolatot használjuk, a DNS-ben pedig egy A rekordot hoztunk létre a szerverünkhöz: gw.abc.ru.
Határozottan nem ajánlott a SELinux letiltása! Az OpenVPN a biztonsági politikák letiltása nélkül is működik.
Tartalom
Operációs rendszer és alkalmazás szoftver telepítése
A CentOS 7.8.2003 disztribúciót használjuk. Minimalista konfigurációval szeretnénk telepíteni az operációs rendszert. Ezt kényelmesen elvégezhetnénk , az előzőleg telepített operációs rendszer képmásolásával és egyéb eszközökkel.
A telepítés után, a hálózati interfész címének beállítását (a feladatfeltételek szerint 172.16.19.123) követően frissítjük az operációs rendszert:
$ sudo yum update -y && reboot
Azt is ellenőrizni kell, hogy a gépünk időszinkronizálása meg legyen oldva.
Az alkalmazás szoftver telepítéséhez szükséges csomagok: openvpn, openvpn-auth-ldap, easy-rsa és a vim mint fő szövegszerkesztő (szükség van az EPEL tárolóra).
$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim
A virtuális gépre érdemes telepíteni a vendégügynököt:
$ sudo yum install open-vm-toolsVMware ESXi gazdákhoz, vagy oVirt-hez
$ sudo yum install ovirt-guest-agent
Kryptográfia beállítása
Lépjünk az easy-rsa könyvtárba:
$ cd /usr/share/easy-rsa/3/Létrehozzuk a változókat tartalmazó fájlt:
$ sudo vim varsa következő tartalommal:
export KEY_COUNTRY="HU"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="admin@abc.hu"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.hu"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652
Itt találhatóak a példás szervezet, az ABC Kft. paraméterei, amelyeket helyettesíthet a valós adatokkal, vagy hagyhatja a példa szerint. A legfontosabb paraméter az utolsó sor, amely meghatározza a tanúsítvány érvényességi idejét napokban. A példában 10 év (365*10+2 szökőév) került használatra. Ezt az értéket az ügyfél tanúsítványainak kiadása előtt szükséges módosítani.
Ezután beállítjuk a független tanúsítvány-kibocsátót.
A beállítás magában foglalja a változók exportálását, a PKI inicializálását, a gyökér kulcs és tanúsítvány kibocsátását, a Diffie-Hellman kulcsot, a TLS kulcsot, valamint a szerver kulcsát és tanúsítványát. A tanúsítvány-kibocsátó kulcsát gondosan meg kell őrizni és titokban kell tartani! Az összes paramétert az alapértelmezett értékeken lehet hagyni a kéréseknél.
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
Ezzel befejeződött a titkosító mechanizmus alapvető beállítása.
OpenVPN beállítása
Lépjünk az OpenVPN könyvtárba, hozzuk létre a szükséges könyvtárakat, és adjunk linket az easy-rsa-hoz:
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/
Létrehozzuk az OpenVPN alapértelmezett konfigurációs fájlját:
$ sudo vim server.confa következő tartalommal
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éhány megjegyzés a paraméterekhez:
- ha a tanúsítvány kiadásakor másik nevet adtak meg — azt tüntesse fel;
- az IP-címek tartományát a saját igényei szerint határozza meg*;
- route-ok és DNS-szerverek egy vagy több lehet;
- az utolsó 2 sor a AD** autentikációnak a megvalósításához szükséges.
*A példa tartomány, amelyet kiválasztottunk, lehetővé teszi, hogy egyszerre legfeljebb 127 kliens csatlakozzon, mivel a /23 hálózat van kiválasztva, és az OpenVPN minden klienshez egy /30 maszkkal rendelkező alhálózatot hoz létre.
Szükség esetén a port és a protokoll megváltoztatható, azonban figyelembe kell venni, hogy a port számának megváltoztatása a SELinux beállításainak módosítását vonja maga után, és a TCP protokoll használata növeli a többletköltségeket, mivel a TCP-csomagok kézbesítési ellenőrzése már a csatornába ágyazott csomagok szintjén megtörténik.
**Ha az AD hitelesítés nem szükséges, akkor kommentálja ki őket, hagyja ki a következő részt, és a sablonban törölje az auth-user-pass sort..
Hitelesítés az AD-ben
A második tényező támogatásához az AD-ben való fiók ellenőrzését fogjuk használni.
Szükségünk van egy felhasználói szintű jogokkal rendelkező domain fiókra és egy csoportra, amelynek tagsága meghatározza a csatlakozási lehetőséget.
Hozzuk létre a konfigurációs fájlt:
/etc/openvpn/ldap.confa következő tartalommal
URL "ldap://ldap.abc.hu"
BindDN "CN=bindUsr,CN=Users,DC=abc,DC=hu"
Password b1ndP@SS
Timeout 15
TLSEnable no
FollowReferrals yes
BaseDN "OU=allUsr,DC=abc,DC=hu"
SearchFilter "(sAMAccountName=%u)"
RequireGroup true
BaseDN "OU=myGrp,DC=abc,DC=hu"
SearchFilter "(cn=myVPNUsr)"
MemberAttribute "member"
Főbb paraméterek:
- URL „ldap://ldap.abc.hu” — a domainvezérlő címe;
- BindDN „CN=bindUsr,CN=Users,DC=abc,DC=hu” — a LDAP-hoz való hozzárendelés kanonikus neve (a bindUsr a abc.hu/Users konténerben);
- Password b1ndP@SS — a hozzárendeléshez szükséges felhasználói jelszó;
- BaseDN „OU=allUsr,DC=abc,DC=hu” — a felhasználói keresés kezdeti elérési útja;
- BaseDN „OU=myGrp,DC=abc,DC=hu” — az engedélyező csoport konténere (myVPNUsr csoport az abc.hu/myGrp konténerben);
- SearchFilter "(cn=myVPNUsr)" — az engedélyező csoport neve.
Indítás és diagnosztika
Most próbálkozhatunk a szerverünk engedélyezésével és elindításával:
$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service
Indítás ellenőrzése:
systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log
Tanúsítvány kiadása és visszavonása
Mivel a tanúsítványok mellett szükség van kulcsokra és egyéb beállításokra is, rendkívül kényelmes minden információt egy profilfájlba csomagolni. Ezt a fájlt ezután a felhasználónak adjuk át, és a profilt már az OpenVPN kliensben importálják. Ehhez készítünk egy beállítási sablont és egy scriptet, amely létrehozza a profilt.
A profilba bele kell illeszteni a gyökértanúsítvány (ca.crt) és a TLS kulcs (ta.key) fájlok tartalmát.
A felhasználói tanúsítványok kiadása előtt. Ne felejtsd el beállítani a tanúsítványok szükséges lejárati idejét. a paraméterfájlban. Ne állítsd túl hosszúra, ajánlom, hogy maximum 180 napig korlátozd.
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-----
Megjegyzések:
- sorok PUT YOUR… cseréljük az alábbi tartalomra saját tanúsítványainkat;
- az remote direktívában add meg a saját átjáród nevét/címét;
- az auth-user-pass direktíva külső hitelesítést használ.
A saját könyvtárban (vagy más kényelmes helyen) létrehozunk egy tanúsítványkérő és profilgeneráló szkriptet:
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 ~
A fájlt futtathatóvá tesszük:
chmod a+x ~/make.profile.shÉs kiadásra kerülhet az első tanúsítványunk.
~/make.profile.sh my-first-userVélemény
Tanúsítvány kompromittálódása (elvesztés, lopás) esetén szükséges a tanúsítvány visszavonása:
cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl
Kibocsátott és visszavont tanúsítványok megtekintése
A kibocsátott és visszavont tanúsítványok megtekintéséhez elegendő az indexfájl megtekintése:
cd /usr/share/easy-rsa/3/
cat pki/index.txt
Magyarázatok:
- az első sor a szerver tanúsítványát tartalmazza;
- az első karakter
- V (Valid) — érvényes;
- R (Revoked) — visszavonva.
Hálózat beállítása
Az utolsó lépések - a hálózati forgalom - irányítása és tűzfal beállítása.
Kapcsolatok engedélyezése a helyi tűzfalban:
$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent
Ezután engedélyezzük az IP-forgalom irányítását:
$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf
A vállalati környezetben biztosan létezik alhálózatok elválasztása, és tájékoztatni kell az útválasztót (-okat), hogyan küldje el a VPN ügyfelekhez meghatározott csomagokat. A parancssorban a következő parancsot hajtjuk végre (ez a használt hardvertől függ):
# ip route 172.16.20.0 255.255.254.0 172.16.19.123és mentjük a konfigurációt.
Ezen kívül, a határ-útválasztó interfészén, ahol a külső cím gw.abc.ru található, engedélyezni kell a udp/1194 csomagok áthaladását.
Ha a szervezetben szigorú biztonsági szabályok érvényesek, akkor a VPN szerverünkön is be kell állítani a tűzfalat. Véleményem szerint a legnagyobb rugalmasságot az iptables FORWARD láncainak beállítása nyújtja, bár ezek beállítása kevésbé kényelmes. Egy kicsit részletesebben a beállításukról. Ehhez a legegyszerűbb a "direkt szabályok" — direct rules, amelyek egy fájlban tárolódnak. /etc/firewalld/direct.xml. A hatályos szabályzatot így lehet megtudni:
$ sudo firewall-cmd --direct --get-all-ruleA fájl módosítása előtt készítsen róla biztonsági másolatot:
cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bakA fájl körülbelül a következőket tartalmazza:
-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 '
Magyarázatok
Alapvetően ezek a szokásos iptables szabályok, amelyek a firewalld megjelenése után lettek becsomagolva.
Az alapértelmezett beállításoknál a cél interfész tun0, míg a terepi interfész eltérhet, például ens192, a használt platformtól függően.
Az utolsó sor a kidobott csomagok naplózására szolgál. A naplózás működéséhez a firewalld konfigurációban meg kell változtatni a naplózási szintet:
vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2
A beállítások alkalmazása — a firewalld hagyományos parancsa a beállítások újraolvasására:
$ sudo firewall-cmd --reloadA kidobott csomagokat így lehet megtekinteni:
grep forward_fw /var/log/messages
Mi következik
Ezzel a beállítás véget ért!
Most a kliens oldalon telepíteni kell a kliens szoftvert, importálni a profilt és csatlakozni. Windows típusú operációs rendszer esetén a disztribúció a következő címen található: .
Végül csatlakoztatjuk új szerverünket a megfigyelő és archiváló rendszerekhez, és ne felejtsük el rendszeresen telepíteni a frissítéseket.
Stabil kapcsolatot!
Forrás: habr.com
