Nachdem Sie Ihren eigenen OpenVPN-Server eingerichtet haben, möchten Sie vielleicht dessen Sicherheit verbessern. Eine Möglichkeit, dies zu tun und Ihren Authentifizierungsprozess zu optimieren, ist die Verwendung von Single Sign-in oder Single Sign-On (SSO), manchmal auch als SAML bezeichnet (Dies ist ein SSO-Protokoll). Dies fügt eine weitere Sicherheitsmaßnahme hinzu, um zu verhindern, dass sich unerwünschte Benutzer mit Ihrem Server verbinden, und integriert sich gleichzeitig in Ihr vorhandenes Benutzer-, Identitäts- oder Client-Verwaltungssystem oder Ihren Authentifizierungsprozess.
Dieser Leitfaden enthält ein Beispiel dafür, wie dies mit Okta, einer beliebten Cloud-basierten Identitätsplattform, funktionieren könnte. Die Grundlagen dieses Beispiels lassen sich auf die meisten Identitätsverwaltungssysteme (IDMS) übertragen, mit nur Änderungen an der Art und Weise, wie Sie mit dem IDMS Ihrer Wahl kommunizieren.
Bitte beachten Sie, dass dieses Beispiel darauf ausgelegt ist, die Grundlagen zu zeigen, wie ein IDM- oder SSO-System auf der Serverseite in OpenVPN integriert werden kann, es ist nicht darauf ausgelegt, eigenständig so wie es ist verwendet zu werden.
Vorbereitung
Für diese Anleitung gehen wir von Folgendem aus:
- Sie haben ein Okta-Konto (diese Anleitung funktioniert mit der kostenlosen Testversion von Okta)
- Sie haben bereits die neueste Version von Ubuntu installiert (20.04 zum Zeitpunkt des Schreibens)
- Sie haben root Zugriff auf diese Installation
- Sie haben öffentlichen Zugriff auf dieses System auf Port 80 und 443 für HTTP- und HTTPS-Zugriff und einen DNS-A-NAME, der darauf verweist (z. B. openvpnsso.server.com)
- Sie haben bereits eine Kopie von Viscosity auf Ihrem Client-Gerät installiert und bereits für diesen Server eingerichtet
Die Dokumentation für Okta finden Sie unter https://help.okta.com/en/prod/Content/index.htm
Weitere Okta-Beispiele finden Sie auf ihrer GitHub-Seite unter https://github.com/okta
Diese Anleitung sollte nur als Beispiel für die Einrichtung von SSO auf Ihrem Server verwendet werden. Die bereitgestellte Python Flask-Website dient nur als Beispiel und ist nicht für den Produktionseinsatz vorgesehen.
Wenn Sie mit einer Neuinstallation von Ubuntu 20.04 von vorne anfangen, sollte dieser Vorgang von hier bis zur Fertigstellung nur etwa 20 Minuten dauern.
Okta-Setup
Zuerst müssen wir Okta für die neue Website konfigurieren, die die Kommunikation zwischen OpenVPN und Okta übernimmt.
- Melden Sie sich mit Ihrem Administratorkonto bei Okta an
- Erweitern Sie links das Menü und gehen Sie zu Anwendungen> Anwendungen
- Klicken Sie auf App-Integration erstellen
- Wählen Sie ODIC – OpenID Connect , dann Webanwendung und klicken Sie auf Weiter
- Geben Sie Ihren Namen für die App-Integration ein ein Name, den Sie erkennen werden, wie „Mein OpenVPN-Server“
- Stellen Sie den Autorisierungscode sicher ist die einzige Option, die unter „Client handelt im Auftrag eines Benutzers“ unter „Grant-Typ“ aktiviert ist
- Ersetzen Sie im Folgenden „
“ und legen Sie Ihre Anmeldungsumleitungs-URIs fest an http://<yourserver.com>/authorization-code/callback
- Legen Sie optional Ihre Umleitungs-URIs für die Abmeldung fest, indem Sie im Folgenden wieder "
" ersetzen zu http://<yourserver.com>/logout
- Legen Sie Kontrollierten Zugriff fest Wenn es sich um ein Testkonto handelt, wählen Sie zu Testzwecken einfach Allen in Ihrer Organisation den Zugriff erlauben aus
- Klicken Sie auf Speichern
Nach dem Speichern wird die Seite neu geladen. Lassen Sie entweder diese Seite offen oder notieren Sie sich jetzt die Kunden-ID , Clientgeheimnis und Okta-Domain , wir werden diese später brauchen.
Server-Setup
Als nächstes müssen wir den Server einrichten. Zusammenfassend brauchen wir einen einsatzbereiten OpenVPN-Server, um nginx als Proxy für die Python Flask-Anwendung zu installieren, einige kleine Firewall-Änderungen vorzunehmen, ein SSL-Zertifikat zu installieren, die Flask-Anwendung zu konfigurieren und einige kleine Änderungen an OpenVPN vorzunehmen.
Servervorbereitung
Melden Sie sich zuerst über SSH bei Ihrem Server an oder öffnen Sie ein Terminal und führen Sie Folgendes aus, um sicherzustellen, dass alles auf dem neuesten Stand ist
sudo apt-get update
sudo apt-get -y upgrade
OpenVPN-Server-Setup
Zuerst brauchen wir einen einsatzbereiten OpenVPN-Server. Wenn Sie auf diesem Server noch keinen haben, folgen Sie den Anweisungen zum Einrichten eines OpenVPN-Servers mit Ubuntu und Viscosity.
Stellen Sie nach der Einrichtung sicher, dass Sie eine Verbindung herstellen können.
Als nächstes müssen wir der OpenVPN-Serverkonfiguration ein paar Zeilen hinzufügen:
- Bearbeiten Sie die Konfiguration
sudo nano /etc/openvpn/server.conf
- Fügen Sie am Ende der Datei Folgendes hinzu:
management 127.0.0.1 50123 auth-user-pass-optional management-client-auth
- Drücken Sie Strg+X zum Beenden, Y zum Speichern und dann die Eingabetaste, um den Pfad zu bestätigen
- Starten Sie den Server mit
sudo systemctl restart [email protected]
neu
Wenn Sie jetzt versuchen, eine Verbindung herzustellen, sollte die Verbindung schließlich mit einer Meldung zum Fehlschlagen der Authentifizierung fehlschlagen.
Hinweise:
Wenn Sie einen vorhandenen Server mit Authentifizierungsskripten oder Plugins haben, müssen diese entfernt werden, da SSO sie ersetzen wird. Okta kann mit 2FA-Optionen konfiguriert werden, obwohl wir sie in diesem Handbuch nicht behandeln, konsultieren Sie die Okta-Dokumentation.
Webserver-Setup
Firewall
Wenn Sie dem Leitfaden Einrichten eines OpenVPN-Servers mit Ubuntu und Viscosity gefolgt sind, müssen wir zuerst die Firewall öffnen, um HTTP- und HTTPS-Verkehr zuzulassen, führen Sie Folgendes aus:
-
sudo ufw allow http
-
sudo ufw allow https
-
sudo ufw reload
Installieren Sie ningx
Als nächstes müssen wir nginx installieren. nginx ist ein HTTP- und Reverse-Proxy-Server, der Komponenten unserer Webanwendung ausliefert und die Nutzung von Funktionen wie TLS/SSL ermöglicht. Gehen Sie auf Ihrem Ubuntu-Server wie folgt vor:
- Führen Sie
sudo apt-get -y install nginx
aus - Bearbeiten Sie
sudo nano /etc/nginx/sites-enabled/default
- Scrollen Sie nach unten bis zur Zeile
server_name _;
, und ersetzen Sie den Unterstrich (_) durch den DNS-Namen Ihres Servers, z. B. myserver.com, sodass er folgendermaßen aussieht:server_name myserver.com;
- Drücken Sie Strg+X zum Beenden, Y zum Speichern und dann die Eingabetaste, um den Pfad zu bestätigen
- Laden Sie nginx mit
sudo nginx -s reload
neu
Let's Encrypt einrichten
Wenn Sie bereits ein SSL-Zertifikat für diesen Abschnitt haben, können Sie mit dem nächsten Abschnitt fortfahren. Ansonsten machen Let's Encrypt und Certbot es einfach, ein SSL-Zertifikat zu erhalten.
- Führen Sie
sudo apt-get install -y certbot python3-certbot-nginx
aus - Führen Sie Folgendes aus, ersetzen Sie myserver.com durch Ihren FQDN und folgen Sie den Eingabeaufforderungen
sudo certbot --nginx -d myserver.com
. Sie können zusätzliche Domänen angeben, wenn Sie diese benötigen, zum Beispielsudo certbot --nginx -d myserver.com -d www.myserver.com -d sso.myserver.com
. - Es kann einige Minuten dauern, bis certbot antwortet, nachdem die Eingabeaufforderungen beantwortet wurden
- Sobald Sie fertig sind, kann certbot Ihr Zertifikat automatisch erneuern, fügen Sie einfach einen Cronjob hinzu, um
/usr/bin/certbot renew --quiet
auszuführen einmal am Tag.
nginx einrichten
Jetzt haben Sie ein SSL-Zertifikat, wir können die nginx-Einrichtung abschließen.
- Bearbeiten Sie
sudo nano /etc/nginx/sites-enabled/default
- Entfernen Sie den folgenden Abschnitt:
location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; }
- Scrollen Sie nach unten bis nach den Zeilen
# managed by Certbot
, aber vor dem}
, und fügen Sie Folgendes ein:
real_ip_header X-Real-IP; real_ip_recursive on; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; location / { try_files $uri @proxy; } location @proxy { proxy_pass http://127.0.0.1:8080; proxy_pass_header Server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass_header Server; proxy_connect_timeout 3s; proxy_read_timeout 10s; }
- Drücken Sie Strg+X zum Beenden, Y zum Speichern und dann die Eingabetaste, um den Pfad zu bestätigen
- Laden Sie nginx mit
sudo nginx -s reload
neu
Web-App-Installation
Jetzt können wir die Webapp installieren und starten. Wir erstellen einen Benutzer zum Ausführen der Webanwendung, da dies etwas mehr Sicherheit schafft. Führen Sie Folgendes aus:
-
sudo apt-get install -y python3-pip
Installieren Sie Python Pip, damit wir Flask-Abhängigkeiten installieren können -
sudo adduser --system --no-create-home --group ssoappuser
Erstellen Sie einen Benutzer zum Ausführen der Webapp als -
cd /home
-
sudo mkdir ssoapp
-
sudo chown ssoappuser:ssoappuser ssoapp
-
cd ssoapp
-
sudo git clone https://github.com/thesparklabs/openvpn-okta-sso-example.git
Laden Sie die Webanwendung von GitHub herunter -
cd openvpn-okta-sso-example
-
sudo python3 -m pip install -r requirements.txt
Abhängigkeiten für die Webanwendung installieren -
sudo cp ssoapp.service /lib/systemd/system/ssoapp.service
Installieren Sie die Servicedatei -
sudo chown root:root /lib/systemd/system/ssoapp.service
-
sudo systemctl daemon-reload
Web-App-Setup
Schließlich brauchen wir nur noch ein paar schnelle Einrichtungsarbeiten, damit die Webanwendung funktioniert und mit Okta kommuniziert. Hier benötigen Sie die Client-ID , Clientgeheimnis und Okta-Domain wir haben uns vorhin über die Einrichtung von Okta informiert.
- Erstellen Sie eine Kopie der Secrets-Vorlage mit
sudo cp client_secrets.json.dist client_secrets.json
- Erstellen Sie ein zufälliges Geheimnis mit dem Folgenden und kopieren Sie es
openssl rand -hex 20
- Bearbeiten Sie die Konfiguration mit
sudo nano client_secrets.json
- Ersetzen Sie {{THIS_IS_A_SECRET}} mit der Zufallszeichenfolge, die wir vor zwei Schritten generiert haben
- Ersetzen Sie {{OKTA_DOMAIN}} in auth_uri, issuer, token_uri und userinfo_uri mit Ihrer Okta-Domain
- Ersetzen Sie {{CLIENT_ID}} mit Ihrer Kunden-ID
- Ersetzen Sie {{CLIENT_SECRET]] mit Ihrem Client-Secret
- Ersetzen Sie {{YOUR_DOMAIN}} mit Ihrer Serveradresse, z.B. meinserver.com
- Drücken Sie Strg+X zum Beenden, Y zum Speichern und dann die Eingabetaste, um den Pfad zu bestätigen
- Laden Sie nginx mit
sudo nginx -s reload
neu
Wir können jetzt den Anwendungsdienst mit
aktivieren und starten- Aktivieren Sie den Dienst so, dass er gestartet wird, wenn das System
sudo systemctl enable ssoapp
ausführt - Starten Sie den Dienst
sudo systemctl start ssoapp
Client-Setup
Wenn Sie diese Anleitung bis einschließlich der Verwendung unserer Anleitung zum Einrichten eines OpenVPN-Servers mit Ubuntu und Viscosity befolgt haben, brauchen Sie nichts weiter zu tun, sondern sich einfach mit Viscosity zu verbinden.
Wenn Sie einen vorhandenen Server geändert haben, müssen Sie lediglich die Benutzer-/Kennwortauthentifizierung deaktivieren, falls sie aktiviert ist. Bearbeiten Sie dazu die Verbindung, gehen Sie zu Authentifizierung und deaktivieren Sie "Benutzer Benutzername/Passwort-Authentifizierung", speichern Sie die Verbindung und stellen Sie eine Verbindung her.
Authentifizierungstoken
OpenVPN-auth-gen-token
Die Beispielanwendung umfasst Unterstützung für auth-gen-token. Da wir Benutzername/Passwort nicht über OpenVPN verwenden, muss dies über die Verwaltungsschnittstelle gehandhabt werden. Um es zu aktivieren, fügen Sie einfach auth-gen-token 0 external-auth
hinzu zu Ihrer Serverkonfiguration.
Okta-Token-Aktualisierung
Das obige Beispiel kann erweitert werden, um Okta-Token anstelle der Auth-Token von OpenVPN für die erneute Authentifizierung zu verwenden. Wir werden kein Beispiel dafür geben, da die integrierte Unterstützung von OpenVPN die überwiegende Mehrheit der Setups abdeckt.
Wenn Sie stattdessen Okta verwenden möchten, sollten Sie jedoch Folgendes beachten:
- Sie müssen die clientAllow-Funktionsantwort ändern, um Ihr Authentifizierungstoken zu übertragen.
- Sie müssen die clientReauth-Funktion ändern, um das Passwort aus der Client-Umgebung zu übernehmen, das über die Verwaltungsschnittstelle übergeben wird, die Oktas-Dokumentation befolgen, um dieses Token zu aktualisieren, und dann eine client-auth-Antwort ähnlich wie clientAllow senden, einschließlich des aktualisierten Tokens.
- Sie müssen die Server- und Client-Konfiguration ändern, um sicherzustellen, dass die Reneg-Sek kleiner ist als das Ablaufdatum der Okta-Token