Linux Container & Active Directory - Teil 2

Diese Blogeintrag-Serie erläutert wie einzelne LXC Container einer Domäne beitreten können. Außerdem wird aufgeführt, wie Nutzerbeschränkungen, Superuser-Rechte und SSH aktiviert und konfiguriert werden kann.

Blogserie:

  1. Übersicht

  2. Einbinden eines Containers in das Active Directory

  3. Rechteverwaltung und Fernzugriff

In diesem Teil der Blogserie gehen wir auf die Anforderungen für ein erfolgreiches Beitreten des Active Directories ein. Auch wird ausführlich auf die Vorgehensweise eingegangen.

Voraussetzungen

Einen Container erfolgreich in eine Active Directory Domäne aufzunehmen, benötigt einige Voraussetzungen sowohl an das Host-System als auch an LXC und den LXC-Container selbst. Zum einen muss LXC auf dem Host-System installiert ($sudo apt install LXC) und vorzugsweise mit den Standardwerten initialisiert ($lxc init) sein. Zum anderen muss der DNS-Server als auch die Domäne des Host-Systems manuell gesetzt werden. Erreichbar ist das unter Ubuntu basierten Linux-Distributionen durch das Ändern des Systemd-Resolvers ($sudo nano /etc/systemd/resolved.conf). In der Konfigurationsdatei sollen DNS, FallbackDNS und Domains auskommentiert sowie die für Ihre Umgebung korrekten Einstellungen eingetragen werden.

Abbildung 1: Inhalt von /etc/systemd/resolved.conf

Zuletzt stellt man sicher, dass die Systemzeit des Host-Systems korrekt eingestellt ist ($timedatectl) und ändert diese gegebenenfalls ($sudo timedatectl set-timezone <Zeitzone>). Eine Liste aller verfügbaren Zeitzonen kann mit $timedatectl list-timezones ausgegeben werden. Nach diesen Änderungen ist ein Systemneustart empfohlen.

Abbildung 2: Ausgabe vom Befehl $timedatectl einer korrekt eingestellten Systemzeit

Damit in unserer Umgebung ein Beitreten der Domäne möglich war, musste sichergestellt werden, dass IPv4 NAT für die LXC-Netzwerkbrücke aktiviert ist. Aufgrund des abgeschotteten Netzes von LXC und der Domäne, kann die Netzwerkbrücke zwischen LXC-Container und Intranet eine Netzwerkadressübersetzung durchführen. Dies ermöglicht es außerdem lokale IPs des Intranets in einem Container zu erreichen.
Ob IPv4 NAT aktiviert ist, kann anhand der Netzwerkbrücke von LXC überprüft werden, hierzu wird der Name dieser benötigt. Die Ausgabe von $lxc network list gibt den Namen der Brücke aus (meist lxdbr0).

Abbildung 3: Ausgabe von $lxc network list

Um die Konfiguration der Brücke zu überprüfen, kann sie mit $lxc network edit <NetzwerkBrückenName> geöffnet werden. In der geöffneten Textdatei finden sich weitere, für diesen Blogeintrag, nicht relevante Einstellungen wieder. Überprüft werden soll, dass unter config:
ipv4.nat auf „true“ gesetzt ist. Wird mit IPv6 gearbeitet, muss dementsprechend ipv6.nat auch auf „true“ gesetzt werden.

Abbildung 4: Einstellungen der LXC Netzwerkbrücke

Nun sind das Host-System und LXC bereit, aber der LXC-Container muss noch entsprechend modifiziert werden. Wechselt man in die Shell eines neu installierten Containers, sollen auch hier, wie vorhin am Host-System ausgeführt, die gleichen DNS, FallbackDNS und Domains Einstellungen in /etc/systemd/resolved.conf vorgenommen werden. Außerdem muss auch die Systemzeit des Containers mit $timedatectl überprüft und gegebenenfalls angepasst werden. Wie auch beim Host-System ist nach diesen Änderungen ein Neustart des Containers empfohlen. Hierzu kann mit $exit die Container-Shell verlassen und anschließend mit $lxc restart <ContainerName> der Container neugestartet werden. Zuletzt wechselt man wieder in den Container, um dort die weitere Konfiguration vorzunehmen.
Ab diesem Zeitpunkt sollte der Domain Controller der Domäne aus dem Container heraus erreichbar sein. Der Befehl $nslookup –type=srv _ldap._tcp.<Domäne> sollte eine Ausgabe mit einer Antwort, als auch der URL des DCs erzeugen.

Abbildung 5: Ausgabe des $nslookup Befehls mit der URL des DCs

Um mit einem Linux-System einer Domäne beizutreten, müssen vorerst einige Pakete installiert werden. Zuvor muss jedoch die Liste aller verfügbaren Pakete erstellt/heruntergeladen werden ($apt update). Das Installieren der Pakete kann anschließend mit $apt install -y sssd sssd-ad sssd-tools realmd adcli samba-common-bin libnss-sss libpam-sss packagekit angestoßen werden.

