Viele unserer Kunden haben bereits eigene VPN-Lösungen im Einsatz. Jedoch erreichen uns immer wieder Anfragen nach Tipps, wie es möglich wäre Zugriff auf Intranetseiten von iOS- und Android-Geräten ohne teure VPN-Lösungen zu realisieren. Wir haben uns entschlossen mit diesem How-To zu erläutern, wie OpenVPN – ein kostenloser VPN-Server – installiert und in Kombination mit Cortado eingesetzt werden kann, um z. B. Intranetseiten für Mobilgeräte freizugeben und die dafür nötige Konfiguration automatisch auf gemanagte Geräte zu verteilen.
Ziel
Ziel soll es sein, einen funktionierenden, sicheren VPN-Server aufzusetzen, um Intranetapplikationen über das VPN auch für sich im WLAN befindliche Mobilgeräte freizugeben. Wir wollen die Apps, soweit möglich, mit sog. Managed Configurations konfigurieren, um die Handarbeit am Endgerät auf ein Minimum zu reduzieren. Dieses How-To bereitet Vieles vor, was wir in künftigen How-Tos zu Managed Domains und Intranet Apps wieder aufgreifen werden.
Umsetzung
Aufsetzen des VPN-Servers
Ganz grundsätzlich müssen wir uns nun entscheiden, ob wir unseren VPN-Server mit Cortado betreiben wollen, oder wir einen dedizierten Linux-Server aufsetzen möchten, der uns als VPN-Server dienen wird. Wir haben beide Wege erklärt, würden allerdings letztere Option empfehlen.
Aufsetzen des VPN-Servers unter Linux
Dimensionierung: 2 Kerne, 4 GB RAM, 30 GB Festplattenspeicher
Wir haben uns hier für Debian als Betriebssystem entschieden. Nachdem wir die virtuelle Maschine und das Betriebssystem (minimale Installation mit SSH reicht uns hier aus) installiert und einen SUDOER-Nutzer angelegt haben, loggen wir uns über SSH auf den Server mit unserem SUDOER-Nutzer ein. Wir führen nacheinander folgende Befehle aus:
- Mit diesem Befehl stellen wir sicher, dass wir die aktuellen Paketinformationen haben und alle Updates installiert haben
Sudo apt update && sudo apt upgrade
- Nun installieren wir iptables und konfigurieren die Portfreigaben des Servers. Hierzu melden wir uns einmalig als Root-Nutzer an.
Su root
- Nun stellen wir sicher, das keine ggf. schon bestehenden Firewallregeln mehr im System verbleiben
Iptables –F && iptables –X
- Nun installieren wir iptables-persistent, unsere lokale Firewall
Apt install iptables-persistent
- Nun legen wir uns einige Firewallregeln an. WICHTIG: Bitte ändern Sie das Interface (eth0 im Beispiel) zum tatsächlich jeweilig auf dem System verwendeten Interface um, ansonsten können Sie sich schnell aus dem eigenen System aussperren. Wenn Sie sich nicht sicher sind, geben Sie bitte “ifconfig” in die Console ein und überprüfen Sie nochmal den Interfacenamen.
Cd /etc/iptables/rules.v4
- Wir ersetzen nun alle Regeln, die wir hier ggf. Vorfinden mit unseren eigenen. Sie können unsere Regeln ruhig anpassen, wenn Sie sich gut genug mit der Materie auskennen. Die Datei sollte dann so aussehen.
*filter
- Hier erlauben wir allen Loopback-Traffic vom Interface lo und weisen allen anderen Traffic ab.
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
-A OUTPUT -o lo -j ACCEPT
- Hier erlauben wir Pings
-A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
- Hier erlauben wir SSH
-A INPUT -i eth0 -p tcp -m state --state NEW,ESTABLISHED --dport 22 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state ESTABLISHED --sport 22 -j ACCEPT
- Hier erlauben wir UDP Traffic auf dem 1194 für OpenVPN.
-A INPUT -i eth0 -p udp -m state --state NEW,ESTABLISHED --dport 1194 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m state --state ESTABLISHED --sport 1194 -j ACCEPT
- Wir erlauben DNS Namensauflösung und HTTP/HTTPS
-A INPUT -i eth0 -p udp -m state --state ESTABLISHED --sport 53 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m state --state NEW,ESTABLISHED --dport 53 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED --sport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED --sport 443 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED --dport 80 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED --dport 443 -j ACCEPT
- Wir erlauben allen Traffic, der vom tun0 Interface (unser späteres VPN-Interface) ausgeht, um die Kommunikation mit unserem eth0 Interface zu erlauben.
-A INPUT -i tun0 -j ACCEPT
-A OUTPUT -o tun0 -j ACCEPT
- Nun weisen wir jeden Traffic ab, den wir nicht mit den oben konfigurierten Regeln freigegeben haben.
-A INPUT -j REJECT
-A FORWARD -j REJECT
-A OUTPUT -j REJECT
- Mit COMMIT schließen wir die Konfigurationsdatei.
COMMIT
- Mit den folgenden Befehlen können wir die neu eingestellte Regel gleich aktivieren.
Iptables-restore < /etc/iptables/rules.v4
- Nun laden wir die neuen Regeln in unser iptables-persistent, damit diese immer angewendet werden:
Dpkg-reconfigure iptables-persistent
- Nun sind wir bereit uns Open VPN herunterzuladen. Das ist auch ganz einfach. Wir wechseln allerdings erstmal wieder von unserem Root-Benutzer zurück zu unserem Standard SUDOER-Nutzer.
Su sudoer
- Nun installieren wir OpenVPN.
Sudo apt install openvpn
- Belassen wir alles soweit, läuft OpenVPN über den Root-Nutzer. Das ist keine gute Idee. Kein Dienst sollte, wenn nicht unbedingt nötig mit Root-Rechten laufen, da bei einer Kompromittierung des Nutzers (hier Root) sämtliche Dienste vom Angreifer kontrolliert werden können (hier Root, also alles). Legen wir einen weiteren Nutzer an und konfigurieren OpenVPN so, dass der Dienst von diesem neuen Nutzer ausgeführt wird, begrenzen wir den Schadensfall immens.
Sudo adduser –system –shell /usr/sbin/nologin --no-create-home cortadovpn
Sudo Groupadd cortadovpn
Sudo Usermod –g cortadovpn cortadovpn
- Nun erzeugen wir uns eine sog. HMAC-Signatur:
Sudo Openvpn –genkey –secret /etc/openvpn/server/ta.key
- Nun generieren wir uns einen Diffie-Hellman-Parameter. Wir stocken die von OpenVPN empfohlene Größe von 2048 auf 4096 bits auf. Das ist vollkommen ausreichend. Größere Größen führen zu einer exorbitanten Generierungszeit. Die Generierung unseres 4096 bit Parameters wird ca 10-20 Minuten dauern.
Sudo Openssl genpkey –genparam –algorithm DH –out /etc/openvpn/server/dhp4096.pem -pkeyopt dh_paramgen_prime_len:4096
- Wir sind nun an einem Punkt angekommen an dem wir über Zertifikate nachdenken müssen. Es wäre prinzipiell empfehlenswert, wenn alle Zertifikate von einer bestehenden, globalen, vertrauenswürdigen CA ausgestellt werden, die nicht auf dem OpenVPN-Server liegt. Der Einfachheit halber haben wir die Schritte beschrieben, wie das (hier selbstsignierte) TLS-Zertifikat lokal erzeugt werden kann. Wenn diese Herangehensweise in Ihrer Umgebung nicht sicher genug scheint, können Sie jederzeit die Zertifikate wie von Ihnen gewünscht generieren und einspielen.
- Für die Erstellung unserer CA und die Erstellung der Client-Zertifikate verwenden wir easy-rsa. Wir kopieren erstmal die Konfigurationsdateien in unser OpenVPN-Verzeichnis:
Cd /etc/openvpn
cp -r /usr/share/easy-rsa/ /etc/openvpn
Cd easy-rsa
- nun editieren wir die VARS file
Nano vars
- Editieren Sie den folgenden Abschnitt mit den für Sie stimmigen Daten:
Export KEY_CONFIG=etc/openvpn/easy-rsa(openssl.cnf
(Diesen Pfad müssen Sie ggf. anpassen, damit er dorthin führt, wo tatsächlich Ihre openssl.cnf zu finden sein wird.)
Export Key_name=”Unser Servername”
# These are the default values for fields
# which will be placed in the certificate.
# Don’t leave any of these fields blank.export KEY_COUNTRY="DE"
export KEY_PROVINCE="BERLIN"
export KEY_CITY="BERLIN"
export KEY_ORG="CORTADO"
export KEY_EMAIL="[email protected]"
export KEY_OU="CONSULTING"
- Wir sichern das Dokument und räumen mit folgenden Befehl auf.
. ./vars
(Beachten Sie den Punkt, das Leerzeichen und dann den zweiten Punkt)
./ckean-all
- Nun erstellen wir uns unsere CA und die Client-Zertifikate.
./build-ca
- Sie können die nun folgende Eingabeaufforderung mit Enter überspringen, da wir in der VARS -Datei unsere Standardeinstellungen hinterlegt haben. Als nächstes erstellen wir uns unseren Serverschlüssel
./build-key-server <servername>
//tragen Sie hier den Namen des Server so ein, wie er auch von den Clients aufgerufen wird.
- Die nun folgenden Eingabeaufforderungen können Sie alle überspringen. Beachten Sie, dass wir für dieses How-To kein Passwort für das Zertifikat setzen werden. Die entsprechende Eingabeaufforderung können Sie also ebenfalls mit Enter überspringen. Bejahen Sie die Frage, ob Sie das Zertifikat signieren und die Änderungen speichern wollen. Nun kopieren wir die generierten Daten in das OpenVPN-Root-Verzeichnis und starten den OpenVPN-Server
Cp /etc/openvpn/easy-rsa/key/<servername>.crt /etc/openvpn
Cp /etc/openvpn/easy-rsa/key/<servername>.key /etc/openvpn
Cp /etc/openvpn/easy-rsa/ca.crt /etc/openvpn
Service openvpn start
- Unser VPN-Server ist jetzt einsatzbereit und wir können uns Zertifikate für unsere Clients erzeugen. Wir müssen uns hier entscheiden, ob wir ein Zertifikat für alle verwenden möchten, oder jeder Client sein eigenes Zertifikat bekommen soll. Natürlich ist die zweite Methode charmanter, da wir ggf. jedem Client einzeln den VPN-Zugang sperren können. Andererseits können Sie über MDM das Gerät des Einzelnen auch einfach zurücksetzen, oder den Zugriff auf geschäftliche Inhalte darüber entziehen. Der Einfachheit halber haben wir uns hier für ein Zertifikat für alle Clients entschieden. Wenn Sie weitere Client-Zertifikate erstellen wollen, können Sie folgende Schritte einfach wiederholen, oder Sie bauen sich ein entsprechendes Script dafür.
- Mit dem folgenden Kommando erzeugen wir uns unser erstes Zertifikat. Die darauffolgenden Aufforderungen können Sie mit Enter überspringen.
./build-key user1
- Nun finden wir im Ordner keysdas Zertifikat, welches dieser Client für die Anmeldung gegen unseren VPN-Server verwenden kann. Wir sind nun auf der Linux-Maschine erstmal fertig und können in das Verwaltungsportal von Cortado wechseln, um mit der Bereitstellung (provisioning) der Geräte zu beginnen. Machen Sie jetzt im Schritt
Konfiguration der Clients über das Verwaltungsportal weiter.
Aufsetzen des VPN-Servers unter Windows Server 2016
Wenn Sie OpenVPN nicht auf einer Linux-Maschine betrieben wollen, sondern auf einen Windows-Server setzen, können Sie diese Anleitung befolgen:
- Melden Sie sich an Ihrem Windows-Server mit einem Administrator-Konto an und laden Sie sich den aktuellsten Installer für Windows auf der OpenVPN-Herstellerwebseite herunter und installieren Sie das Programm.
- Bitte beachten Sie, dass Sie alle Häkchen in der Auswahlliste ausgewählt haben.
- Nun sollten Sie sich eine Konfigurationsdatei erstellen. Öffnen Sie dafür Notepad im Administrator-Modus und speichern Sie unter C:/Program Files/OpenVPN/config/ die datei server.ovpn mit folgendem Inhalt. Bitte editieren Sie den Server-Namen, damit dieser auf Ihren Anwendungsfall passt:
port 1194
proto tcp
dev tun
ca "C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\.crt"
key "C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\.key"
dh "C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\dh2048.pem"
server 10.0.0.0 255.255.255.0
ifconfig-pool-persist "C:\\Program Files\\OpenVPN\\log\\ipp.txt"
push "route 192.168.0.0 255.255.255.0"
keepalive 10 120
cipher AES-128-CBC
persist-key
persist-tun
status "C:\\Program Files\\OpenVPN\\log\\openvpn-status.log"
verb 3
script-security 3
- Starten Sie eine Kommandozeile mit Administratorrechten und wechseln Sie in das OpenVPN-Verzeichnis.
cd C:\Program Files\OpenVPN\easy-rsa
- Dort führen Sie einmalig die init-config.bat aus.
init-config
- Danach öffnen Sie Notepad mit Administratorrechten, klicken auf Öffnen und navigieren Sie in das OpenVPN-Verzeichnis, um die Datei vars.bat zu öffnen und zu editieren. Hier können wir Attribute für die Zertifikate festlegen. Ändern Sie die folgenden Werte so ab, dass diese auf Ihren Anwendungsfall passen.
set KEY_COUNTRY=DE
set KEY_PROVINCE=BERLIN
set KEY_CITY=BERLIN
set KEY_ORG=CORTADO
set [email protected]
set KEY_CN=
(Geben Sie den Servernamen so an, wie er später auch von den Clients aufgerufen werden soll.)
set KEY_NAME=
(Geben Sie den Servernamen so an, wie er später auch von den Clients aufgerufen werden soll.)
set KEY_OU=CONSULTING
set PKCS11_MODULE_PATH=changeme
set PKCS11_PIN=1234
- Nachdem Sie die Anpassungen abgeschlossen haben, können Sie die Datei wieder abspeichern. Wechseln Sie nun wieder in die Kommandozeile mit Administrator-Rechten und führen Sie bitte folgende Befehle aus:
vars
clean-all
vars
build-ca
- Die Aufforderungen, die nun erscheinen können Sie alle mittels Enter überspringen. Die Standardwerte haben wir vorher in der Vars-Datei schon entsprechend angepasst. Dann folgen diese Befehle:
vars
build-dh
build-key.-server
- Nun können wir uns die Client Zertifikate generieren. Das machen wir mit folgenden Befehlen:
vars
build-key
- Bei der Abfrage der gewünschten Attribute, geben Sie bitte bei NAME und EMAILADDRESS den Namen und die E-Mail-Adresse des Nutzers an, welcher dieses Zertifikat verwenden soll und schließen Sie dann die Einrichtung mit den notwendigen Bestätigungen ab.
- Jetzt können wir den OpenVPN-Server zum Test starten, um zu checken, ob alle in der server.ovpn konfigurierten Dateien an den richtigen Orten abgespeichert sind. Hierfür starten Sie OpenVPN und rechtsklicken auf das Icon in der Taskleiste und klicken auf “Connect”. Läuft der Prozess ohne Fehler durch und schließt sich das Fenster, ist der Server funktionstüchtig. Wenn Sie Fehler angezeigt bekommen, wechseln Sie bitte in das angegebene Log-Verzeichnis und öffnen dort die Log-Datei. Normalerweise werden hier nur Dateien nicht gefunden. Verschieben Sie die Dateien ggf. in die richtigen Verzeichnisse und versuchen Sie noch einmal den OpenVPN-Server zu starten.
- Wir sind nun auf der Serverseite fertig und können in das Verwaltungsportal von Cortado wechseln, um das VPN-Profil für unsere Clients anzulegen.
Konfiguration der Clients über das Verwaltungsportal
Wir geben nun alle Informationen an den Client weiter, die er braucht um sich ohne Passworteingabe nur mit seinem Zertifikat am VPN-Server anzumelden und diesen zu nutzen, um z. B. Intranetwebseiten aufzurufen.
Allerdings müssen wir zwei Sache vorbereiten.
Upload der Client-Zertifikate
- Zum einen müssen wir unsere Client-Zertifikate hochladen, oder bekannt geben. Das können wir über Verwaltung→ Profile → Global→ Zertifikat tun. Wenn wir ein einzelnes Client-Zertifikat hochladen wollen, dann können wir dies auf der linken Seite tun.
- Damit das Zertifikat vom Endgerät auch korrekt verwendet werden kann, muss es in das PFX-Format umgewandelt werden. Das geht folgendermaßen:
- Kopieren Sie das .crt und .key des Client-Zertifikates in einen gemeinsamen Ordner. Beachten Sie, dass beide Dateien gleich heißen müssen. Danach öffnen Sie eine Kommandozeile mit Administrator-Rechten und navigieren Sie in diesen Ordner. Danach führen Sie folgenden Befehl aus:
certutil –MergePFX <name des crt>.crt <name des crt>.pfx
- Die nun generierte PFX-Datei können Sie über den Upload-Dialog des Profils hochladen. Wollen Sie gleich mehrere Client-Zertifikate ausrollen, bietet sich ein sog. PFX-Ordner an. Erstellen Sie hierzu im Verwaltungsportal von Cortado, oder einem File-Server einen Ordner. Konvertieren Sie alle Client-Zertifikate, die Sie sich vorher über Easy-RSA ausstellen lassen haben in PFX-Dateien und geben Sie diesen immer das gleiche Passwort und benennen Sie diese nach dem UPN des Nutzers, der das jeweilige Zertifikat bekommen soll. Geben Sie nun den Pfad zu diesem Ordner auf der rechten Seite an.
Upload des CA-Zertifikats
Unser CA-Zertifikat kann für OpenVPN leider nicht über das Verwaltungsportal als Zertifikatsprofil verteilt werden. Hierfür müssen wir einmalig manuell Hand anlegen und die ca.crt Datei kopieren, öffnen und alle Umbrüche (“Leerzeichen”) innerhalb der —-BEGIN CERTIFICATE—- und —-END CERTIFICATE—- klammer mit /n ersetzen. Am besten geht das tatsächlich manuell, da es sich bei den Zeilenumbrüchen in den Zertifikaten nicht um normale Leerzeichen handelt, die gewöhnliche Texteditoren erkennen würden. Haben wir das erledigt, können wir uns den String in die Zwischenablage kopieren.
Konfiguration des VPN-Profils
Jetzt wenden wir uns unserem iOS-VPN-Profil zu, welches wir wie folgt konfigurieren. Im Verwaltungsportal von Cortado öffnen Sie Verwaltung→ Profile. Erstellen Sie sich ein neues iOS-Profil. Füllen Sie folgende Informationen in die Felder ein.
Profilname: frei wählbar
Konto: kann leer bleiben
VPN-Server: Hier geben wir die Adresse unseres VPN-Servers an, mit der dieser von den Clients aus dem WLAN erreicht werden kann.
Verbindungstyp: Hier wählen wir Individuell definiertes SSL
Kennung: Hier kommt die Bundle-ID der OpenVPN-App hin (derzeit: net.openvpn.connect.app)
Benutzerauthentifizierung: Zertifikat
Identitätszertifikat: Wählen Sie hier die hochgeladene PFX-Datei oder den PFX-Ordner aus, welchen Sie vorher definiert haben.
- Unter der Abteilung Individuell einstellbare Daten müssen wir jetzt nur noch eine Reihe Schlüssel/Wertepaare definieren, dann sind wir fertig. Über das kleine Plus können Sie neue Schlüsselfelder hinzufügen, über der X wieder entfernen. Legen Sie sich folgende Schlüssel an und befüllen Sie die Wertespalte mit den zutreffenden Werten:
remote | VPN-Serveradresse |
ca | Kopieren Sie hier den angepassten String des CA.crts hinein |
port | VPN-Server-Port |
dev | tun |
proto | tcp |
- Jetzt können Sie das Profil abspeichern.
Ausrollen und Inbetriebnahme der OpenVPN-App unter iOS
- Fügen Sie nun die OpenVPN-App hinzu und rollen Sie diese aus. Weitere Informationen finden Sie hier.
- Nun weisen Sie das VPN-Profil zu. Weitere Informationen hierzu finden Sie hier.
- Auf den Geräten wird nun die OpenVPN-App installiert und unter den Einstellungen erscheint der Punkt “VPN” den Sie nun aktivieren können.
Wird die VPN-Verbindung aufgebaut, haben Sie alles richtig gemacht. Vielleicht möchten Sie nun die Möglichkeiten des neuen VPNs voll ausnutzen? Lesen Sie hier, wie Sie Per-App VPN einrichten können.