Samba als Mitgliedsserver im ADS ================================ .. highlight:: shell-session Datum: 04.07.2017, überarbeitet am 25.04.2021 ZIEL: Anbindung von Samba an eine Windows-Domäne mit Active Directory BETEILIGTE MASCHINEN: 1. Windows 2008 oder 2012 Server (Hostname: "W2K8", IP-Adresse: 10.20.30.10) 2. Debian 9 oder 10 ("sMember", IP-Adresse: 10.20.30.11) Darüberhinaus gibt es noch einen weiteren Linux-Rechner (IP-Adresse: 10.20.30.1), der als Standardgateway dient. Vorbereitungen -------------- **Auf dem Windows-Server** Es sollten die IP-Adressierungsinformationen am besten fest hinterlegt werden. Der Controller wird dabei später während der Provisionierung zum DNS-Server gemacht, so dass dessen Zonen automatisch in das lokale Active Directory integriert werden können. Eine bebilderte Anleitung zum Einrichten eines DCs ist z.B. unter https://www.petri.com/installing-active-directory-windows-server-2008 zu finden. Dieser Server erhält in unserem Szenario folgende Einstellungen: - Rechnername: W2K8 - IP-Adresse: 10.20.30.10 - Netzwerkmaske: 255.255.255.0 - Standardgateway: 10.20.30.1 - Nameserver: 127.0.0.1 (Wird während des dcpromo-Vorganges automatisch gesetzt) - FQDN der Domäne: HAUS1.SITE (Kann während des dcpromo-Vorganges konfiguriert werden) **Auf Debian Linux, dem künftigen Member Server:** Wir setzen hierfür am besten ein stabiles Debian ein (Stretch oder Buster). Die erforderlichen Softwarepakete werden in diesem Tutorial beim jeweiligen Konfigurationsschritt installiert - also erst, wenn sie benötigt werden. Das hat den Vorteil, dass die Fragen des Konfigurationsassistenten im Zusammenhang mit dem Softwarepaket und der passenden Aufgabenstellung stehen. .. warning:: **Software vorab installieren** Weil die /etc/resolv.conf später so abgeändert werden muss, dass der erste Nameserver auf den Windows-Domänencontroller zeigt, dieser aber u.U. kein DNS-Forwarding anbietet (oder selber gar kein Internet hat), ist es ratsam, alle erforderlichen Pakete vorab im "download only" Modus zu installieren: :: apt-get install -d ntp krb5-user samba smbclient libnss-winbind winbind Nehmen wir nun die Netzwerkkonfiguration vor, sie sieht hier folgendermaßen aus: :: $# grep -v ^# /etc/network/interfaces source /etc/network/interfaces.d/* auto lo iface lo inet loopback auto enp0s3 iface enp0s3 inet static address 10.20.30.11/24 gateway 10.20.30.1 $# $# cat > /etc/resolv.conf < nameserver 10.20.30.10 > search haus1.site > EOF $# $# cat /etc/resolv.conf nameserver 10.20.30.10 search haus1.site $# Hostname ändern: :: $# echo sMember > /etc/hostname $# vi /etc/hosts $# $# grep sMember /etc/hosts 127.0.1.1 sMember.haus1.site sMember $# $# hostname sMember Letztere Zeile war eine einfache und zugleich auch universelle Möglichkeit, den Hostnamen zur Laufzeit zu setzen; das Skript '/etc/init.d/hostname.sh' existiert bei Debian 9 nicht mehr. Funktioniert die Namensauflösung korrekt? :: $# host w2k8 w2k8.haus1.site has address 10.20.30.10 $# $# host w2k8.haus1.site w2k8.haus1.site has address 10.20.30.10 $# $# ping -c3 w2k8.haus1.site PING w2k8.haus1.site (10.20.30.10) 56(84) bytes of data. 64 bytes from 10.20.30.10: icmp_seq=1 ttl=128 time=0.183 ms 64 bytes from 10.20.30.10: icmp_seq=2 ttl=128 time=0.243 ms 64 bytes from 10.20.30.10: icmp_seq=3 ttl=128 time=0.231 ms --- w2k8.haus1.site ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 11037ms rtt min/avg/max/mdev = 0.183/0.219/0.243/0.025 ms $# $# ip neigh 10.20.30.3 dev enp0s3 lladdr 08:00:27:e0:f3:80 REACHABLE 10.20.30.1 dev enp0s3 lladdr 08:00:27:ae:11:9d STALE 10.20.30.10 dev enp0s3 lladdr 08:00:27:1e:99:c1 STALE $# Der FQDN der DNS-Domäne muss übereinstimmen: :: $# domainname -d haus1.site $# $# dnsdomainname haus1.site $# $# hostname -d haus1.site $# NTP-Server ---------- Für Kerberos benötigen wir synchron laufende Rechneruhren. Bei Zeitdifferenzen ab 5 min verweigert er sonst seinen Dienst. Zuerst wird deshalb der Net Time Protokoll-Server installiert: :: $# apt-get install ntp Eigentlich ist keine Konfiguration weiter erforderlich, falls aber die öffentlichen NTP-Server wegen Firewallrestriktionen nicht direkt erreichbar sind, deaktivieren wir in der Datei '/etc/ntp.conf' alle vordefinierten Server-Zeilen und fügen anstelle dessen den NTP-Server des Intranets hinzu:: server 192.168.2.150 Schließlich muss der Deamon seine Konfiguration neu einlesen: :: $# systemctl restart ntp Ob der Zeitserver richtig arbeitet, klärt das Kommando ``ntpq -p`` auf, das die Peers mit ihren Eigenschaften ausgibt. Ruft man es in Abständen immer wieder mal auf, kann es Tendenzen zu Funktion und Qualität aufzeigen. Ein '*****' am Anfang einer Zeile markiert die Referenzzeitquelle, mit der eine Synchronisation gerade stattfindet, ein '**+**' kennzeichnet weitere gute Zeitquellen, die als Kandidat in Frage kommen. In der Spalte **offset** steht die Zeitdifferenz zwischen der Referenzzeit und der eigenen Systemzeit in Millisekunden. Alternativ kann als NTP-Server auch Chrony oder der Systemd eigene Service ``systemd-timesyncd`` verwendet werden. Letzteren kann man mit ``timedatectl set-ntp true`` aktivieren. ACHTUNG: Dieser Systemd-Dienst verweigert den Start, wenn der Zeitservice von VirtualBox läuft bzw. 'ntp' oder 'chrony' installiert sind! Kerberos-Client --------------- Installation des Kerberos-Clients :: $# apt-get install krb5-user Bei Debian 9 startet sich dabei ein Assistent, dem einige Angaben zu machen sind: * Voreingestellter Realm für Kerberos Version 5: **HAUS1.SITE** (= FQDN der Domäne) * Kerberos-Server für Ihren Realm: **w2k8.haus1.site** (= FQDN des DCs oder seine IP-Adresse) * Administrations-Server für Ihren Kerberos-Realm: **w2k8.haus1.site** (= FQDN des DCs oder seine IP-Adresse) Bei Debian 10 startet sich ähnlich wie bei Ubuntu kein Assistent mehr, die Angaben müssen händisch in die Datei ``/etc/krb5.conf`` geschrieben werden: a) Unterhalb von ``[libdefaults]`` ist "default_realm" in Zeile 2 auf folgenden Wert anzupassen: :: default_realm = HAUS1.SITE b) Unterhalb von ``[realms]`` (Zeile 22) folgendes einfügen: :: HAUS1.SITE = { kdc = w2k8.haus1.site admin_server = w2k8.haus1.site } Testweise kann sich nun schon mit dem Kerberos-Server, der im Windows Domänencontroller integriert ist, verbunden werden. Achtung: der Realm-Name muss immer in großen Lettern geschrieben werden: :: $# kinit administrator@HAUS1.SITE $# klist -l Principal name Cache name -------------- ---------- administrator@HAUS1.SITE FILE:/tmp/krb5cc_0 $# Treten Fehlermeldungen auf, können die Einstellungen manuell in der ``/etc/krb5.conf`` korrigiert werden. Zur Kontrolle kann folgendes eine Hilfe darstellen: :: $# grep -i haus1.site /etc/krb5.conf default_realm = HAUS1.SITE HAUS1.SITE = { kdc = w2k8.haus1.site admin_server = w2k8.haus1.site $# Samba-Server ------------ Falls noch nicht geschehen, müssen jetzt die Pakete für Samba mitsamt Winbind installiert werden: :: $# apt-get install samba smbclient libnss-winbind winbind Am besten, wir erzeugen eine neue Konfigurationsdatei, die alte wird vorher gesichert: :: $# mv /etc/samba/smb.conf /etc/samba/smb.conf.old Wir legen nun eine neue Konfigurationsdatei an: :: $# vi /etc/samba/smb.conf Sie erhält den folgenden Inhalt. Dabei sind 'workgroup' und 'realm' an die Bezeichnungen der Windows-Domäne anzupassen. Die Angabe 'workgroup' steht hier für den Kurznamen der Domäne (= Domänenteil eines Benutzernamens, z.B. 'HAUS1\\otto'). Beim 'realm' wird dagegen der FQDN der Domäne (= der Teil nach dem '@' eines Benutzernamens, z.B. otto@HAUS1.SITE) in großen Lettern notiert, hier aber in der Samba-Konfiguration darf er auch klein geschrieben werden. Und dies ist der Inhalt der Datei: .. highlight:: bash :: [global] # Grundlegende Einstellungen workgroup = haus1 realm = haus1.site server string = Samba Domain Member server role = member server smb ports = 445 encrypt passwords = yes # Parameter für winbind und NTLM winbind enum users = yes winbind enum groups = yes winbind use default domain = yes winbind nested groups = yes client use spnego = yes client ntlmv2 auth = yes # Mapping für winbind und 'getent passwd' idmap config *:backend = tdb idmap config *:range = 10000-90000 # Kerberos-Einstellungen, u.a. für 'getent' dedicated keytab file = /etc/krb5.keytab kerberos method = secrets and keytab winbind refresh tickets = Yes # Probleme mit dem Browsing vermeiden domain master = no local master = no preferred master = no os level = 20 host msdfs = no [storage] comment = file store path = /srv/storage read only = no Stellen wir nun sicher, das das Verzeichnis mit entsprechenden Rechten existiert: .. highlight:: shell-session :: $# mkdir -m 777 /srv/storage Anpassung der /etc/nsswitch.conf ------------------------------------ Nun folgt die Konfiguration des Name Service Switches: :: $# vi /etc/nsswitch.conf Am Ende der passwd- und group-Zeile muss 'winbind' angefügt werden, so dass es dann so aussieht (bei Debian 10 das Wörtchen "systemd" einfach durch 'winbind' ersetzen):: passwd: files winbind group: files winbind An dieser Stelle ist es ratsam, schon mal 'nmbd' und 'smbd' neu zu starten, mit dem Neustarten von 'winbindd' können wir aber noch warten, da dieser Daemon dabei nur Fehler ausgeben würde. Seit Samba 4 muss nämlich zuvor das Joining erfolgt sein: :: $# systemctl restart nmbd smbd Aufnahme in die Windows-Domäne ------------------------------- Endlich ist die Einbindung der Samba-Maschine dran. Mit der Kommandozeile ``net ads join -U administrator`` sollte das jetzt problemlos gelingen. Das Ganze sieht wie folgt aus: :: $# net ads join -U administrator Enter administrator's password: Using short domain name -- HAUS1 Joined 'SMEMBER' to dns domain 'haus1.site' $# Falls das Joining mit "net_update_dns_internal: Failed to connect to our DC!" fehlschlägt, liegt das meist daran, dass der Linux-Member-Server nicht genau den selben FQDN wie der Windows-AD-Server besitzt. Als Tipp zur Behebung dieses Fehlers: Die Ausgabe vom Linux-Kommandos 'domainname -d' muss mit der Ausgabe des Windows-Kommandos 'echo %USERDNSDOMAIN%' identisch sein! Nun folgt das Starten/Neustarten aller drei Daemons: :: $# systemctl restart nmbd smbd winbind Jetzt ist es auch möglich, über 'winbind' mit der Domäne zu kommunizieren, z.B. mittels: :: $# klist -k Keytab name: FILE:/etc/krb5.keytab KVNO Principal ---- -------------------------------------------------------------------------- 2 host/smember.haus1.site@HAUS1.SITE 2 host/SMEMBER@HAUS1.SITE 2 host/smember.haus1.site@HAUS1.SITE 2 host/SMEMBER@HAUS1.SITE 2 host/smember.haus1.site@HAUS1.SITE 2 host/SMEMBER@HAUS1.SITE 2 host/smember.haus1.site@HAUS1.SITE 2 host/SMEMBER@HAUS1.SITE 2 host/smember.haus1.site@HAUS1.SITE 2 host/SMEMBER@HAUS1.SITE 2 SMEMBER$@HAUS1.SITE 2 SMEMBER$@HAUS1.SITE 2 SMEMBER$@HAUS1.SITE 2 SMEMBER$@HAUS1.SITE 2 SMEMBER$@HAUS1.SITE $# $# wbinfo -t checking the trust secret for domain HAUS1 via RPC calls succeeded $# Und wir können 'getent' benutzen, um Unix UND Windows-Domänenbenutzer anzeigen zu lassen, 'aduser' ist ein testweise auf dem Windows AD DC angelegter Benutzer: :: $# getent passwd | grep -i 'admin\|aduser' gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin administrator:*:10000:10004:Administrator:/home/HAUS1/administrator:/bin/false aduser:*:10003:10004:aduser:/home/HAUS1/aduser:/bin/false $# Abschließend versuchen wir als Domänenbenutzer von "HAUS1" auf einem Windows-Rechner, der sich ebenfalls in der Domäne befindet, Dateien in unserer Samba-Freigabe anzulegen. **HINWEISE zur Fehlersuche:** - Früher war es erforderlich, dass der im MS ADS integrierte DNS Server vorübergehend für die Aufnahme des Samba-Servers "Nicht sichere und sichere" dynamische Updates erlauben musste. Dies ist nicht mehr erforderlich. - Auf dem Samba-Server muss als Nameserver in der /etc/resolv.conf ein DNS-Server der Domäne eingetragen werden, am besten ist der MS Domänencontroller selbst dazu heranzuziehen. Dies haben wir in unserem Szenario auch getan. - Probleme mit smbd eingrenzen (Daemon im Foreground): ``systemctl stop smbd && smbd -SFd3 --no-process-group`` (bei Debian 10 ist speziell dieses '--no-process-group' erforderlich) - Probleme mit winbind und getent eingrenzen (Daemon im Foreground): ``systemctl stop winbind && winbindd -SFind1`` (So kann z.B. ``Fatal Error: UID range full!!`` oder ``idmap range not specified for domain *`` auftauchen, was mittels der smb.conf-Direktive ``idmap config *:range`` behoben werden kann.) - Versucht man vor dem Domänen-Joining *smbd* und *winbind* mit der obigen, bereits angepassten smb.conf (neu) zu starten, erntet man nur Fehler. Dasselbe liegt nach einem *reboot* mit neuer Config aber ohne erfolgreichen *join* vor. Was aber kein Problem darstellt: das Joining funktioniert sogar ohne laufende Daemons. - Manchmal ist es nötig, mit ``net ads leave -U administrator`` die Linux-Maschine aus der Datenbank des Active Directories herauszunehmen. Dabei werden aber die A-Records im DNS des Windows-DCs nicht mit gelöscht - also bitte per Hand durchführen. Ansonsten gelingt ein erneutes Joining nicht! **HINWEISE und Links zum Weiterstudieren:** - https://wiki.debian.org/AuthenticatingLinuxWithActiveDirectory - https://wiki.samba.org/index.php/Samba_Member_Server_Troubleshooting - http://admin-reminder.blogspot.de/2011/10/debian-squeeze-samba-domain-member.html