Organisation der Remote-Arbeit einer KMU-Organisation auf OpenVPN

Formulierung des Problems

Der Artikel beschreibt die Organisation des Fernzugriffs für Mitarbeiter auf Open-Source-Produkte und kann sowohl zum Aufbau eines völlig autonomen Systems als auch zur Erweiterung verwendet werden, wenn Lizenzmangel im bestehenden kommerziellen System besteht oder dessen Leistung nicht ausreicht.

Das Ziel des Artikels besteht darin, ein vollständiges System zur Bereitstellung des Fernzugriffs für eine Organisation zu implementieren, was kaum mehr als „die Installation von OpenVPN in 10 Minuten“ bedeutet.

Als Ergebnis erhalten wir ein System, in dem Zertifikate und (optional) das Unternehmens-Active Directory zur Authentifizierung von Benutzern verwendet werden. Das. Wir erhalten ein System mit zwei Verifizierungsfaktoren – was ich habe (Zertifikat) und was ich weiß (Passwort).

Ein Zeichen dafür, dass ein Benutzer eine Verbindung herstellen darf, ist seine Mitgliedschaft in der myVPNUsr-Gruppe. Die Zertifizierungsstelle wird offline verwendet.

Die Kosten für die Implementierung der Lösung betragen nur geringe Hardwareressourcen und 1 Stunde Arbeit des Systemadministrators.

Wir werden eine virtuelle Maschine mit OpenVPN und Easy-RSA Version 3 auf CetntOS 7 verwenden, der 100 vCPUs und 4 GiB RAM pro 4 Verbindungen zugewiesen werden.

Im Beispiel ist das Netzwerk unserer Organisation 172.16.0.0/16, wobei sich der VPN-Server mit der Adresse 172.16.19.123 im Segment 172.16.19.0/24 befindet, die DNS-Server 172.16.16.16 und 172.16.17.17 und das Subnetz 172.16.20.0 .23/XNUMX ist für VPN-Clients reserviert.

Für die Verbindung von außen wird eine Verbindung über 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 von Sicherheitsrichtlinien.

Inhalt

  1. Installation von Betriebssystem und Anwendungssoftware
  2. Kryptographie einrichten
  3. OpenVPN einrichten
  4. AD-Authentifizierung
  5. Inbetriebnahme und Diagnose
  6. Ausstellung und Widerruf von Zertifikaten
  7. Netzwerkkonfiguration
  8. Was weiter

Installation von Betriebssystem und Anwendungssoftware

Wir verwenden die CentOS 7.8.2003-Distribution. Wir müssen das Betriebssystem in einer Minimalkonfiguration installieren. Es ist bequem, dies mit zu tun Kickstart, Klonen eines zuvor installierten Betriebssystem-Images und andere Mittel.

Nach der Installation aktualisieren wir das Betriebssystem, indem wir der Netzwerkschnittstelle eine Adresse zuweisen (gemäß den Bedingungen der Aufgabe 172.16.19.123):

$ sudo yum update -y && reboot

Wir müssen auch sicherstellen, dass auf unserem Computer eine Zeitsynchronisierung durchgeführt wird.
Um Anwendungssoftware zu installieren, benötigen Sie die Pakete openvpn, openvpn-auth-ldap, easy-rsa und vim als Haupteditor (Sie benötigen das EPEL-Repository).

$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim

Es ist sinnvoll, einen Gastagenten für eine virtuelle Maschine zu installieren:

$ sudo yum install open-vm-tools

für VMware ESXi-Hosts oder für oVirt

$ sudo yum install ovirt-guest-agent

Kryptographie einrichten

Gehen Sie in das easy-rsa-Verzeichnis:

$ cd /usr/share/easy-rsa/3/

Erstellen Sie eine Variablendatei:

$ sudo vim vars

wie folgt:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="[email protected]"
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

Die Parameter für die bedingte Organisation ABC LLC werden hier beschrieben; Sie können sie auf die tatsächlichen Werte korrigieren oder sie aus dem Beispiel übernehmen. Das Wichtigste bei den Parametern ist die letzte Zeile, die die Gültigkeitsdauer des Zertifikats in Tagen festlegt. Das Beispiel verwendet den Wert 10 Jahre (365*10+2 Schaltjahre). Dieser Wert muss angepasst werden, bevor Benutzerzertifikate ausgestellt werden.

Als nächstes konfigurieren wir eine autonome Zertifizierungsstelle.

Das Setup umfasst den Export von Variablen, die Initialisierung der Zertifizierungsstelle, die Ausgabe des CA-Root-Schlüssels und -Zertifikats, des Diffie-Hellman-Schlüssels, des TLS-Schlüssels sowie des Serverschlüssels und -zertifikats. Der CA-Schlüssel muss sorgfältig geschützt und geheim gehalten werden! Alle Abfrageparameter können als Standard 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 Einrichtung des kryptografischen Mechanismus abgeschlossen.

OpenVPN einrichten

Gehen Sie in das OpenVPN-Verzeichnis, erstellen Sie Dienstverzeichnisse und fügen Sie 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 von OpenVPN:

$ sudo vim server.conf

den folgenden 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 Hinweise zu den Parametern:

  • Wenn bei der Ausstellung des Zertifikats ein anderer Name angegeben wurde, geben Sie diesen an.
  • Geben Sie den für Ihre Aufgaben geeigneten Adresspool an*;
  • es kann eine oder mehrere Routen und DNS-Server geben;
  • Die letzten beiden Zeilen werden benötigt, um die Authentifizierung in AD** zu implementieren.

*Der im Beispiel ausgewählte Adressbereich ermöglicht die gleichzeitige Verbindung von bis zu 127 Clients, weil Das /23-Netzwerk ist ausgewählt und OpenVPN erstellt für jeden Client ein Subnetz unter Verwendung der /30-Maske.
Bei besonderem Bedarf können der Port und das Protokoll geändert werden. Beachten Sie jedoch, dass eine Änderung der Port-Portnummer eine Konfiguration von SELinux erfordert und die Verwendung des TCP-Protokolls den Overhead erhöht, weil Die Steuerung der TCP-Paketzustellung erfolgt bereits auf der Ebene der im Tunnel eingekapselten Pakete.

**Wenn eine Authentifizierung in AD nicht erforderlich ist, kommentieren Sie sie aus, überspringen Sie den nächsten Abschnitt und in der Vorlage Entfernen Sie die Zeile auth-user-pass.

AD-Authentifizierung

Um den zweiten Faktor zu unterstützen, verwenden wir die Kontoverifizierung in AD.

Wir benötigen ein Konto in der Domäne mit den Rechten eines normalen Benutzers und einer Gruppe, deren Mitgliedschaft die Verbindungsfähigkeit bestimmt.

Erstellen Sie eine Konfigurationsdatei:

/etc/openvpn/ldap.conf

den folgenden Inhalt

<LDAP>
        URL             "ldap://ldap.abc.ru"
        BindDN          "CN=bindUsr,CN=Users,DC=abc,DC=ru"
        Password        b1ndP@SS
        Timeout         15
        TLSEnable       no
        FollowReferrals yes
</LDAP>
<Authorization>
        BaseDN          "OU=allUsr,DC=abc,DC=ru"
        SearchFilter    "(sAMAccountName=%u)"
        RequireGroup    true
        <Group>
                BaseDN          "OU=myGrp,DC=abc,DC=ru"
                SearchFilter    "(cn=myVPNUsr)"
                MemberAttribute "member"
        </Group>
</Authorization>

Die wichtigsten Parameter:

  • 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 (UZ – bindUsr im abc.ru/Users-Container);
  • Passwort b1ndP@SS – Benutzerpasswort für die Bindung;
  • BaseDN „OU=allUsr,DC=abc,DC=ru“ – der Pfad, von dem aus mit der Suche nach dem Benutzer begonnen werden soll;
  • BaseDN „OU=myGrp,DC=abc,DC=ru“ – Container der erlaubenden Gruppe (Gruppe myVPNUsr im Container abc.rumyGrp);
  • SearchFilter „(cn=myVPNUsr)“ ist der Name der zulassenden Gruppe.

Inbetriebnahme und Diagnose

Jetzt können wir versuchen, unseren Server zu aktivieren und zu starten:

$ sudo systemctl enable [email protected]
$ sudo systemctl start [email protected]

Startcheck:

systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Ausstellung und Widerruf von Zertifikaten

Weil Zusätzlich zu den Zertifikaten selbst benötigen Sie Schlüssel und andere Einstellungen; es ist sehr praktisch, all dies in einer Profildatei zu packen. Anschließend wird diese Datei an den Benutzer übertragen und das Profil auf dem OpenVPN-Client importiert. Dazu erstellen wir eine Einstellungsvorlage und ein Skript, das das Profil generiert.

Sie müssen den Inhalt der Stammzertifikat- (ca.crt) und TLS-Schlüsseldateien (ta.key) zum Profil hinzufügen.

Vor der Ausstellung von Benutzerzertifikaten Vergessen Sie nicht, die erforderliche Gültigkeitsdauer für Zertifikate festzulegen in der Parameterdatei. Zu lange sollte man nicht machen, ich empfehle, sich 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.ovpn

client
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

<ca>
-----BEGIN CERTIFICATE-----
PUT YOUR CA CERT (ca.crt) HERE
-----END CERTIFICATE-----
</ca>

key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
PUT YOUR TA KEY (ta.key) HERE
-----END OpenVPN Static key V1-----
</tls-auth>

Notes:

  • Linien LEGEN SIE IHRE... Inhalt ändern ihre Zertifikate;
  • Geben Sie in der Remote-Anweisung den Namen/die Adresse Ihres Gateways an.
  • Die Auth-User-Pass-Direktive wird für die zusätzliche externe Authentifizierung verwendet.

Im Home-Verzeichnis (oder an einem anderen geeigneten Ort) erstellen wir ein Skript zum Anfordern eines Zertifikats und zum Erstellen eines 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 ~

Datei ausführbar machen:

chmod a+x ~/make.profile.sh

Und wir können unser erstes Zertifikat ausstellen.

~/make.profile.sh my-first-user

Rückruf

Im Falle einer Kompromittierung eines Zertifikats (Verlust, Diebstahl) ist es erforderlich, dieses Zertifikat zu widerrufen:

cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl

Ausgestellte und widerrufene Zertifikate anzeigen

Um ausgestellte und widerrufene Zertifikate anzuzeigen, sehen Sie sich einfach die Indexdatei an:

cd /usr/share/easy-rsa/3/
cat pki/index.txt

Erklärung:

  • die erste Zeile ist das Serverzertifikat;
  • erstes Zeichen
    • V (Gültig) – gültig;
    • R (widerrufen) – zurückgerufen.

Netzwerkkonfiguration

Die letzten Schritte bestehen in der Konfiguration des Übertragungsnetzes – Routing und Firewalls.

Verbindungen in der lokalen Firewall zulassen:

$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent

Als nächstes aktivieren Sie 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 wahrscheinlich Subnetze und wir müssen den Routern mitteilen, wie sie Pakete senden sollen, die für unsere VPN-Clients bestimmt sind. Auf der Kommandozeile führen wir den Befehl auf folgende Weise aus (abhängig von der verwendeten Ausrüstung):

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

und speichern Sie die Konfiguration.

Darüber hinaus muss an der Grenzrouter-Schnittstelle, an der die externe Adresse gw.abc.ru bereitgestellt wird, der Durchgang von udp/1194-Paketen zugelassen werden.

Falls die Organisation strenge Sicherheitsregeln hat, muss auch eine Firewall auf unserem VPN-Server konfiguriert werden. Meiner Meinung nach bietet die Einrichtung von iptables FORWARD-Ketten die größte Flexibilität, auch wenn die Einrichtung weniger praktisch ist. Ein bisschen mehr über die Einrichtung. Zu diesem Zweck ist es am bequemsten, „direkte Regeln“ zu verwenden – direkte Regeln, die in einer Datei gespeichert sind /etc/firewalld/direct.xml. Die aktuelle Konfiguration der Regeln finden Sie wie folgt:

$ sudo firewall-cmd --direct --get-all-rule

Bevor Sie eine Datei ändern, erstellen Sie eine Sicherungskopie davon:

cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bak

Der ungefähre Inhalt der Datei ist:

<?xml version="1.0" encoding="utf-8"?>
<direct>
 <!--Common Remote Services-->
  <!--DNS-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o ens192 -p udp --dport 53 -j ACCEPT</rule>
  <!--web-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.200 --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.201 --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
  <!--Some Other Systems-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p udp -d 172.16.19.100 --dport 7000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
  <!--just logging-->
    <rule priority="1" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '</rule>
</direct>

Erklärung

Dabei handelt es sich im Wesentlichen um reguläre Iptables-Regeln, die nach der Einführung von Firewalld ansonsten gepackt wurden.

Die Zielschnittstelle mit den Standardeinstellungen ist tun0, und die externe Schnittstelle für den Tunnel kann je nach verwendeter Plattform unterschiedlich sein, beispielsweise ens192.

Die letzte Zeile dient der Protokollierung verworfener Pakete. Damit die Protokollierung funktioniert, müssen Sie den Debug-Level in der Firewalld-Konfiguration ändern:

vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2

Das Anwenden von Einstellungen ist der übliche Firewalld-Befehl zum erneuten Lesen der Einstellungen:

$ sudo firewall-cmd --reload

Sie können verworfene Pakete wie folgt anzeigen:

grep forward_fw /var/log/messages

Was weiter

Damit ist die Einrichtung abgeschlossen!

Jetzt müssen Sie nur noch die Client-Software auf der Client-Seite installieren, das Profil importieren und eine Verbindung herstellen. Für Windows-Betriebssysteme befindet sich das Distributionskit unter Entwicklerseite.

Abschließend binden wir unseren neuen Server an die Überwachungs- und Archivierungssysteme an und vergessen nicht, regelmäßig Updates zu installieren.

Stabile Verbindung!

Source: habr.com

Kommentar hinzufügen