Problemstellung
Der Artikel beschreibt die Organisation des Remote-Zugriffs für Mitarbeiter mit Open-Source-Produkten und kann sowohl für den Aufbau eines vollständig autonomen Systems als auch zur Erweiterung genutzt werden, wenn in einem bestehenden kommerziellen System Lizenzengpässe oder unzureichende Leistung auftreten.
Ziel des Artikels ist es, ein umfassendes System für den Remote-Zugriff in der Organisation einzuführen, das mehr ist als nur "OpenVPN in 10 Minuten installieren".
Das Ergebnis wird ein System sein, das Zertifikate für die Benutzerauthentifizierung und (optional) ein unternehmensweites Active Directory nutzt. Damit erhalten wir ein Zwei-Faktor-Authentifizierungssystem — was ich habe (Zertifikat) und was ich weiß (Passwort).
Ein Zeichen dafür, dass einem Benutzer der Zugriff gestattet ist, ist seine Mitgliedschaft in der Gruppe myVPNUsr. Die Zertifizierungsstelle wird autonom verwendet.
Die Kosten für die Implementierung der Lösung bestehen lediglich aus geringen Hardware-Ressourcen und 1 Stunde Arbeitszeit eines Systemadministrators.
Wir werden eine virtuelle Maschine mit OpenVPN und Easy-RSA der dritten Version auf CentOS 7 einsetzen, die mit 4 vCPU und 4 GiB RAM für bis zu 100 Verbindungen ausgelegt ist.
In unserem Beispiel hat das Netzwerk unserer Organisation die IP 172.16.0.0/16, wobei der VPN-Server mit der Adresse 172.16.19.123 im Segment 172.16.19.0/24 liegt. Die DNS-Server sind 172.16.16.16 und 172.16.17.17, und für die VPN-Clients wurde das Subnetz 172.16.20.0/23 zugewiesen.
Für externe Verbindungen wird der Port 1194/udp verwendet, und im DNS für unseren Server wurde ein A-Eintrag gw.abc.ru erstellt.
Es wird dringend davon abgeraten, SELinux zu deaktivieren! OpenVPN funktioniert ohne eine 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. Dies lässt sich bequem mit , einer Klonierung eines bereits installierten Betriebssystem-Images und anderen Mitteln durchführen.
Nach der Installation und der Adresszuweisung an das Netzwerkinterface (laut Vorgabe 172.16.19.123) führen wir ein Update des Betriebssystems durch:
$ sudo yum update -y && reboot
Es muss auch sichergestellt werden, dass auf unserer Maschine eine Zeit-Synchronisierung ausgeführt wird.
Für die Installation der Anwendungssoftware werden die Pakete openvpn, openvpn-auth-ldap, easy-rsa und vim als Haupteditor benötigt (EPEL-Repository erforderlich).
$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim
Für die virtuelle Maschine ist es sinnvoll, den Gast-Agenten 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
Wechseln Sie in das Verzeichnis easy-rsa:
$ cd /usr/share/easy-rsa/3/Erstellen Sie die Variablen-Datei:
$ sudo vim varskubectl-img
export KEY_COUNTRY="DE"
export KEY_PROVINCE="MeinBundesland"
export KEY_CITY="MeinOrt"
export KEY_ORG="ABC GmbH"
export KEY_EMAIL="admin@abc.de"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.de"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3650
Hier sind die Parameter für die fiktive Organisation GmbH 'ABC' beschrieben. Sie können sie durch echte Daten ersetzen oder als Beispiel belassen. Das Wichtigste in den Parametern ist die letzte Zeile, die die Gültigkeit des Zertifikats in Tagen definiert. Im Beispiel wurde ein Wert von 10 Jahren verwendet (365*10+2 Schaltjahre). Dieser Wert muss vor der Ausstellung der Benutzertickets angepasst werden.
Als nächstes konfigurieren wir die eigenständige Zertifizierungsstelle.
Die Konfiguration umfasst den Export von Variablen, die Initialisierung der CA, die Erstellung des privaten Schlüssels und des Zertifikats der CA, den Diffie-Hellman-Schlüssel, den TLS-Schlüssel sowie den Schlüssel und das Zertifikat des Servers. Der private Schlüssel der Zertifizierungsstelle muss sorgfältig geschützt und geheim gehalten werden! Alle Parameter bei Anfragen können auf Standardwerte 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
Damit ist der Hauptteil der Konfiguration des kryptografischen Mechanismus abgeschlossen.
Einrichtung 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/
Erstellen Sie 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 bitte an;
- Der Adresspool sollte auf Ihre Anforderungen abgestimmt sein*;
- Es können ein oder mehrere Routen und DNS-Server definiert werden;
- Die letzten 2 Zeilen sind zur Umsetzung der Authentifizierung in AD** erforderlich.
*Der in diesem 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 Subnetz mit der Maske /30 erstellt.
Bei besonderem Bedarf können Port und Protokoll geändert werden. Beachten Sie jedoch, dass eine Änderung der Portnummer eine Anpassung von SELinux erfordert und die Verwendung des Protokolls TCP zusätzliche Overhead-Kosten mit sich bringt, da die Zustellung von TCP-Paketen bereits auf der Ebene der im Tunnel eingekapselten Pakete kontrolliert wird.
**Wenn die Authentifizierung in AD nicht erforderlich ist, kommentieren Sie diese aus und überspringen Sie den folgenden Abschnitt im Template. Entfernen Sie die Zeile auth-user-pass..
Authentifizierung im AD
Für die Unterstützung des zweiten Faktors verwenden wir die Überprüfung des Kontos in AD.
Wir benötigen ein Konto im Domänen-Netzwerk mit Benutzerrechten und eine Gruppe, deren Mitgliedschaft die Möglichkeit der Verbindung bestimmt.
Erstellen Sie 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"
Wesentliche Parameter:
- URL „ldap://ldap.abc.ru“ – die Adresse des Domänencontrollers;
- BindDN «CN=bindUsr,CN=Users,DC=abc,DC=de» — der kanonische Name zur Bindung an LDAP (Benutzer — bindUsr im Container abc.de/Users);
- Passwort b1ndP@SS — das Benutzerpasswort für die Bindung;
- BaseDN «OU=allUsr,DC=abc,DC=de» — der Pfad, von dem aus die Benutzersuche beginnt;
- BaseDN «OU=myGrp,DC=abc,DC=de» — der Container der Berechtigungsgruppe (Gruppe myVPNUsr im Container abc.de/myGrp);
- Suchfilter "(cn=myVPNUsr)" — der Name der Berechtigungsgruppe.
Start und Diagnostik
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, alles in einer Profil-Datei zu bündeln. Diese Datei wird dann an den Benutzer übergeben und das Profil wird auf dem OpenVPN-Client importiert. Dazu erstellen wir eine Vorlageneinstellung und ein Skript, das das Profil generiert.
In das Profil müssen die Inhalte der Dateien des Root-Zertifikats (ca.crt) und des TLS-Schlüssels (ta.key) eingefügt werden.
Vor der Ausstellung der Benutzersignierungen vergessen Sie nicht, die erforderliche Gültigkeitsdauer der Zertifikate in der Parameterdatei festzulegen. Sie sollte nicht zu lang sein, 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-----
HIER IHREN CA-ZERTIFIKAT (ca.crt) EINFÜGEN
-----END CERTIFICATE-----
key-direction 1
-----BEGIN OpenVPN Static key V1-----
HIER IHREN TA-SCHLÜSSEL (ta.key) EINFÜGEN
-----END OpenVPN Static key V1-----
Hinweise:
- Zeilen HIER IHREN… ändern zu Inhalt ihrer Zertifikate;
- Geben Sie in der Direktive remote den Namen/ die Adresse Ihres Gateways an;
- Die Direktive auth-user-pass wird für zusätzliche externe Authentifizierung verwendet.
Im Home-Verzeichnis (oder 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 ~
Machen Sie die Datei ausführbar:
chmod a+x ~/make.profile.shUnd wir können unser erstes Zertifikat ausstellen.
~/make.profile.sh mein-erster-nutzerBewertung
Im Falle einer Kompromittierung des Zertifikats (Verlust, Diebstahl) muss dieses Zertifikat widerrufen werden:
cd /usr/share/easy-rsa/3/
./easyrsa revoke mein-erster-nutzer
./easyrsa gen-crl
Überprüfung ausgestellter und widerrufener Zertifikate
Um die ausgestellten und widerrufenen Zertifikate zu überprüfen, reicht es, die Indexpdatei anzusehen:
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
Letzte Schritte – Einrichtung des Netzwerkverkehrs – Routing und Firewalls.
Erlauben von Verbindungen in der lokalen Firewall:
$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent
Als nächstes aktivieren wir das IP-Traffic-Routing:
$ 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 dem Router (-n) mitteilen, wie Pakete, die an unsere VPN-Clients gerichtet sind, gesendet werden sollen. In der Befehlszeile führen wir den Befehl ähnlich wie folgt aus (abhängig von der verwendeten Hardware):
# ip route 172.16.20.0 255.255.254.0 172.16.19.123und speichern die Konfiguration.
Darüber hinaus muss am Interface des Grenzrouters, das die externe Adresse gw.abc.ru bedient, das Durchlassen von Paketen udp/1194 erlaubt werden.
Sollten in der Organisation strenge Sicherheitsrichtlinien herrschen, ist es erforderlich, auch die Firewall auf unserem VPN-Server zu konfigurieren. Meiner Meinung nach bietet die Einrichtung von iptables-Forward-Ketten die größte Flexibilität, auch wenn deren Konfiguration weniger komfortabel ist. Etwas detaillierter zur Einrichtung: Am besten verwendet man „direkte Regeln“ – direct rules, die in einer Datei gespeichert sind. /etc/firewalld/direct.xmlDie aktive Regelkonfiguration kann wie folgt abgerufen werden:
$ sudo firewall-cmd --direct --get-all-ruleVor der Änderung der Datei sollten Sie eine Sicherungskopie erstellen:
cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bakDer Inhalt der Datei sieht ungefähr 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 '
Erklärungen
Im Grunde genommen handelt es sich um gewöhnliche iptables-Regeln, die nach der Einführung von firewalld verpackt sind.
Das Zielinterface ist mit den Standardeinstellungen tun0, während das externe Tunnelinterface je nach verwendeter Plattform unterschiedlich sein kann, z.B. ens192.
Die letzte Zeile dient der Protokollierung abgewiesener Pakete. Damit die Protokollierung funktioniert, muss das Debugging-Level in der firewalld-Konfiguration geändert werden:
vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2
Die Anwendung der Einstellungen erfolgt mit dem folgenden Standardbefehl von firewalld zum Neulesen der Konfiguration:
$ sudo firewall-cmd --reloadAbgewiesene Pakete können so angezeigt werden:
grep forward_fw /var/log/messages
Was kommt als Nächstes
Die Konfiguration ist damit abgeschlossen!
Nun muss auf der Client-Seite die Client-Software installiert, das Profil importiert und eine Verbindung hergestellt werden. Für Windows-Systeme steht das Paket zur Verfügung unter .
Zum Schluss verbinden wir unseren neuen Server mit den Überwachungs- und Archivierungssystemen und vergessen nicht, regelmäßig Updates zu installieren.
Stabile Verbindung!
Quelle: habr.com
