Aufgabenstellung
Der Artikel beschreibt die Organisation des Remote-Zugriffs fĂŒr Mitarbeiter mit Produkten mit offener Quellcode und kann sowohl fĂŒr den Aufbau eines vollstĂ€ndig autonomen Systems als auch zur Erweiterung nĂŒtzlich sein, wenn in einem bestehenden kommerziellen System Lizenzen fehlen oder die Leistung unzureichend ist.
Ziel des Artikels ist es, ein vollstĂ€ndiges System zur Bereitstellung des Remote-Zugriffs fĂŒr die Organisation zu implementieren, was etwas mehr ist als "OpenVPN in 10 Minuten installieren".
Infolgedessen erhalten wir ein System, in dem Zertifikate und (optional) das Unternehmensverzeichnis Active Directory zur Authentifizierung der Benutzer verwendet werden. Somit haben wir ein System mit zwei Faktoren der ĂberprĂŒfung â was ich habe (Zertifikat) und was ich weiĂ (Passwort).
Ein Zeichen dafĂŒr, dass ein Benutzer sich verbinden darf, ist seine Mitgliedschaft in der Gruppe myVPNUsr. Die Zertifizierungsstelle wird im autonomen Modus verwendet.
Die Implementierungskosten der Lösung belaufen sich nur auf geringe Hardware-Ressourcen und 1 Stunde Arbeit eines Systemadministrators.
Wir verwenden eine virtuelle Maschine mit OpenVPN und Easy-RSA der 3. Version auf CentOS 7, die fĂŒr 100 Verbindungen mit 4 vCPU und 4 GiB RAM ausgestattet ist.
Im Beispiel hat unser Netzwerk die Adresse 172.16.0.0/16, in dem der VPN-Server mit der Adresse 172.16.19.123 im Segment 172.16.19.0/24 liegt, die DNS-Server 172.16.16.16 und 172.16.17.17 sind und fĂŒr die VPN-Clients das Subnetz 172.16.20.0/23 reserviert ist.
FĂŒr externe Verbindungen wird der Port 1194/udp verwendet, und im DNS wurde fĂŒr unseren Server ein A-Eintrag gw.abc.ru erstellt.
Es wird dringend davon abgeraten, SELinux zu deaktivieren! OpenVPN funktioniert ohne Deaktivierung der Sicherheitsrichtlinien.
Inhalt
Installation des Betriebssystems und der Anwendungssoftware
Wir verwenden die Distribution CentOS 7.8.2003. Wir benötigen eine Installation des Betriebssystems in minimaler Konfiguration. Es ist praktisch, dies mit Hilfe von , dem Klonen eines zuvor installierten Betriebssystem-Images und anderen Mitteln zu tun.
Nach der Installation und der Zuweisung einer Adresse an das Netzwerkinterface (nach den Vorgaben 172.16.19.123) fĂŒhren wir ein Update des Betriebssystems durch:
$ sudo yum update -y && reboot
Es ist auch notwendig, sicherzustellen, dass auf unserer Maschine eine Zeitsynchronisation ausgefĂŒhrt wird.
FĂŒr die Installation von Anwendungssoftware werden die Pakete openvpn, openvpn-auth-ldap, easy-rsa und vim als Haupteditor benötigt (das EPEL-Repository ist erforderlich).
$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim
FĂŒr die virtuelle Maschine ist es nĂŒtzlich, den Gastagenten zu installieren:
$ sudo yum install open-vm-toolsfĂŒr VMware ESXi-Hosts oder fĂŒr oVirt
$ sudo yum install ovirt-guest-agent
Konfiguration der Kryptografie
Wir wechseln in das Verzeichnis easy-rsa:
$ cd /usr/share/easy-rsa/3/Wir erstellen die Datei mit den Variablen:
$ sudo vim varsdes folgenden Inhalts:
export KEY_COUNTRY="RU"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="admin@abc.ru"
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
Hier sind die Parameter fĂŒr das hypothetische Unternehmen LLC âABCâ beschrieben, die Sie auf echte Parameter Ă€ndern oder aus dem Beispiel beibehalten können. Das Wichtigste bei den Parametern ist die letzte Zeile, die die GĂŒltigkeitsdauer des Zertifikats in Tagen festlegt. Im Beispiel wurde ein Wert von 10 Jahren verwendet (365*10+2 Schaltjahre). Dieser Wert muss vor der Ausstellung der Benutzersertifikate angepasst werden.
Als nÀchstes konfigurieren wir die eigenstÀndige Zertifizierungsstelle.
Die Konfiguration umfasst das Exportieren von Variablen, die Initialisierung der CA, die Ausstellung des Wurzelzertifikats und des CA-Zertifikats, den Diffie-Hellman-SchlĂŒssel, den TLS-SchlĂŒssel sowie den SchlĂŒssel und das Zertifikat fĂŒr den Server. Der SchlĂŒssel der Zertifizierungsstelle muss sorgfĂ€ltig geschĂŒtzt und geheim gehalten werden! Alle Parameter bei den Anfragen können auf den Standardwerten belassen werden.
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
An dieser Stelle ist der Hauptteil der Konfiguration des kryptografischen Mechanismus abgeschlossen.
Konfiguration von OpenVPN
Wir wechseln in das OpenVPN-Verzeichnis, erstellen die Dienstverzeichnisse und fĂŒgen einen Link zu easy-rsa hinzu:
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/
Wir erstellen die Hauptkonfigurationsdatei fĂŒr OpenVPN:
$ sudo vim server.confmit folgendem Inhalt
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
Einige Anmerkungen zu den Parametern:
- wenn bei der Ausstellung des Zertifikats ein anderer Name angegeben wurde â geben Sie diesen an;
- Geben Sie die Adressbereiche entsprechend Ihren Aufgaben an*;
- Es kann eine oder mehrere Routen und DNS-Server geben;
- Die letzten 2 Zeilen sind fĂŒr die Implementierung der Authentifizierung in AD** erforderlich.
*Der im Beispiel gewĂ€hlte Adressbereich ermöglicht es, bis zu 127 Clients gleichzeitig zu verbinden, da ein /23-Netzwerk gewĂ€hlt wurde und OpenVPN fĂŒr jeden Client ein /30-Subnetz erstellt.
Bei besonderem Bedarf können Port und Protokoll geĂ€ndert werden, jedoch sollte beachtet werden, dass eine Ănderung des Portnamens die Konfiguration von SELinux erforderlich macht und die Verwendung des TCP-Protokolls die Overheads erhöht, da die Kontrolle der Lieferung von TCP-Paketen bereits auf der Ebene der eingekapselten Tunnelpakete erfolgt.
**Wenn die Authentifizierung in AD nicht benötigt wird, kommentieren Sie diese aus, ĂŒberspringen Sie den nĂ€chsten Abschnitt und entfernen Sie in der Vorlage die Zeile auth-user-pass.
Authentifizierung in AD
FĂŒr die UnterstĂŒtzung der zweiten Stufe werden wir die ĂberprĂŒfung des Kontos in AD verwenden.
Wir benötigen ein Konto in der DomÀne mit den Rechten eines Standardbenutzers und eine Gruppe, deren Mitgliedschaft die Verbindungsmöglichkeit bestimmt.
Wir erstellen die Konfigurationsdatei:
/etc/openvpn/ldap.confmit folgendem Inhalt
URL "ldap://ldap.abc.ru"
BindDN "CN=bindUsr,CN=Users,DC=abc,DC=ru"
Password b1ndP@SS
Timeout 15
TLSEnable no
FollowReferrals yes
BaseDN "OU=allUsr,DC=abc,DC=ru"
SearchFilter "(sAMAccountName=%u)"
RequireGroup true
BaseDN "OU=myGrp,DC=abc,DC=ru"
SearchFilter "(cn=myVPNUsr)"
MemberAttribute "member"
Hauptparameter:
- URL âldap://ldap.abc.ruâ â Adresse des DomĂ€nencontrollers;
- BindDN âCN=bindUsr,CN=Users,DC=abc,DC=ruâ â kanonischer Name fĂŒr die Bindung an LDAP (UZN â bindUsr im Container abc.ru/Users);
- Password b1ndP@SS â Benutzerpasswort fĂŒr die Bindung;
- BaseDN âOU=allUsr,DC=abc,DC=ruâ â Pfad, von dem aus die Benutzersuche beginnt;
- BaseDN âOU=myGrp,DC=abc,DC=ruâ â Container der autorisierenden Gruppe (Gruppe myVPNUsr im Container abc.ru/myGrp);
- SearchFilter "(cn=myVPNUsr)" â Name der autorisierenden Gruppe.
Start und Diagnose
Jetzt können wir versuchen, unseren Server zu aktivieren und zu starten:
$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service
ĂberprĂŒfung des Starts:
systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log
Ausstellung und Widerruf des Zertifikats
Da neben den Zertifikaten auch SchlĂŒssel und andere Einstellungen erforderlich sind, ist es sehr praktisch, all dies in einer Profildatei zu bĂŒndeln. Diese Datei wird dann an den Benutzer weitergegeben und das Profil wird bereits auf dem OpenVPN-Client importiert. Zu diesem Zweck erstellen wir eine Vorlage fĂŒr die Einstellungen und ein Skript, das das Profil erstellt.
FĂŒgen Sie den Inhalt der Root-Zertifikatsdateien (ca.crt) und den TLS-SchlĂŒssel (ta.key) in das Profil ein.
Vor der Ausgabe von Benutzersertifikaten vergessen Sie nicht, die erforderliche GĂŒltigkeitsdauer der Zertifikate festzulegen in der Parameterdatei. Machen Sie sie nicht zu groĂ, ich empfehle, sie auf maximal 180 Tage zu beschrĂ€nken.
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-----
Hinweise:
- Zeilen PUT YOUR⊠Àndern wir in den Inhalt unserer Zertifikate;
- geben Sie im remote-Befehl den Namen/Adresse Ihres Gateways an;
- die auth-user-pass-Direktive wird fĂŒr zusĂ€tzliche externe Authentifizierung verwendet.
Im Home-Verzeichnis (oder an einem anderen geeigneten Ort) erstellen wir ein Skript zur Anforderung des Zertifikats und zur Erstellung des Profils:
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 ~
Wir machen die Datei ausfĂŒhrbar:
chmod a+x ~/make.profile.shUnd wir können unser erstes Zertifikat ausstellen.
~/make.profile.sh my-first-userWiderruf
Im Falle einer Kompromittierung des Zertifikats (Verlust, Diebstahl) muss dieses Zertifikat widerrufen werden:
cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl
Anzeigen der ausgegebenen und widerrufenen Zertifikate
Um die ausgegebenen und widerrufenen Zertifikate anzuzeigen, reicht es aus, die Indexdatei zu betrachten:
cd /usr/share/easy-rsa/3/
cat pki/index.txt
ErlÀuterungen:
- In der ersten Zeile steht das Serverzertifikat;
- Das erste Zeichen
- V (Valid) â gĂŒltig;
- R (Revoked) â widerrufen.
Netzwerkkonfiguration
Die letzten Schritte â die Konfiguration des Ăbertragungsnetzes â Routing und Firewalls.
Erlauben von Verbindungen in der lokalen Firewall:
$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent
Dann aktivieren wir das IP-Tracking:
$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf
In einer Unternehmensumgebung gibt es sicherlich eine Unterteilung in Subnetze, und wir mĂŒssen den Router(n) mitteilen, wie er Pakete, die an unsere VPN-Clients gerichtet sind, versenden soll. Geben Sie im Terminal einen Befehl ein, der von der verwendeten Hardware abhĂ€ngt:
# ip route 172.16.20.0 255.255.254.0 172.16.19.123und speichern die Konfiguration.
DarĂŒber hinaus muss am Interface des externen Routers, der die Adresse gw.abc.ru bedient, der UDP-Datenfluss ĂŒber 1194 erlaubt werden.
Falls in der Organisation strenge Sicherheitsrichtlinien gelten, muss die Firewall auch auf unserem VPN-Server konfiguriert werden. Meiner Meinung nach bietet die Konfiguration der iptables FORWARD-Ketten die gröĂte FlexibilitĂ€t, auch wenn die Bedienung weniger komfortabel ist. Etwas genauer zur Konfiguration. Am praktischsten ist es, "direkte Regeln" - direct rules - zu verwenden, die in einer Datei gespeichert werden. /etc/firewalld/direct.xml. Die aktuelle Regelkonfiguration kann wie folgt abgerufen werden:
$ sudo firewall-cmd --direct --get-all-ruleVor der Ănderung der Datei machen Sie bitte eine Sicherungskopie:
cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bakDer ungefÀhre Inhalt der Datei sieht so aus:
-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 '
ErlÀuterungen
Im Grunde handelt es sich um gewöhnliche iptables-Regeln, die anders verpackt wurden nach der EinfĂŒhrung von firewalld.
Das Ziel-Interface bei den Standardeinstellungen ist tun0, und das externe fĂŒr das Tunnel kann anders sein, z. B. ens192, abhĂ€ngig von der verwendeten Plattform.
Die letzte Zeile dient der Protokollierung von verworfenen Paketen. Damit das Logging funktioniert, muss der Debug-Level in der firewalld-Konfiguration geÀndert werden:
vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2
Das Anwenden der Einstellungen â ein gewöhnlicher Befehl von firewalld zum Neuladen der Einstellungen:
$ sudo firewall-cmd --reloadVerworfene Pakete können so eingesehen werden:
grep forward_fw /var/log/messages
Was kommt als nÀchstes
Damit ist die Konfiguration abgeschlossen!
Es bleibt lediglich, die Client-Software auf der Client-Seite zu installieren, das Profil zu importieren und sich zu verbinden. FĂŒr Windows-Betriebssysteme ist das Paket verfĂŒgbar unter .
Zum Abschluss verbinden wir unseren neuen Server mit den Ăberwachungs- und Archivierungssystemen und vergessen nicht, regelmĂ€Ăig Updates durchzufĂŒhren.
Stabile Verbindung!
Quelle: habr.com
