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
