Samba und AD-Domäne einrichten

Damit Samba als Active Directory-Domain Controller arbeiten kann, müssen wir diese Domäne jetzt erstellen und einrichten («provisionieren»).

samba-tool domain provision

Wir verwenden dazu für diese Anleitung folgende Daten:

Beispiel
Domänenname («Realm»)
ad.example.com
Windows-Domäne
AD
Serverrolle («Server Role»)
dc
DNS-Backend
BIND9_DLZ
Administrator-Paßwort
(Mindestens acht Zeichen, sowohl Groß- und Kleinbuchstaben als auch Zahlen)

Nach diesen Eingaben wird die Domäne provisioniert, alle Datenbanken und Netzfreigaben erzeugt und die DNS-Einträge aktualisiert. Das dauert einen kleinen Moment und sieht im Erfolgsfall etwa so aus:

Rot markiert sind hier noch die Hinweise auf zwei nötige, gleich folgende Konfigurationsanpassungen.

Kerberos-Konfiguration übernehmen

Falls schon eine eigene Kerberos-Konfiguration existiert, muß der Inhalt der von Samba erzeugten Konfigurationsdatei /usr/local/samba/private/krb5.conf bestehende /etc/krb5.conf integriert werden. Ansonsten kann die aktuellen Konfiguration gesichert und danach einfach ersetzt werden:

mv /etc/krb5.conf /usr/local/samba/private/krb5.conf.original
cp /usr/local/samba/private/krb5.conf /etc

Domäne in Bind integrieren und DNS-Dienst übernehmen

Zunächst muß in der Datei /usr/local/samba/private/named.conf die für unsere Bind-Version
9.9 zutreffende Konfiguration aktiviert und die andere auskommentiert werden:

  1. dlz "AD DNS Zone" {
  2.     # For BIND 9.8.0
  3.     # database "dlopen /usr/local/samba/lib/bind9/dlz_bind9.so";
  4.  
  5.     # For BIND 9.9.0
  6.     database "dlopen /usr/local/samba/lib/bind9/dlz_bind9_9.so";
  7. };

Anschließend wird diese Samba-Konfiguration in der Datei /usr/local/bind9/etc/named.conf eingebunden. Im folgenden Beispiel ist das die letzte Zeile:

  1. include "/etc/bind/named.conf.options";
  2. include "/etc/bind/named.conf.local";
  3. include "/etc/bind/named.conf.default-zones";
  4. include "/usr/local/samba/private/named.conf";

Warnung

Bind-Konfigurationsdateien sind sehr empfindlich, was falsche Schreibweisen angeht!

Optional: DNS-Weiterleitung

Um den Pi zu entlasten, können wir ihm einen Forwarder zur Verfügung stellen. Dazu kann ein öffentlicher DNS, der lokale Internetrouter und weitere Server in /usr/local/bind9/etc/named.conf.options ergänzt werden:

  1. options {
  2.  
  3.         // ... andere Optionen ...
  4.  
  5.         forward first;
  6.         forwarders {
  7.                 192.168.1.1; // Lokaler Router
  8.                 8.8.8.8; // Google oder ein beliebiger anderer
  9.                 // Beliebige weitere externe DNS-Server.
  10.                 // Jede Adresse muß mit einem Semikolon enden.
  11.         };
  12.         notify no;
  13. };

Wer statt Bind den eingebauten Samba-DNS nutzen will, kann bzw. muß stattdessen einen(!) Forwarder in der /usr/local/samba/etc/smb.conf eintragen:

  1. [global]
  2.     ; ...
  3.     ; andere Optionen
  4.     ; ...
  5.     dns forwarder = 192.168.1.1
  6.     allow dns updates = nonsecure and secure

x64-Support vorbereiten

Um später Druckertreiber auch für x64-Systeme hochladen zu können, müssen wir aufgrund von Windows-Konventionen einen x64-Server betreiben. Das ist der Pi zwar nicht, aber mit der folgenden Anpassung der /usr/local/samba/etc/smb.conf können wir ihn gegenüber Windows-Clients so tun lassen, als ob:

  1. [global]
  2.     ; ...
  3.     ; andere Optionen
  4.     ; ...
  5.     spoolss: architecture = Windows x64

Konfiguration prüfen