Der Befehl installiert SSSD, der System Security Services Daemon, welcher sich um das Authentisieren von Nutzern mit dem Active Directory, sowie die NutzerID-/GruppenID-Verwaltung im Container kümmert. Realmd wird genutzt, um die Konfiguration von SSSD automatisch auszuführen und gegebene Standards einzuhalten. adcli bietet Active Directoy Befehle wie $adcli info <Domäne> unter Linux an, welche unter anderem von Realmd genutzt werden, um der Domäne beizutreten. Packagekit ermöglicht Realmd weitere fehlende und benötigte Pakete beim Beitreten einer Domäne zu installieren.

Beitreten der Domäne

Da jetzt alle benötigten Pakete installiert sind, kann einer Domäne beigetreten werden. Als Erstes kann die korrekte Funktionalität der Pakete und die Erreichbarkeit des ADs mit $realm discover <Domäne> überprüft werden. Die Ausgabe des Befehls sollte den Domänennamen sowie den Authentisierungstyp und die benötigten Pakete angeben.

Abbildung 6: Domänen Informationen ausgegeben von $realm discover <Domäne>

Jetzt ist gesichert, dass eine Verbindung mit dem DC erfolgreich hergestellt und Informationen der Domäne abgefragt werden können als auch, dass die installierten Pakete korrekt funktionieren. Der Domäne kann anschließend mit $realm -join <Domäne> -U <DomänenAdmin> beigetreten werden. Hier ermöglicht der Schalter -U das Angeben eines Nutzernamens, welcher ein Domänenadministrator sein sollte.

In der Standardkonfiguration wird kein Nutzerverzeichnis für neue Nutzer erstellt, dies kann jedoch mit dem Befehl $pam-auth-update –enable mkhomdir aktiviert werden. Nach Aktivieren dieser Option wird beim Login eines noch nie am Container angemeldeten Nutzers automatisch ein Nutzerverzeichnis für diesen erstellt.

SSSD ID Umwandlung

Linux weist wie Windows, jedem Nutzer und Gruppe zur Benutzer- und Gruppenverwaltung eine eindeutige Identifikationsnummer zu. Hier muss beachtet werden, dass sich die Handhabung der beiden Betriebssysteme leicht unterscheidet. So muss die vom Active Directory gesendete Identifikationsnummer eines Nutzers in eine für Linux verständliche Identifikationsnummer durch SSSD umgewandelt werden. Hierbei entsteht jedoch ein Problem in LXC-Container. In der Standardkonfiguration von SSSD werden die Windows-IDs in sehr große Linux-IDs umgewandelt und ein Login ist nicht mehr möglich. Das Abrufen von AD-Nutzer ist über $getend passwd <Nutzer>@<Domäne> möglich. Zu erkennen sind hier zwei große Nummern, die NutzerID und die GruppenID.

Abbildung 7: Gruppen- und Nutzer-ID des Nutzers ist riesig

Um diesem Problem entgegenzuwirken, kann SSSD so konfiguriert werden, dass Windows-IDs auf kleinere Linux-IDs umgewandelt werden. Hierzu müssen 3 Zeilen in /etc/sssd/sssd.conf hinzugefügt werden und überprüft werden, dass ldap_id_mapping auf true gesetzt ist.

Abbildung 8: SSSD Einstellungen, um IDs auf einen kleineren Bereich zu beschränken

Diese 3 Zeilen beschränken die Größe der IDs auf Zahlen von 10.000 bis 50.000. Nach der Änderung muss die Konfigurationsdatenbank von SSSD gelöscht ($rm -rf /var/lib/sss/db/*) und SSSD neugestartet werden ($service sssd restart). Ruft man nun erneut die Nutzerinformationen mit $getent passwd <Nutzer>@<Domäne> auf, besitzt dieser viel kleinere Nutzers- und Gruppen-IDs im konfigurierten Bereich.

Abbildung 9: Nach der Änderung werden dem Nutzer und der Gruppe viel kleinere IDs zugewiesen

Durch diese Änderung sollte nun der Login eines AD-Nutzers im Container mit dem Befehl $login möglich sein. Es muss beachtet werden, dass sich ein Nutzer in der Standardkonfiguration nur mittels <NutzerName>@<Domäne> anmelden kann. Dieses Verhalten kann jedoch in /etc/sssd/sssd.conf verändert werden und überschreitet den Umfang dieses Blogeintrags.

Abbildung 10: Anmelden im Container mit einem AD-Nutzer durch $login und nutzen des Formats <NutzerName>@<Domäne>

Fehlerbehebung

Ist eine Anmeldung weiterhin nicht möglich, so muss die Domäne zuerst verlassen werden mit $realm leave und anschließend die Schritte zum Beitreten der Domäne und der ID-Umwandlung erneut ausgeführt werden.