Es wurden viele Handbücher zu OpenVPN geschrieben, einschließlich der Autorisierung über Active Directory. Die meisten von ihnen beschränken sich auf die Verwendung von LDAP. Ich habe keinen Ansatz mit Kerberos gefunden, der in einem vollwertigen Artikel geschrieben ist. Hier wird jedoch nichts Neues erfunden. Ich habe nur das kompiliert, was bereits vor mir getan wurde, PAM funktioniert gut mit Kerberos und OpenVPN hat ein natives PAM-Plugin. Ich habe mich auch dazu entschlossen, Benutzerzertifikate und -tipps aufzugeben. Sie empfehlen lediglich, dass alle Benutzer ein Zertifikat ausstellen. Sie passen nicht zu mir. Daher wurde eine andere Lösung gefunden, die auf allen Clients funktioniert.

Ein bisschen über NSS
In meinem Fall habe ich Centos 7 in Verbindung mit sssd verwendet. Nichts verhindert jedoch die Verwendung von WinBind. Die Hauptsache ist, ein Auto in der Domäne und ein Kerberos-Ticket zu haben. Ich werde nicht darüber schreiben, wie das gemacht wird, weil Ich werde nichts Neues sagen, es gibt viele gute Handbücher im Netzwerk.
Die Einstellungen von
/etc/nsswitch.conf
geändert werden, wenn dies noch nicht geschehen ist. Je nachdem, welches Modul verwendet wurde, müssen Sie
sss oder winbind anstelle von module_name eingeben. Parameterbeschreibungen können mit
man nsswitch.conf
gelesen werden.
Folgende Einstellungen sollten ausreichen:
passwd: files module_name shadow: files module_name group: files module_name
Im Fall von sssd vergessen wir unter anderem nicht, dass in
/etc/sssd/sssd.conf
im Block [sssd] nss erwähnt werden sollte:
services = nss, pam
Was Winbind betrifft, fällt es mir schwer, etwas zu sagen, ich habe es nicht benutzt.
Das ultimative Ziel ist es, das richtige Ergebnis von getent zu erzielen. Überprüfen Sie, ob der Computer Informationen zu Domänenbenutzern und -gruppen empfangen kann:
> getent passwd kanlas kanlas:*:14123583:1257570:Kanlas Kanlasovich:/home/kanlas@example.com:/bin/bash > getent group VPN vpn:*:13821391:kanlas,igor,marina
HinweisWenn Sie sssd verwendet haben und Benutzerdaten nur mit dem vollständigen Namen (d. H. Kanlas@example.com) abgerufen werden, fügen Sie den Parameter use_fully_qualified_names = False
in sssd.conf im Domänenblock hinzu
Konfigurieren Sie PAM
Jetzt müssen Sie Ihr eigenes PAM-Modul erstellen. Um die system access.conf nicht zu verwenden, erstellen wir eine separate Datei, aus der die Zugriffsgruppe gelesen wird. Ich bin nicht so gut in PAM-Modulen, daher kann ich im folgenden Beispiel nicht sagen, ob alle Zeilen benötigt werden. Im Allgemeinen interessiert uns nur das
account required pam_listfile.so onerr=fail item=group sense=allow file=/etc/openvpn/auth/access-groups
.
Am einfachsten ist es, beispielsweise das Anmeldemodul zu nehmen und die gewünschte Zeile hinzuzufügen. Welches wurde getan.
Wir bekommen:
#%PAM-1.0 auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so auth substack system-auth auth include postlogin account required pam_listfile.so onerr=fail item=group sense=allow file=/etc/openvpn/auth/access-groups account include system-auth password include system-auth session required pam_selinux.so close session required pam_loginuid.so session optional pam_console.so session required pam_selinux.so open session required pam_namespace.so session optional pam_keyinit.so force revoke session include system-auth session include postlogin -session optional pam_ck_connector.so
Wir legen es in
/etc/pam.d
und benennen es nach unserem Ermessen.
In
/etc/openvpn/auth/access-groups
, angegeben im Modul, wird die Zugriffsgruppe hier geschrieben, Sie können Ihren Pfad angeben, wenn Sie möchten. Sie müssen den Namen der Gruppe (Common Name) mit der Domäne angeben. In meinem Fall habe ich dort
VPN@example.com geschrieben .
Es bleibt OpenVPN zu erklären, dass es PAM verwenden muss. Wir haben die folgenden Zeilen in die Serverkonfiguration eingefügt:
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so __pam username-as-common-name
Unterschiedliche Verteilungen können unterschiedliche Pfade haben! Suchen Sie nach einer Datei nach Pfad oder verwenden Sie find.Die Verwendung des Parameters Benutzername als allgemeiner Name beruht auf der Tatsache, dass ansonsten der
im Zertifikat angegebene Name an den Server gesendet wird , nachdem der Client über einen Auth-User-Pass verfügt
.Fügen Sie in der Client-Konfiguration die Zeile hinzu
auth-user-pass
Wenn dieses Setup abgeschlossen ist, können Sie testen.
Wir entfernen das Benutzerzertifikat
Jetzt haben wir eine Autorisierung über die Domain und das Benutzerzertifikat ist nutzlos. Es scheint eine logische Entscheidung zu sein, es aufzugeben. Mobile Clients haben jedoch Probleme damit, eine solche Konfiguration einfach nicht zu akzeptieren, und Desktop-Clients fluchen böswillig, obwohl sie funktionieren. Zunächst konfigurieren wir den Server neu, sodass kein Zertifikat mehr erforderlich ist.
verify-client-cert none
Als nächstes fügen wir der Client-Konfiguration hinzu
setenv CLIENT_CERT 0
Das war's, jetzt schwören Kunden nicht mehr auf ein Zertifikat. Es ist lustig, dass diese Option im
Frage- und Antwortbereich für iOS versteckt ist. Ich habe nicht auf iOS getestet, aber Android sowie MacOS (
Beta-Client ) und Windows akzeptieren diese Einstellungen mit einem Knall. Nur ein
OpenVPN-Client eines
Drittanbieters unter Android kann dies noch nicht (zum Zeitpunkt der Erstellung dieses Artikels konnten sie ihn bereits beheben).