Nach einem Neustart beider Dienste ist es Zeit für ein paar Testkommandos:

service bind9custom restart
service samba4 start
host -t SRV _ldap._tcp.ad.example.com. localhost; host -t SRV _kerberos._udp.ad.example.com. localhost

Dabei sollte eine Antwort wie

Name: localhost
Address: 127.0.0.1#53
Aliases:

_ldap._tcp.ad.example.com has SRV record 0 100 389 raspberrypi.ad.example.com.
Name: localhost
Address: 127.0.0.1#53
Aliases:

_kerberos._udp.ad.example.com has SRV record 0 100 88 raspberrypi.ad.example.com.

herauskommen. Wenn das der Fall ist, kann unser Domain Controller die Rolle des lokalen Nameservers übernehmen.

DNS-Einstellungen/DHCP-Server umstellen

Sofern der Pi nicht bereits im lokalen Netz als Primärer DNS bekannt ist, wird das jetzt nachgeholt. Am einfachsten ist das mit DHCP, wo wir nur den DNS-Eintrag am DHCP-Server (bzw. in den DHCP-Optionen des Routers) anzupassen brauchen.

Wer kein DHCP nutzt, muß nun als DNS-Server-Adresse für jeden Computer im LAN die IP des Pi eintragen.

Als Suchdomäne (je nach System manchmal auch nur Domain o.ä.) wird, entweder am DHCP-Server oder an jedem Client einzeln, der Name unserer Domäne (hier: ad.example.com) eingetragen.

In beiden Fällen ist noch einmal ein Neustart fällig.

NTP testen

Spätestens jetzt sollte der NTP-Client, den wir zuvor bereits installiert haben, richtig funktionieren. Das läßt sich relativ einfach überprüfen:

ntpq -p

sollte etwas ähnliches wie dies ausgeben:

(Eine Liste mit verschiedenen Zeitservern, deren lokaler Zeit und weiteren Informationen.)

Kerberos testen

Zuletzt testen wir noch, ob Kerberos wie gewünscht funktioniert, denn ohne diesen Dienst würde der gesamte Controller niemals richtig arbeiten:

kinit administrator

Nach Eingabe des beim Provisionieren vergebenen Paßworts wird nun ein «Berechtigungsausweis» («Ticket») erstellt. Ob das funktioniert, überprüfen wir mit:

klist

Das Ergebnis sollte in etwa so aussehen:

Bei Erfolg wird eine Übersicht ausgegeben, in der mindestens das gerade durch kinit erzeugte Testticket zu sehen ist.

Admin-Privilegien vergeben

Zwei wichtige Rechte müssen jetzt noch an die Gruppe «Domain Admins» vergeben werden. Der Namenspräfix AD wird dabei ggf. durch den tatsächlichen (Kurz-)Namen der Domäne ersetzt. Anschließend wird das Ergebnis kontrolliert:

net rpc rights grant 'AD\Domain Admins'\
  SePrintOperatorPrivilege SeDiskOperatorPrivilege\
  -Uadministrator
net rpc rights list accounts -Uadministrator

Als Paßwort dient wiederum das bei der Provisionierung erstellte. Bei Erfolg sieht das Ergebnis ungefähr so aus:

Bei Erfolg werden die neu erstellten Privilegien mit aufgelistet.

Kommentare

Bei mir sind alle Schritte ohne Auffälligkeiten durchgelaufen. Allerdings bekomme ich beim Einrichten die Fehlermeldung: samba-tool: Kommando nicht gefunden. Was kann ich dagegen tun?

Vielleicht hast du einfach an einer Stelle vergessen, die Umgebungsvariable PATH anzupassen? Das muss an einigen Stellen in der Anleitung gemacht werden. Samba-tool hieß in Samba 3 noch anders, existiert in den Standard-Debian-Pfaden als m. E. noch nicht (was in dem Fall auch gut ist, sonst hättest du womöglich jetzt ganz andere, versionsbedingte Probleme ;)).

Ich habe die Anleitung bis soeben verfolgt, nur stoße ich jetzt an ein Problem. Und zwar kommt bei mir immer command not foound. Ich weiß nicht genau warum. Wenn ich als pi user samba eingebe, kommt das mir die rechte fehlen, aber wenn ich sudo samba oder samba als sudo ausführe, kommt immer, das das kommando nicht gefunden wurde. Der Pfad wurde aber aufjedenfall hinnzugefugt, wie ich mit
$ sudo sh -c 'echo $PATH'
bereits bestätigen konnte.

Hoffe auf baldige Hilfe,
Colin

Also „sudo /path/to/samba“ bzw. mal als root versucht?

Hallo,

ich bekomme beim Domain provisioning folgende Fehlermeldungen:
pi@pi /etc/init.d $ samba-tool domain provision
Realm [INTRANET.SCHIELE.LOCAL]: INTRANET.SCHIELE.LOCAL
Domain [INTRANET]: SCHIELE
Server Role (dc, member, standalone) [dc]: dc
DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]: BIND9_DLZ
Administrator password:
Retype password:
ERROR(<type 'exceptions.OSError'>): uncaught exception - [Errno 13] Permission denied: '/usr/local/samba/tmpxRADVw'
File "/usr/local/samba/lib/python2.7/site-packages/samba/netcmd/__init__.py", line 175, in _run
return self.run(*args, **kwargs)
File "/usr/local/samba/lib/python2.7/site-packages/samba/netcmd/domain.py", line 366, in run
file = tempfile.NamedTemporaryFile(dir=os.path.abspath(os.path.dirname(lp.get("private dir"))))
File "/usr/lib/python2.7/tempfile.py", line 454, in NamedTemporaryFile
(fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
File "/usr/lib/python2.7/tempfile.py", line 235, in _mkstemp_inner
fd = _os.open(file, flags, 0600)

Was könnte die Ursache sein.

Gruss

Nils Schiele

Probier mal ein sudo vor dem Befehl.

Ich bekam den gleichen Fehler, konnte diesen Schritt mittlerweile aber erfolgreich abschliessen.
Angemeldet als Benutzer 'pi' Hatte ich keine Berechtigung, in /usr/local/samba/tmpXXXX zu schreiben. Es wird wohl wärend des provisioning dort temporär (?) eine Datei mit zufälligem Namen angelegt.
Ein vorgestelltes sudo half auch nciht weiter; ich bekam den Hinweis, "/bin/bash: samba-tool: Kommando nicht gefunden." Gleiches galt, wenn ich mit mit "sudo su" als root anmeldete.
Dies wiederum lag daran, daß die PATH-Umgebungsvariable (als Root) nicht auf die Samba (und Bind9) Binary-Pfade zeigt.
PATH="/usr/local/bind9/sbin:/usr/local/bind9/bin:$PATH"
PATH="/usr/local/samba/sbin:/usr/local/samba/bin:$PATH"
half dann weiter. Anschliessend lässt sich das Provisioning durchführen.

Danke für das Posten der Lösung!

Hallo David,

hab es jetzt geschaft bis hierhin ohne Fehler zu kommen. leider Funktioniert das aussetzen der Domain nicht.
Ich kriege nicht raus woran es liegt :S

root@raspberrypi:/etc/init.d# samba-tool domain provision
Realm: DERNEK.TR
Domain [DERNEK]:
Server Role (dc, member, standalone) [dc]: DC
DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]: BIND9_DLZ
Administrator password:
Retype password:
ERROR(<class 'samba.provision.ProvisioningError'>): Provision failed - ProvisioningError: server role (DC) should be one of "active directory domain controller", "member server", "standalone server"
File "/usr/local/samba/lib/python2.7/site-packages/samba/netcmd/domain.py", line 398, in run
use_rfc2307=use_rfc2307, skip_sysvolacl=False)
File "/usr/local/samba/lib/python2.7/site-packages/samba/provision/__init__.py", line 1912, in provision
raise ProvisioningError('server role (%s) should be one of "active directory domain controller", "member server", "standalone server"' % serverrole)

root@raspberrypi:/etc/init.d#

Oh, komisch. Kann es sein dass du beim Kompilieren bei Samba ein neueres Branch erwischt hast? Irgendwie tauchen so viele Fehler auf die ich nicht hatte, das ist komisch.

Mal ganz am Rande, braucht ihr denn wirklich Bind als Backend? Ich hatte zwischendurch nämlich auch noch mit dem internen DNS experimentiert, das ging ganz gut. Ich glaube inzwischen kann man Samba 4 nämlich ganz gut über die normalen Paketmanager bekommen.

Vielleicht ist die Anleitung ja auch nach einem Jahr echt schon überholt in Teilen…

nach mindestens 30x neu aufsetzen der SD Karte und jedes Mal knapp 6 stunden Kompillieren konnte ich nun alles ohne Fehler erstellen. Auch die Domain konnte ich ohne Probleme erstellen. leider bekomme ich jetzt eine Fehlermeldung wenn ich den folgenden Test durchführe "host -t SRV _ldap._tcp.DERNEK.TR. localhost; host -t SRV _kerberos._udp.DERNEK.TR. localhost"

root@raspberrypi:~# service bind9custom restart
[....] Stopping domain name service...: bind9rndc: connect failed: 127.0.0.1#953: timed out
waiting for pid 7433 to die
. ok
[ ok ] Starting domain name service...: bind9.
root@raspberrypi:~# service samba4 start
[ ok ] Starting Samba AD DC daemon: samba.
root@raspberrypi:~# host -t SRV _ldap._tcp.DERNEK.TR. localhost; host -t SRV _kerberos._udp.DERNEK.TR. localhost
;; connection timed out; no servers could be reached
;; connection timed out; no servers could be reached

Gruß

Orhan

achso.. hätte fast vergessen.... :D

natürlich kann ich auf den BIND verzichten. denke das samba da ausreicht. Habe mir gerade die SD Karte neu Formatiert :)) werde mir gleich das SAMBA Paket von Sernet installieren.

Hoffe das ich es hinbekomme....(werde berichten)

Gruß

Orhan

Hallo,
seit heute stürzt bei mir der bind andauernd ab. Starte ich den bind neu, läuft es wieder für ein paar Minuten.

Hier der Absturzeintrag vom Log:
###
Dec 22 18:53:13 raspberry01 named[7369]: samba_dlz:
Dec 22 18:53:13 raspberry01 named[7369]: samba_dlz: ldb: ltdb: tdb(/usr/local/samba/private/dns/sam.ldb.d/DC=DOMAINDNSZONES,DC=AD,DC=DAHEIM,DC=LOCAL.ldb): tdb_transaction_cancel: no transaction
Dec 22 18:53:13 raspberry01 named[7369]: samba_dlz:
Dec 22 18:53:13 raspberry01 named[7369]: samba_dlz: failed to commit a transaction for zone ad.daheim.local
Dec 22 18:53:13 raspberry01 named[7369]: sdlz closeversion on origin ad.daheim.local failed
Dec 22 18:53:13 raspberry01 named[7369]: db.c:463: ENSURE(*versionp == ((void *)0)) failed
Dec 22 18:53:13 raspberry01 named[7369]: exiting (due to assertion failure)
sdlz closeversion on origin ad.daheim.local failed
###

Ich hab keine Ahnung wo ich den Fehler suchen soll - Tipp?

Bei mir kommt, wenn ich den kinit Befehl ausführen möchte folgender fehler:
kinit: Cannot resolve servers for KDC in realm "FELIXSCHROUFF.HOME" while getting initial credentials
beim host Befehl ist alles gut

Hast du eine Lösung dafür gefunden? Ich become den selben Fehler und sehe nicht woran es liegt...

Okay bei mir hat folgendes geholfen:
1) Folgenden Befehl weglassen
mv /etc/krb5.conf /usr/local/samba/private/krb5.conf.original
cp /usr/local/samba/private/krb5.conf /etc

2) Wenn o.g. Behehl schon ausgeführt, dann rückgängig machen
cp /usr/local/samba/private/krb5.conf.original /etc/krb5.conf

3) In der /etc/krb5.conf die Domain (Realm), Servername und Windows Domäne in GROSSBUCHSTABEN schreiben
Bswp AD.EXAMPLE.COM

Danke noch für die Lösung!

Hier wurde diese Frage schon einmal gestellt, aber die Antwort darauf ist wenig zufriedenstellend. Ich bin noch einmal alle Umgebungsvariablen durch gegangen, muss aber feststellen das ich alles nach Anleitung gemacht habe.
Die Eingabe "update-rc.d samba4 dafaults" wirft die folgende Meldung aus: "using dependency based sequencing".
Ich denke das Problem liegt hier. Kann es aber nicht sicher sagen. Ich würde mich sehr freuen wenn Sie dort in kürze einen Lösungsvorschlag geben könnten. Möchte nicht unbedingt umsonst über mehrerer Stunden Kompiliert haben.

Danke für dieses super Tutorial. Bei mir hat die Installation ohne Probleme funktioniert und seither läuft mein Raspberry als DC. Viel stromsparender als der alte PC.

Danke!

dass die Anleitung immer noch was gut ist, sie ist ja nicht mehr ganz neu. Ich würde dir (und allen) raten, habe ich glaube ich auch irgendwo dazugeschrieben: Schön Backups machen. Auf Dauer ist so eine SD-Karte und das kleine Teil zumindest mit einer größeren Last irgendwann an seiner Grenze. Also Redundanz (was ja gerade mit AD prima geht) würde ich hier für jeden ernsthafteren Einsatz vielleicht doch empfehlen.

Danke für dein Lob, so macht das Schreiben immer etwas mehr Spaß. Und viel Spaß mit deinem AD.

Hallo,

mein DNS läuft und konnte auch immer mit dem Windows Remote Tool konfiguriert werden.
Jetzt steht mir das Windows nicht mehr zur Verfügung und ich finde auf dem gesamten Rpi nicht die Dateien wo die Zonen gespeichert sind. keine db.0.168.192 oder db.home.local. Ich habe mit find nach den Dateien gesucht und mit grep -r -i '0.168.192.in-addr.arpa' / alle dateien durchsucht, ich finde einfach nichts.

Kann hier jemand helfen?

Schöne Grüße
Thomas

Hallo!
Erstmal meine Respekt da in diesem Tutorial jede Menge Arbeit steckt!
Bis zu diesem Punkt lief alles wie beschrieben...

Ich habe jetzt leider folgendes Problem:
"kinit administrator" liefert folgendes -> kinit: Cannot find KDC for realm "MYLITTLEPI.LOCAL" while getting initial credentials

Der Fehler liegt aber vermutlich in der Netzwerkkonfiguration, weil in /etc/resolv.conf steht folgendes:
domain fritz.box
nameserver 192.168.178.1

Ich habe versucht das ganze zu ändern (über webmin oder SSH-Konsole), nach einem reboot ist alles weg. Ebenso verschwinden Änderungen die ich in /etc/network/interfaces mache (z.B. dns-nameserver).

Steh jetzt im BIND9/SAMBA4-Wald und seh vor lauter Bäumen nix mehr ;)

1/
Änderungen in der resolv.conf wird wirklich nicht nachhaltig. Die steht auch in der Datei selbst, wenn ich es richtig in Erinnerung habe.

2/
Änderungen kannst du jedoch in zweifacher Weise erreichen:
1. Paket resolvconf installieren und anpassen
2. Die Daten statisch (wie hier beschrieben zuweisen).
Ich habe es jedoch einfach anders gemacht. Mein Router=Gateway hat die 10.0.1.1 und meine DNS Server 10.0.1.2/3. Diese DNS Server lasse ich über DHCP an alle Clients und Server zuweisen. So haben die DNS Server selbst sich selbst als DNS Server. Und dies ist genau die Anforderung.
In deinem Beispiel ist der Server=Gateway 192.168.178.1 und der DNS Server vielleicht 192.168.178.2. Lasse über deine DHCP Server den DNS Server (..178.2) verteilen.

3/
Anschließend sollte deine Domain ("MYLITTLEPI.LOCAL") entsprechend aufgelöst werden und das Problem sollte dann entsprechend beseitigt sein.
Ansonsten melde dich mal, dann ist ggf. noch die /etc/krb5.conf anzupassen.

Hatte ich auch relativ viele Probleme Kerberos vernünftig zum laufen zu bringen, die auch einen Neustart und den Ausfall eines DNS übersteht.

Hallo auch bei mir hat alles so weit tadellos geklappt. Nur das ich jetzt auch vor dem Problem stehe und der Befehl "samba-tool domain provision " nicht ausfürbar ist da Kommando nicht gefunden. Giebt es hierzu schon eine Lösung?