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:

  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.

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:

  1. Unterhalb von [libdefaults] ist „default_realm“ in Zeile 2 auf folgenden Wert anzupassen:

default_realm = HAUS1.SITE
  1. 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!! 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: