Inhaltsverzeichnis
Letzte Aktualisierung am 16.09.2024, 11:09:00 Uhr
In diesem Beitrag beschreibe ich die Anmeldung an der NetBox mit Hilfe eines Identitätsanbieter (IdP). Als IdP werde ich Microsoft Active Directory Federation Service (AD FS) nutzen. Hintergrund ist, dass ich AD FS bereits für eine Vielzahl von Anwendungen einsetze, wie z.B. Exchange Server, Nextcloud, Apache Guacamole, etc. Stichwort – Synergie.
Vorbereitungen
In diesem Artikel setze ich folgende Rahmenbedingungen vor:
- Ein Microsoft Active Directory (AD), welches mindestens einen DC hat.
- Eine Private Key Infrastructure (PKI), um Zertifikate für AD FS bereit zu stellen können.
- Ein Microsoft Active Directory Federation Service (AD FS), dessen Mitglied im AD ist.
- Ein Microsoft Web Application Proxy (WAP) in der DMZ, welcher
- mit dem AD FS verbunden und konfiguriert ist.
- über ein öffentliches Zertifikat für den FQDN des AD FS verfügt.
- Ein Server in der DMZ oder bei einem Webhoster, auf dem als Betriebssystem Ubuntu Server 22.04 LTS, auf dem NetBox in der Version 3.7.4 installiert ist.
- Die NetBox ist über netbox01.lab03.daniel.wydler.eu erreichbar.
- Die NetBox Instanz ist über HTTPS erreichbar.
Nachstehend ein Netzwerkplan:
tbd
Anlegen von Gruppen im Active Directory
Der Grundsatzgedanke ist, dass die Mitgliedschaft von Gruppen in der NetBox über Gruppen im Active Directory gesteuert wird. Damit ist es auch möglich den Zugriff auf die NetBox zu steuern.
Ich lege daher exemplarische zwei Gruppen an:
- gg-netbox-logon-allow: Benutzer müssen Mitglied dieser Gruppe sein, um sich überhaupt an NetBox anmelden zu dürfen.
- gg-netbox-administrators: Benutzer dieser Gruppen erhalten in NetBox die Rolle „Superuser“.
So sieht das in meiner Testumgebung LAB03 aus:
Es können natürlich weitere AD Gruppen angelegt werden.
Konfiguration von Microsoft AD FS
Die AD FS Management Konsole starten und links im Navigationsbereich „Relying Party Trusts“ auswählen. Anschließend auf der rechten Seite den Eintrag „Add Relaying Party Trust“ auswählen.
Hinweis: Bitte den Slash am Ende des FQDN weglassen! |
Danach müssen mehrere Transforms Rules in der Claim Policy eingerichtet werden. Damit die richtigen Werte von AD FS bzw. Active Directory an NetBox weitergereicht werden.
Diesen Schritt muss für jede AD Gruppe wiederholt werden. Damit der Claim entsprechend alle Gruppenmitgliedschaften enthält.
Der Wert vom Parameter „Outgoing claim value“ entspricht später in der NetBox der Name der Gruppe. In diesem Fall heißt die Gruppe in der NetBox „administrators“. |
Des Weiteren muss die Funktion „RelayState“ aktiviert werden, falls das noch nicht geschehen ist. Dazu auf dem AD FS Server eine PowerShell starten und folgenden Befehl ausführen.
Set-AdfsProperties -EnableRelayStateForIdpInitiatedSignOn $true
Wird kein Text ausgegeben, wurde der Befehl erfolgreich ausgeführt.
Konfiguration von NetBox
Die Installation von NetBox ist mit Hilfe folgende Artikels geschehen (Link). Die nachfolgenden Dateien und Konfigurationen stammen von diesem GitHub Fork.
SAML Plugin einrichten
Die Datei local_requirements.txt mit den erforderlichen Python Module anlegen.
NetBox 3.x | NetBox 4.x |
Die Datei /opt/netbox/netbox/netbox/samlgetgroups.py mit folgenden Inhalt anlegen.
NetBox 3.x | NetBox 4.x |
Wer bis hierher aufmerksam war, wird Zeile 19 in Auge stechen. Über dieses Skript erfolgt die Zuordnung zwischen AD Gruppe und NetBox Gruppe. Damit verbunden auch die Zuordnung der Rechte für Benutzer „Staff“ und „Superuser“ In der NetBox. Das bedeutet, dass das Skript natürlich mit dem Kopieren der Zeilen 19-23 bequem erweitert werden kann.
Zu guter Letzt muss die bestehende Datei /opt/netbox/netbox/netbox/configuration.py angepasst werden. Zuerst wird aber eine Sicherung der Datei angelegt.
cp /opt/netbox/netbox/netbox/configuration.py /opt/netbox/netbox/netbox/configuration.py.$(date '+%Y-%m-%d_%H-%M-%S')
Danach die Datei /opt/netbox/netbox/netbox/configuration.py in einem Editor (z.B. vim) öffnen.
Zuerst folgende Zeilen (ab 193) auskommentieren bzw. löschen:
Nachstehend die Konfiguration für die SAML Authentifizierung. Diese muss an die Gegebenheiten anpasst werden.
# Remote authentication support EMOTE_AUTH_ENABLED = True REMOTE_AUTH_BACKEND = 'social_core.backends.saml.SAMLAuth' SOCIAL_AUTH_SAML_SP_ENTITY_ID = 'https://netbox01.lab03.daniel.wydler.eu' SOCIAL_AUTH_SAML_SP_PUBLIC_CERT = '' SOCIAL_AUTH_SAML_SP_PRIVATE_KEY = '' SOCIAL_AUTH_SAML_ORG_INFO = { "en-US": { "name": "Netbox", "displayname": "Netbox", "url": "https://netbox01.lab03.daniel.wydler.eu" } } SOCIAL_AUTH_SAML_TECHNICAL_CONTACT = { "emailAddress": "email@emailaddress.com", "givenName": "Technical" } SOCIAL_AUTH_SAML_SUPPORT_CONTACT = { "emailAddress": "email@emailaddress.com", "givenName": "Support" } SOCIAL_AUTH_SAML_ENABLED_IDPS = { "SAML": { "entity_id": "http://login.lab03.daniel.wydler.eu/adfs/services/trust", "url": "https://login.lab03.daniel.wydler.eu/adfs/ls/", "attr_user_permanent_id": "name_id", "attr_username": "name_id", "attr_first_name": "attr_first_name", "attr_last_name": "attr_last_name", "attr_email": "attr_email", "attr_full_name": "attr_full_name", "x509cert": "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" } } REMOTE_AUTH_AUTO_CREATE_USER = True SOCIAL_AUTH_SAML_EXTRA_DATA = [("http://schemas.xmlsoap.org/claims/Group", "Group")] SOCIAL_AUTH_SAML_SECURITY_CONFIG = {"requestedAuthnContext": False} SOCIAL_AUTH_REDIRECT_IS_HTTPS = True SOCIAL_AUTH_PIPELINE = ( 'social_core.pipeline.social_auth.social_details', 'social_core.pipeline.social_auth.social_uid', 'social_core.pipeline.social_auth.social_user', 'social_core.pipeline.user.get_username', 'social_core.pipeline.social_auth.associate_by_email', 'social_core.pipeline.user.create_user', 'social_core.pipeline.social_auth.associate_user', 'netbox.authentication.user_default_groups_handler', 'social_core.pipeline.social_auth.load_extra_data', 'social_core.pipeline.user.user_details', 'netbox.samlgetgroups.set_role', )
Erläuterungen und Hinweise:
- Der Parameter „SOCIAL_AUTH_SAML_ENABLED_IDPS -> x509cert“ enthält das Zertifikat im base64 Format, welches vom AD FS als Token-decrypting verwendet werden.
- Der Parameter „SOCIAL_AUTH_SAML_ORG_INFO -> url“ und „SOCIAL_AUTH_SAML_SP_ENTITY_ID“ entspricht dem Wert, welcher im AD FS, im Bereich Relay Party Trusts für den Eintrag „netbox01.lab03.daniel.wydler.eu“ als „Identifiers“ angegeben wurde.
- Bitte die FQDN „login.lab03.daniel.wydler.eu“ durch eueren Wert für die AD FS Instanz ersetzen.
Sind alle Anpassungen erfolgt wird die Konfiguration in der Datei /opt/netbox/netbox/netbox/configuration.py, ab Zeile 193 eingefügt.
Damit die Änderungen wirksam werden muss das Skript upgrade.sh ausgeführt werden.
/opt/netbox/upgrade.sh
Ist der Prozess ohne Fehler durchgelaufen, muss ein Service der NetBox neu gestartet werden.
systemctl restart netbox netbox-rq
Sonstiges
Ruft man danach die UI der NetBox in Browser auf, so erscheint folgende Anmeldemöglichkeiten.
Möchte man die Anmeldeoptionen unterdrücken und stattdessen direkt zu SAML weitergeleitet werden, muss die Nginx Konfiguration um folgenden Abschnitt hinzugefügt werden.
# Weiterleitung zur SAML Anmeldung location /login/ { return 301 $scheme://$http_host/oauth/login/saml/?next=%2F&idp=SAML; }
Nach der Änderung nicht vergessen den Nginx neu zu starten.
systemctl restart nginx.service
Dies ist erforderlich, damit die Änderung wirksam wird.
Funktionstest
In einem Browser der Wahl die UI der NetBox aufrufen. Ist in der Konfiguration von Nginx die direkte Weiterleitung auf den SAML aktiviert (siehe Kapitel Sonstiges), erscheint diese Abfrage nicht.
Somit geht es direkt mit der Anmeldung am AD FS weiter.
Anmeldung war erfolgreich und die definierten Rules und Claims werden ebenfalls angewendet.
Viel Spaß beim Ausprobieren. 🙂