Raspberry Pi als zusätzlicher Samba4 Domänencontroller in einer vorhandenen Windows Server 2008 R2 Domäne

Aus Znilwiki
Wechseln zu: Navigation, Suche

Vorwort

Tut euch einen Gefallen - und lest die Anleitung erstmal im Schnelldurchgang durch und fangt dann erst an! So könnt ihr eine eventuell alte, vorhandene Samba Version vorher entfernen bzw. seht schon mal wie lange das ganze dauern wird!

Important.png
Hinweis: Ja, das ganze funktioniert nach dieser Anleitung. Die Windows-Clients nutzen den Samba4 auch brav als Anmeldeserver etc. im abgesetzten Standort. ABER ... er haut mir ständig auf dem echten Windows Domänencontroller das Ereignisprotokoll mit Fehlermeldungen zu das ich für mich persönlich beschlossen habe den Samba4 Domänencontroller wieder sterben zu lassen. Als eigenständigen Samba Server bzw. als Member-Server werde ich diesen weiter betreiben, nicht aber als echten Domänencontroller




Ausgangslage

Ein vorhandener Windows Server 2008 R2 Domänencontroller an Standort A:

  • Domäne: znil.local
  • IP: 192.168.42.80
  • DNS-Name: exchange.znil.local


Mit diesem soll ein Banana Pi mit Raspbian verbunden werden an Standort B:

  • IP: 192.168.1.241
  • DNS-Name: bananapi.znil.local


Der Banana Pi soll dabei ebenfalls Domänencontroller und DNS Server für den Standort B werden sowie CIFS (Windows-)Freigaben bereitstellen.

Important.png
Hinweis: Nehmt euch ein paar Stunden Zeit dafür ...




Voraussetzungen installieren

Wenn wir von einem frischen Raspbian ausgehen:

  • Betriebssystem aktualisieren:
apt-get update
apt-get upgrade
apt-get dist-upgrade
  • Sonstige Pakete installieren:
apt-get install dnsutils bind9 bind9-doc bind9utils
apt-get install git-core libacl1-dev libblkid-dev libgnutls28-dev build-essential 
apt-get install libattr1-dev  libgnutls-dev libreadline-dev python-dev python-dnspython
apt-get install gdb pkg-config libpopt-dev libldap2-dev libbsd-dev attr krb5-user docbook-xsl
apt-get install libpam0g-dev libncurses5-dev libglib2.0-dev




host Datei anpassen

In der

nano /etc/hosts

muss unser neuer Samba Server mit DNS-Namen, NetBIOS-Namen und seiner IP-Adresse aufgeführt sein:

192.168.1.241 bananapi.znil.local bananapi




DNS anpassen

nano /etc/resolv.conf

mit folgendem Inhalt:

domain znil.local
search znil.local
nameserver 192.168.42.80

Natürlich dann mit eurer Domäne.
Als DNS-Server tragt den schon vorhandenen Domänencontroller ein!
Später können wir den Server selbst hinzufügen - nachdem alles geklappt hat.



Kerberos anpassen

nano /etc/krb5.conf

und gleich den ersten Abschnitt wie folgt anpassen (vom Rest der Datei lasst die Finger!)

[libdefaults]
       default_realm = ZNIL.LOCAL
       dns_lookup_realm = true
       dns_lookup_kdc = true

Wichtig: Domäne in GROßBUCHSTABEN!!!!!



DNS und Kerberos testen

Ein vorheriger Reboot kann an dieser Stelle nicht schaden.
prüfen wir zunächst ob er einen Domänencontroller für unsere Domäne finden kann:

nslookup znil.local

gibt bei mir folgendes zurück:

Server:         192.168.42.80
Address:        192.168.42.80#53

Name:   znil.local
Address: 192.168.42.80

Müsste eine Liste aller DNS-Server innerhalb der Domäne bringen, mit

nslookup

startet Ihr eine interaktive Sitzung - gebt folgende Zeilen dann ein:

set q=srv
_ldap._tcp.dc._msdcs.znil.local

Es müsste eine Ausgabe der vorhandenen Domänencontroller folgen:

Server:         192.168.42.80
Address:        192.168.42.80#53

_ldap._tcp.dc._msdcs.znil.local service = 0 100 389 exchange.znil.local.

mit

exit

Verlassen wir nslookup wieder.
Prima. Testen wir nun ob wir uns eine Anmeldung holen können:

kinit administrator

Er müsste nach dem Passwort des Administrators eurer Domäne fragen:

Password for administrator@ZNIL.LOCAL:

Danach prüfen wir ob wir ein Sitzungs-Ticket haben:

klist

Ausgabe:

Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@ZNIL.LOCAL

Valid starting       Expires              Service principal
01.03.2015 20:49:06  02.03.2015 06:49:06  krbtgt/ZNIL.LOCAL@ZNIL.LOCAL
        renew until 02.03.2015 20:49:00

Prima, wir sind soweit, kann mit Samba losgehen!



Samba Quellen herunterladen

Important.png
Hinweis: Ja, Samba kann man auch "einfach" mit apt-get installieren ... da hat es aber bei mir rumgezickt wie nichts gutes mit jeder Menge Fehlern ... die alle schon im aktuelleren Release Versionen behoben waren. Ergo: Die Version ist zu ALT! Also habe ich die aktuellste Version direkt aus den Quellen heruntergeladen und selbst kompiliert

cd /usr/src
git clone git://git.samba.org/samba.git samba-master

Das dauerte bei mir an einem DSL 16.000 Anschluss ca. 12 Minuten (auf einem Banana Pi, nicht Raspberry Pi).



Samba kompilieren und installieren

Zunächst müssen wir die Konfiguration vor der Kompilierung vornehmen:

cd /usr/src/samba-master
./configure --enable-debug

Das kann mal gern so 9 (Banana Pi) bis 15 Minuten dauern (Raspberry Pi).

Im Anschluss das eigentliche Komplieren:

make

Das dauert nun zwischen 2 (Banana Pi) und 4 Stunden (Raspberry Pi)
Jetzt noch installieren:

make install

was nochmals ca. 1 Stunde dauert (obwohl es eigentlich nur ein kopieren von Dateien ist)


Suchpfad anpassen

Damit die Samba-Befehle von überall gefunden werden passen wir den Suchpfad an:

nano /etc/profile

Ergänzt die PATH wie folgt:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/samba/bin:/usr/local/samba/sbin"




Samba Version überprüfen

Gebt folgende beiden Befehle ein:

smbclient -V
samba -V

Ausgabe bei mir:

Version 4.3.0pre1-GIT-3b48274

Bei beiden(!) Befehlen sollte die exakt gleiche Versionsnummer herauskommen.
Falls die Nummern unterschiedlich sind oder noch 4.1er Nummern habt Ihr noch Samba oder dem Samba-Client über apt-get installiert - weg damit:

apt-get remove smbclient samba
Face-wink.png
Tipp: Das könnt Ihr natürlich auch schon vorher machen, also bevor Ihr anfangt Samba herunter zu laden und zu kompilieren. Beide Befehle sollten dann nicht gefunden werden!




Bind9 Version überprüfen

Samba verwendet Bind um darin die DNS-Informationen zu speichern - genau wie ein richtiger Windows Domänencontroller. Alle Einträge werden später zwischen dem richtigen DC und unserem Samba4 DC repliziert.
Fragt eure installierte Bind9 Version ab (Ip eures Raspberry Pi#s verwenden!):

dig -t txt -c chaos VERSION.BIND @192.168.1.241

Ausgabe bei mir:

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> -t txt -c chaos VERSION.BIND @192.168.1.241
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34458
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;VERSION.BIND.                  CH      TXT

;; ANSWER SECTION:
VERSION.BIND.           0       CH      TXT     "9.8.4-rpz2+rl005.12-P1"

;; AUTHORITY SECTION:
VERSION.BIND.           0       CH      NS      VERSION.BIND.

;; Query time: 44 msec
;; SERVER: 192.168.1.241#53(192.168.1.241)
;; WHEN: Sun Mar  1 21:17:43 2015
;; MSG SIZE  rcvd: 79

Die Version ist also

9.8.4


Dann bearbeiten wir die

nano /usr/local/samba/private/named.conf

und entfernen das # vor der Zeile mit eurer Bind-Version - bei mir sieht die Datei also nun so aus:

# This DNS configuration is for BIND 9.8.0 or later with dlz_dlopen support.
#
# This file should be included in your main BIND configuration file
#
# For example with
# include "/usr/local/samba/private/named.conf"; 

#
# This configures dynamically loadable zones (DLZ) from AD schema
# Uncomment only single database line, depending on your BIND version
#
dlz "AD DNS Zone" {
    # For BIND 9.8.x
     database "dlopen /usr/local/samba/lib/bind9/dlz_bind9.so";

    # For BIND 9.9.x
    # database "dlopen /usr/local/samba/lib/bind9/dlz_bind9_9.so";

    # For BIND 9.10.x
    # database "dlopen /usr/local/samba/lib/bind9/dlz_bind9_10.so";
};




Samba4-Bind einbinden

Wir bearbeiten die Bind-Konfigurationsdatei:

nano /etc/bind/named.conf

und hängen als letzte Zeile folgendes an:

include "/usr/local/samba/private/named.conf";

Damit verarbeitet Bind in Zukunft auch unsere Samba4-DNS-Datei



IPv6 in Bind deaktivieren

In Raspbian ist IPv6 ab Werk deaktiviert. Entweder aktiviert und konfiguriert Ihr IPv6 - oder Ihr deaktiviert es auch im Bind wie folgt:

nano /etc/default/bind9

und ändert die Zeilen wie folgt (Option -4 setzen)

# run resolvconf?
RESOLVCONF=no

# startup options for the server
OPTIONS="-4 -u bind"




Samba4 in die Domäne aufnehmen

Am besten bootet Ihr nun euren Pi einmal neu durch - damit er die Pfadänderungen und Änderungen an Bind auch alle übernommen hat.
Dann testen wir vorab nochmals ob wir uns ein Anmelde-Ticket holen können am vorhandenen Domänencontroller:
Testen wir nun ob wir uns eine Anmeldung holen können:

kinit administrator

Er müsste nach dem Passwort des Administrators eurer Domäne fragen:

Password for administrator@ZNIL.LOCAL:

Danach prüfen wir ob wir ein Sitzungs-Ticket haben:

klist

Ausgabe:

Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@ZNIL.LOCAL

Valid starting       Expires              Service principal
01.03.2015 20:49:06  02.03.2015 06:49:06  krbtgt/ZNIL.LOCAL@ZNIL.LOCAL
        renew until 02.03.2015 20:49:00

Sehr schön - nun nehmen wir unseren neuen Server in die Domäne auf:

samba-tool domain join znil.local DC -Uadministrator --realm=znil.local --dns-backend=BIND9_DLZ

Das dauert einen Moment.
nach Abschluss sollte der Samba4 Server im Active Directory und unter Standorte und Dienste auftauchen.

Der Samba Server läuft aber nun noch nicht - es fehlt unter anderem ein Start- und Stop Skript.



Start-/Stop Skript anlegen

Wir erstellen eine Datei

nano /etc/init.d/samba4

mit folgendem Inhalt:

#! /bin/sh
 
### BEGIN INIT INFO
# Provides:          samba-ad-dc
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: start Samba daemons for the AD DC
### END INIT INFO
 
#
# Start/stops the Samba daemon (samba).
# Adapted from the Samba 3 packages.
#
 
PIDDIR=/usr/local/samba/var/run
SAMBAPID=$PIDDIR/samba.pid
 
# clear conflicting settings from the environment
unset TMPDIR
 
# See if the daemon and the config file are there
test -x /usr/local/samba/sbin/samba -a -r /usr/local/samba/etc/smb.conf || exit 0
 
. /lib/lsb/init-functions
 
case "$1" in
        start)
                SERVER_ROLE=`/usr/local/samba/bin/samba-tool testparm --parameter-name="server role"  2>/dev/null | tail -1`
                if [ "$SERVER_ROLE" != "active directory domain controller" ]; then
                    exit 0
                fi
 
                if init_is_upstart; then
                        exit 1
                fi
 
                # CVE-2013-4475
                KEYFILE=/var/lib/samba/private/tls/key.pem
                if [ -e $KEYFILE ]
                then
                                KEYPERMS=`stat -c %a $KEYFILE`
                                if [ "$KEYPERMS" != "600" ]
                                then
                                                echo "wrong permission on $KEYFILE, must be 600"
                                                echo "samba will not start (CVE-2013-4475)"
                                                echo "Removing all tls .pem files will cause an auto-regeneration with the correct permissions."
                                                exit 1
                                fi
                fi
 
                log_daemon_msg "Starting Samba AD DC daemon" "samba"
                # Make sure we have our PIDDIR, even if it's on a tmpfs
                install -o root -g root -m 755 -d $PIDDIR
 
                if ! start-stop-daemon --start --quiet --oknodo --exec /usr/local/samba/sbin/samba -- -D; then
                        log_end_msg 1
                        exit 1
                fi
 
                log_end_msg 0
                ;;
        stop)
                if init_is_upstart; then
                        exit 0
                fi
                log_daemon_msg "Stopping Samba AD DC daemon" "samba"
 
                start-stop-daemon --stop --quiet --pidfile $SAMBAPID
                # Wait a little and remove stale PID file
                sleep 1
                if [ -f $SAMBAPID ] && ! ps h `cat $SAMBAPID` > /dev/null
                then
                        # Stale PID file (samba was succesfully stopped),
                        # remove it (should be removed by samba itself IMHO.)
                        rm -f $SAMBAPID
                fi
 
                log_end_msg 0
 
                ;;
        restart|force-reload)
                if init_is_upstart; then
                        exit 1
                fi
                $0 stop
                sleep 1
                $0 start
                ;;
        status)
                status_of_proc -p $SAMBAPID /usr/local/samba/sbin/samba samba
                exit $?
                ;;
        *)
                echo "Usage: /etc/init.d/samba-ad-dc {start|stop|restart|force-reload|status}"
                exit 1
                ;;
esac
 
exit 0


Dann noch

chmod 755 /etc/init.d/samba4
update-rc.d samba4 defaults

An dieser Stelle am besten noch mal neu starten


Gruppenrichtlinien und NETLOGON

So, der Samba Server läuft und Ihr habt die Freigaben

\\Server\netlogon
\\Server\sysvol

In netlogon liegen normalerweise die Anmeldeskripte, unter sysvol die Einstellungen der Gruppenrichtlinien (und auch wieder den netlogon Ordner)
Leider kann Samba4 im Moment diese Dateien noch nicht mit replizieren - deshalb müssen wir den Inhalt dieser Ordner von Hand kopieren.
Ich habe mir dazu in der Aufgabenplanung auf dem Windows 2008 R2 Domänencontroller folgenden Job hinterlegt:

Aktion:                           Programm Starten
Programm/Skript:                  C:\Windows\System32\Robocopy.exe
Argumente hinzufügen (optional):  C:\Windows\SYSVOL\sysvol\znil.local \\192.168.1.241\SYSVOL\znil.local /MIR /W:5 /R:1
Starten in (optional):            C:\Windows\System32\

Das ganze läuft einmal die Stunde unter dem Account eines Domänen-Administrators.



Server selbst DNS-Servern hinzufügen

Wir haben nun auch auf unserem Samba4 Server einen DNS-Server für die Domäne. Also fügen wir diesen auch noch lokal hinzu:
Die

/etc/resolv.conf

können wir dazu zwar bearbeiten, nach einem Neustart ist das dann aber wieder weg. Deshalb nutzen wir den Befehl resolvconf:

apt-get install resolvconf
nano /etc/resolvconf/resolv.conf.d/base

und einen weiteren Server anhängen - letzte Zeile ist unser eigener Server!

domain znil.local
search znil.local
nameserver 192.168.42.80
nameserver 192.168.1.241

Im Anschluss ein

resolvconf -u




Replikation überprüfen

Die Replikation zwischen unserem Samba4 Server und dem Windows 2008 R2 Server prüfen wir wie folgt:

samba-tool drs showrepl

Ausgabe:

Meisenweg\BANANAPI
DSA Options: 0x00000001
DSA object GUID: 52ec8892-467e-4386-83c2-b9f7c625bac6
DSA invocationId: 4fff1897-7adf-407c-b0e8-85751f413ade

==== INBOUND NEIGHBORS ====

DC=znil,DC=local
        Europa\EXCHANGE via RPC
                DSA object GUID: dab1b16c-2ac0-4083-ae95-3a58c039c57e
                Last attempt @ Sun Mar  1 21:52:57 2015 CET was successful
                0 consecutive failure(s).
                Last success @ Sun Mar  1 21:52:57 2015 CET

CN=Schema,CN=Configuration,DC=znil,DC=local
        Europa\EXCHANGE via RPC
                DSA object GUID: dab1b16c-2ac0-4083-ae95-e3a58c039c57
                Last attempt @ Sun Mar  1 21:52:55 2015 CET was successful
                0 consecutive failure(s).
                Last success @ Sun Mar  1 21:52:55 2015 CET

CN=Configuration,DC=znil,DC=local
        Europa\EXCHANGE via RPC
                DSA object GUID: dab1b16c-2ac0-4083-ae95-e3a58c039c57
                Last attempt @ Sun Mar  1 21:52:55 2015 CET was successful
                0 consecutive failure(s).
                Last success @ Sun Mar  1 21:52:55 2015 CET

DC=ForestDnsZones,DC=znil,DC=local
        Europa\EXCHANGE via RPC
                DSA object GUID: dab1b16c-2ac0-4083-ae95-e3a58c039c57
                Last attempt @ Sun Mar  1 21:52:46 2015 CET was successful
                0 consecutive failure(s).
                Last success @ Sun Mar  1 21:52:46 2015 CET

DC=DomainDnsZones,DC=znil,DC=local
        Europa\EXCHANGE via RPC
                DSA object GUID: dab1b16c-2ac0-4083-ae95-e3a58c039c57
                Last attempt @ Sun Mar  1 21:52:52 2015 CET was successful
                0 consecutive failure(s).
                Last success @ Sun Mar  1 21:52:52 2015 CET

==== OUTBOUND NEIGHBORS ====

==== KCC CONNECTION OBJECTS ====

Connection --
        Connection name: 0e63dcae-79aa-47f0-9b75-8feff278c2ce
        Enabled        : TRUE
        Server DNS name : EXCHANGE.znil.local
        Server DN name  : CN=NTDS Settings,CN=EXCHANGE,CN=Servers,CN=Europa,CN=Sites,CN=Configuration,DC=znil,DC=local
                TransportType: RPC
                options: 0x00000001
Warning: No NC replicated for Connection!

Die letzte Warnung könnt Ihr übrigens ignorieren: https://wiki.samba.org/index.php/FAQ#Message:_Warning:_No_NC_replicated_for_Connection.21



Replikation manuell starten

Eine sofortige Replikation stoßen wir wie folgt von Hand an:

samba-tool drs replicate bananapi.znil.local exchange.znil.local CN=Schema,CN=Configuration,DC=znil,DC=local

Ziel ist dabei bananapi.znil.local - unser Samba4 Server - der sich von exchange.znil.local die Daten holt.
Die Domäne etc. (alle znil.local) müsst Ihr natürlich anpassen.
Ausgabe:

Replicate from exchange.znil.local to bananapi.znil.local was successful.




Freigaben anlegen und mit Rechten versehen

Dazu schaut am besten auf die offizielle Doku:

https://wiki.samba.org/index.php/Setup_and_configure_file_shares_with_Windows_ACLs




Quellen und nützliche Links

Bei dieser Anleitung habe ich mich unter anderem folgender Quellen bedient:

https://wiki.samba.org/index.php/Join_a_domain_as_a_DC
https://wiki.samba.org/index.php/Samba4/InitScript
http://www.duschblog.de/2013/08/09/samba4-auf-dem-raspberry-pi/

Diese Links könnten euch für weitere Fragen nützlich sein:

https://wiki.samba.org/index.php/FAQ




--Bernhard Linz 21:05, 1. Mär. 2015 (CET)


Kommentare

Kommentare


Alexander

472 Tage zuvor
Punkte 0+-

Sehr gute Anleitung, leider habe ich ein Problem mit den Netzwerk/DSN Einstellungen.

Nach jedem Neustart des Raspberry wird die Datei resolv.conf geleert und ich muss die Einträge manuell hinzufügen. Was läuft da schief?

Markus

471 Tage zuvor
Punkte 0+-

einfach hier schauen: manpages.ubuntu.com/manpages/lucid/man8/resolvconf.8.html

in neueren debian/ubuntu versionen wird resolv.conf nicht mehr direkt bearbeitet sondern mit dem tool resolvconf. Man findet da auch die Dateien welche von resolv.conf befüllt werden. Diese kann man auch per hand einfach editieren, dann sollten die DNS Server auch nach dem reboot wieder in resolv.conf auftauchen.

BLinz

471 Tage zuvor
Punkte 0+-
Danke für den Hinweis, habe es oben in der Anleitung angepasst!

Alexander

471 Tage zuvor
Punkte 0+-

resolvconf habe ich angepasst, allerdings wird in die resolv.conf zuerst die IP-Adresse des Standardgateways reingeschrieben, damit Funktion die Domainauflösung (nslookup nicht). Desweiteren (oder deshalb?) funktioniert das domainjoin nicht: ERROR(runtime): uncaught exception - (8439, 'WERR_DS_DRA_BAD_DN') Deutet auf einen DNS-Fehler mit BIND hin.

Bin aber vollkommen ratlos, wo das Problem liegt. Vielleicht hat jemand einen Tipp?

Markus

470 Tage zuvor
Punkte 0+-
wie gesagt schau dir die dateien an die resolvconf "beschreibt", die kann man per hand anpassen und die Einträge ordnen. Dann sollten die Einträge auch korrekt in der resolv.conf auftauchen.

Markus

470 Tage zuvor
Punkte 0+-

Die Frage ist eher wieso ist dein Gateway in der resolv.conf? Es sei denn der Gateway ist auch dein DNS dann kann der da auch als nameserver auftauchen.

prinzipiell ist es so, was in base steht ist auf alle fälle in resolv.conf. Was in head steht wird vor die base einträge in resolv.conf gesetzt. Was in tail steht wird hinter die einträge von base in resolv.conf geschrieben.

wenn da garnichts zu machen geht könnte man einen resolv.conf file auch irgendwo vorbereiten und beim booting nach der resolvconf abarbeitung da hinkopieren aber das wäre glaub ich die letzte alternative :)

stefan

110 Tage zuvor
Punkte 0+-
Vielen Dank für die Anleitung. Wie kann ich das selbst kompilierte Samba aktualisieren ohne das die Konfiguration überschrieben wird?

BLinz

110 Tage zuvor
Punkte 0+-
Im Normalfall einfach neue Version über die alte Kompilieren. Eigentlich sollten Konfigurationsdateien dabei nicht überschrieben werden. Beim ersten mal halt ein backup machen von den Dateien

stefan

82 Tage zuvor
Punkte 0+-
ja, geht so - hätte ich aber besser gelassen. Die Replikation zu einem WIN 2003 AD klappt jetzt aber nicht mehr, mit Version 4.5.3 (DsReplicaSync failed (-1073610699, 'The operation cannot be performed.')
Kommentar hinzufügen:
Gebe hier einen Kommentar ein. Du kannst einen beliebigen Namen oder eine Email-Adresse als Namen angeben.

Wenn du dich einloggst wird automatisch dein Benutzername genommen.
Du kannst KEINE Links hier posten - das wurde wegen anhaltender Werbung deaktiviert. Sobald ein '''http://''' im Text vorkommt wird der Kommentar verworfen Alle anderen Steuerzeichen oder Funktionen wie < br > werden ausgefiltert - zum Posten von Quelltexten ist diese Funktion hier nicht geeignet.

Falls du dringendere Fragen hast kannst du auch das Support-System von znil.net nutzen unter support.znil.net