Organisation der Remote-Arbeit SMB-Organisation auf OpenVPN

Formulierung des Problems


Der Artikel beschreibt die Organisation des Remotezugriffs für Mitarbeiter auf Open Source-Produkte und kann sowohl zum Aufbau eines vollständig autonomen Systems als auch zur Erweiterung verwendet werden, wenn in einem vorhandenen kommerziellen System Lizenzen fehlen oder die Leistung unzureichend ist.

Der Zweck des Artikels besteht darin, ein komplettes System für die Bereitstellung des Remotezugriffs auf eine Organisation vorzustellen, das etwas mehr ist als "Installation von OpenVPN in 10 Minuten".

Als Ergebnis erhalten wir ein System, in dem Zertifikate und (optional) das Active Directory-Unternehmensverzeichnis für die Benutzerauthentifizierung verwendet werden. ZU. Wir erhalten ein System mit zwei Überprüfungsfaktoren - was ich habe (Zertifikat) und was ich weiß (Passwort).

Ein Zeichen dafür, dass der Benutzer eine Verbindung herstellen darf, ist seine Mitgliedschaft in der myVPNUsr-Gruppe. Die Zertifizierungsstelle wird eigenständig 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 3. Version unter CetntOS 7 verwenden, die auf 100 Verbindungen basiert, die 4 vCPU, 4 GiB RAM ausgeben.

In diesem Beispiel ist das Netzwerk unserer Organisation 172.16.0.0/16, in dem 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 für VPN-Clients zugewiesen ist .

Um eine Verbindung von außen herzustellen, wird eine Verbindung an Port 1194 / udp verwendet, und in DNS für unseren Server wird ein A-Eintrag gw.abc.ru erstellt.

Es wird dringend empfohlen, SELinux nicht zu deaktivieren! OpenVPN funktioniert ohne Deaktivierung der Sicherheitsrichtlinien.

Inhalt


  1. Installation von Betriebssystem und Anwendungssoftware
  2. Kryptographieeinstellung
  3. Konfigurieren Sie OpenVPN
  4. Authentifizierung in AD
  5. Start und Diagnose
  6. Ausstellung und Widerruf des Zertifikats
  7. Netzwerkkonfiguration
  8. Was weiter


Installation von Betriebssystem und Anwendungssoftware


Wir verwenden das Distributionskit CentOS 7.8.2003. Wir müssen das Betriebssystem in einer minimalen Konfiguration installieren. Es ist praktisch, dies mit Kickstart , Klonen eines zuvor installierten Betriebssystem-Images und anderen Mitteln zu tun .

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

$ sudo yum update -y && reboot

Es muss auch sichergestellt werden, dass die Zeitsynchronisation auf unserer Maschine durchgeführt wird.
Um die 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

Für eine virtuelle Maschine ist es hilfreich, einen Gastagenten zu installieren:

$ sudo yum install open-vm-tools

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

$ sudo yum install ovirt-guest-agent


Kryptographieeinstellung


Gehen Sie zum easy-rsa-Verzeichnis:

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

Erstellen Sie eine variable Datei:

$ sudo vim vars

den folgenden Inhalt:

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

Die Parameter für die bedingte Organisation von ABC LLC werden hier beschrieben. Sie können sie real korrigieren oder als Beispiel belassen. Das Wichtigste in den Parametern ist die letzte Zeile, die die Gültigkeitsdauer des Zertifikats in Tagen bestimmt. Im Beispiel wird der Wert 10 Jahre verwendet (365 * 10 + 2 Schaltjahre). Dieser Wert muss angepasst werden, bevor Benutzerzertifikate ausgestellt werden.

Richten Sie als Nächstes eine eigenständige Zertifizierungsstelle ein.

Die Konfiguration umfasst das Exportieren von Variablen, das Initialisieren der Zertifizierungsstelle, das Ausstellen des Stammschlüssels und des Zertifizierungsstellenzertifikats, des Diffie-Hellman-Schlüssels, des TLS-Schlüssels sowie des Serverschlüssels und des Zertifikats. Der Schlüssel der Zertifizierungsstelle muss sorgfältig gehütet und geheim gehalten werden! Alle Parameter bei Anforderungen können standardmäßig 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.

Konfigurieren Sie OpenVPN


Wechseln 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 OpenVPN-Hauptkonfigurationsdatei:

$ 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 Adresspool für Ihre Aufgaben an *;
  • Routen und DNS-Server können eine oder mehrere sein.
  • Die letzten beiden Zeilen werden benötigt, um die Authentifizierung in AD ** zu implementieren.

* 127 , .. /23, OpenVPN /30.
, , SELinux, tcp , .. tcp- .

** AD , , — , auth-user-pass.


AD


Um den zweiten Faktor zu unterstützen, verwenden wir die Kontobestätigung in AD.

Wir benötigen ein Konto in der Domäne mit den Rechten eines normalen Benutzers und einer Gruppe, deren Mitgliedschaft die Fähigkeit zur Verbindung 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>

Hauptparameter:

  • URL "ldap: //ldap.abc.ru" - die Adresse des Domänencontrollers;
  • BindDN "CN = bindUsr, CN = Benutzer, DC = abc, DC = ru" - der kanonische Name für die Bindung an LDAP (UZ - bindUsr im Container abc.ru/Users);
  • Passwort b1ndP @ SS - Benutzerkennwort zum Binden;
  • BaseDN "OU = allUsr, DC = abc, DC = ru" - der Pfad, von dem aus die Benutzersuche gestartet werden soll;
  • BaseDN "OU = myGrp, DC = abc, DC = ru" - der Container der zulässigen Gruppe (die Gruppe myVPNUsr im Container abc.ru \ myGrp);
  • SearchFilter "(cn = myVPNUsr)" ist der Name der auflösenden Gruppe.


Start und Diagnose


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

$ sudo systemctl enable openvpn@server.service
$ sudo systemctl start openvpn@server.service

Launch Check:

systemctl status openvpn@server.service
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

Ausstellung und Widerruf des Zertifikats


weil Zusätzlich zu den Zertifikaten selbst benötigen Sie Schlüssel und andere Einstellungen. Es ist sehr praktisch, all dies in eine Profildatei zu packen. Diese Datei wird dann an den Benutzer übertragen und das Profil ist bereits auf dem OpenVPN-Client importiert. Erstellen Sie dazu eine Konfigurationsvorlage und ein Skript, das das Profil bildet.

Im Profil müssen Sie den Inhalt der Stammzertifikatsdateien (ca.crt) und den TLS-Schlüssel (ta.key) hinzufügen.

Stellen Sie vor der Ausstellung von Benutzerzertifikaten sicher, dass die erforderliche Gültigkeitsdauer des Zertifikats in der Parameterdatei festgelegt ist. Sie sollten es nicht zu groß machen, ich empfehle es 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>

Anmerkungen:

  • PUT YOUR ... Strings werden in den Inhalt ihrer Zertifikate geändert .
  • Geben Sie in der Direktive remote den Namen / die Adresse Ihres Gateways an.
  • Die Anweisung auth-user-pass 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 ~

Wir machen die Datei ausführbar:

chmod a+x ~/make.profile.sh

Und Sie können unser erstes Zertifikat ausstellen.

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


Feedback


Wenn das Zertifikat kompromittiert ist (Verlust, Diebstahl), muss dieses Zertifikat widerrufen werden:

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


Ausgestellte und widerrufene Zertifikate anzeigen


Um die ausgestellten und widerrufenen Zertifikate anzuzeigen, zeigen Sie einfach die Indexdatei an:

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

Erklärungen:

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


Netzwerkkonfiguration


Die letzten Schritte sind das Einrichten eines Übertragungsnetzwerks - Routing und Firewalls.

Berechtigung für Verbindungen in der lokalen Firewall:

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

Aktivieren Sie als Nächstes das IP-Verkehrsrouting:

$ 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 eine Unterteilung in Subnetze, und wir müssen den Routern mitteilen, wie sie an unsere VPN-Clients adressierte Pakete senden sollen. Führen Sie den Befehl in der Befehlszeile folgendermaßen 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 ist es an der Schnittstelle des Grenzrouters, an der die externe Adresse gw.abc.ru bereitgestellt wird, erforderlich, den Durchgang von udp / 1194-Paketen zuzulassen.

Wenn Ihre Organisation strenge Sicherheitsregeln hat, müssen Sie auch eine Firewall auf unserem VPN-Server konfigurieren. Meiner Meinung nach bietet das Einrichten von iptables FORWARD-Ketten die größte Flexibilität, obwohl das Einrichten weniger bequem ist. Ein bisschen mehr über das Einrichten. Zu diesem Zweck ist es am bequemsten, "direkte Regeln" zu verwenden - direkte Regeln, die in der Datei /etc/firewalld/direct.xml gespeichert sind . Die aktuelle Regelkonfiguration kann wie folgt ermittelt werden:

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

Erstellen Sie vor dem Ändern der Datei eine Sicherungskopie davon:

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

Der ungefähre Inhalt der Datei lautet wie folgt:

<?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ärungen


Im Wesentlichen sind dies die üblichen iptables-Regeln, die ansonsten nach dem Erscheinen von firewalld gepackt werden.

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

Die letzte Zeile dient zum Protokollieren verworfener Pakete. Damit die Protokollierung funktioniert, müssen Sie die Debugging-Ebene in der Firewall-Konfiguration ändern:

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

Einstellungen anwenden - der übliche Befehl firewalld zum erneuten Lesen der Einstellungen:

$ sudo firewall-cmd --reload

Verworfene Pakete können wie folgt angezeigt werden:

grep forward_fw /var/log/messages


Was weiter


Das Setup ist fertig!

Es bleibt auf der Clientseite, die Client-Software zu installieren, das Profil zu importieren und eine Verbindung herzustellen. Für ein Betriebssystem wie Windows ist die Distribution auf der Entwicklerseite verfügbar .

Abschließend verbinden wir unseren neuen Server mit Überwachungs- und Archivierungssystemen und vergessen nicht, regelmäßig Updates zu installieren.

Stabile Verbindung!

All Articles