OpenVPN und Active Directory (Kerberos ohne Benutzerzertifikate)

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 

Hinweis
Wenn 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).

Source: https://habr.com/ru/post/de469583/


All Articles