Samba als Mitgliedsserver im ADS
Datum: 04.07.2017, überarbeitet am 25.04.2021
ZIEL: Anbindung von Samba an eine Windows-Domäne mit Active Directory
BETEILIGTE MASCHINEN:
Windows 2008 oder 2012 Server (Hostname: „W2K8“, IP-Adresse: 10.20.30.10)
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.
Warnung
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 <<EOF
> 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:
Unterhalb von
[libdefaults]
ist „default_realm“ in Zeile 2 auf folgenden Wert anzupassen:
default_realm = HAUS1.SITE
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:
[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:
$# 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!!
oderidmap range not specified for domain *
auftauchen, was mittels der smb.conf-Direktiveidmap 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: