Aktionen

Raspberry Pi als Samba4 Member Server Fileserver in einer vorhandenen Windows Server 2008 R2 Domäne

Aus znilwiki

Version vom 6. August 2017, 19:51 Uhr von BLinz2 (Diskussion | Beiträge) (Textersetzung - „<comments>“ durch „<comments />“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Vorwort

Nach meinem "Fiasko" mit Samba 4 als zusätzlichen Domänencontroller habe ich einen 2. Anlauf unternommen um den Raspberry Pi / Banana Pi zumindest als Member Server in mein Active Directory aufzunehmen.
Der Anfang ist ziemlich gleich, nach dem Kompilieren wird es aber anders - insbsondere nutzen wir hier andere Start/Stop-Skripte



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 als Member-Server / Fileserver für den Standort B werden und dann CIFS (Windows-)Freigaben bereitstellen.

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




Vorraussetzungen deinstallieren

Bevor wir anfangen Samba zu installieren (wir laden uns die Quellen herunter und kompilieren uns unsere eigene Version) sollten wir aufräumen - später verwirrt das nur wenn es zum Beispiel 2 Samba Versionen und 2 mal Winbind gibt:

apt-get remove samba smbclient samba-common
apt-get remove samba4
apt-get remove winbind
apt-get remove winbind4

Er sollte nun KEINEN Befehl mehr wie samba oder smbclient kennen!


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!



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 oder Samba4 kann man auch "einfach" mit apt-get installieren ... da hat es aber bei mir rumgezickt wie nichts gutes mit jeder Menge Fehlern ... Unter anderem mit der Winbind-Anbindungen etc. (Samba kannte die Parameter in der smb.conf noch gar nicht) 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!




smb.conf erstellen

Wir müssen nun die Konfigurationsdatei erstellen. Ich hatte das zunächst nach der Original-Samba.Org-Anleitung gemacht (hier) - es zickte aber.
Das Beispiel von Mark Rushing hier) lief besser obwohl es sehr ähnlich ist:

nano /usr/local/samba/etc/smb.conf

mit folgendem Inhalt:

[global]
        netbios name = BANANAPI
        workgroup = ZNIL
        security = ADS
        realm = ZNIL.LOCAL
        dedicated keytab file = /etc/krb5.keytab
        kerberos method = secrets and keytab

        idmap config *:backend = tdb
        idmap config *:range = 70001-80000
        idmap config ZNIL:backend = ad
        idmap config ZNIL:schema_mode = rfc2307
        idmap config <win domain>:range = 3000000-4000000


        winbind nss info = rfc2307
        winbind trusted domains only = no
        winbind use default domain = yes
        winbind enum users  = yes
        winbind enum groups = yes
        winbind refresh tickets = Yes

        #Drucker deaktivieren
        load printers = no
        printcap name = /dev/null
        disable spoolss = yes

        #NTFS Dateirechte nutzen
        vfs objects = acl_xattr
        map acl inherit = Yes
        store dos attributes = Yes

[Test]
        path = /media/Test/
        read only = No
        admin users = "@ZNIL\domänen-admins"

Alle ZNIL ersetzt Ihr dabei durch euren NetBIOS-Domänennamen (der kurze), alle ZNIL.LOCAL durch euren DNS-Domänennamen - aber unbedingt alles in Großbuchstaben!
Ich habe da noch einen Abschnitt der das Drucken deaktiviert (nutze ich nicht) und den letzten mit den NTFS-Rechten.
Dadurch kann ich Berechtigungen auf Dateiebene setzen für Windows-Benutzer. (Wenn die Freigabe auf einer entsprechenden Partition liegt)
Das funktioniert aber nur wenn der Freigebene Ordner auf einer Festplatte ist bei der das in der /etc/fstab aktiviert ist.
Beispiel:

nano /etc/fstab

und bei mir sieht das so aus:

UUID=e0dcaeb9-3cc4-41d0-8964-9dfc0db77807 /media/Toshiba_2TB ext4 user_xattr,acl 0 0

Statt des üblichen Defaults' also ein user_xattr,acl
Wenn Ihr das nicht nutzt so kommentiert den letzten Abschnitt einfach aus.
Wie man eine externe Festplatte anhängt findet Ihr zum Beispiel hier: EXT4 Festplatte am Raspberry Pi mounten und formatieren


Den Ordner Test habe ich nur zur schnellen Prüfung Eingebaut damit man auch was sieht wenn man auf den Pi per Windows Explorer geht.
Natürlich müsst Ihr den dann noch anlegen:

mkdir /media/Test
chmod 777 /media/Test




Samba4 in die Domäne aufnehmen

Am besten bootet Ihr nun euren Pi einmal neu durch - damit er die Pfadänderungen auch alle übernommen hat. Mindestens solltet Ihr euch einmal ab- und wieder anmelden.
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 (Als Member-Server!):

net ads join -U administrator

Er fragt dann nach dem Passwort eures Domänen-Administrators nach Abschluss sollte der Samba4 Server im Active Directory unter Computer auftauchen

Der Samba Server läuft aber nun noch nicht - es fehlt unter anderem ein Start- und Stop Skript. Auch Winbind läuft noch nicht - der macht die ganze Arbeit mit dem Synchronisieren der Benutzer und Gruppen



Start-/Stop Skript anlegen

Wir erstellen eine Datei

nano /etc/init.d/samba4

mit folgendem Inhalt (Achtung, ist nicht identisch mit dem Skript für einen Domänencontroller):

#!/bin/sh

### BEGIN INIT INFO
# Provides:          samba
# 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
# Should-Start:      slapd
# Should-Stop:       slapd
# Short-Description: start Samba daemons (nmbd and smbd)
### END INIT INFO

# Description of this script:
#
# This script comes initially from a Debian Squeeze machine on
# which samba 3.x was installed with "apt-get install samba". The script
# was modified/adjusted so it points to the correct paths of a default
# samba4 installation (/usr/local/samba).
#
# Installation instructions:
# (1) copy the content of this script into your clipboard or download it
# (2) save the content into /etc/init.d/samba of your samba4 host.
# (3) execute "chmod +x /etc/init.d/samba" to have the script executable
# (4) execute "update-rc.d samba defaults" to install auto-start function.
#     smbd+nmbd will automatically being started after earch system start/reboot
#
# Modified by local@#samba~irc.freenode.net at 06th March 2013
# The script was successfully tested on Debian GNU/Linux Squeeze+Wheezy

# Defaults
RUN_MODE="daemons"

# Reads config file (will override defaults above)
[ -r /etc/default/samba ] && . /etc/default/samba

PIDDIR=/usr/local/samba/var/run
NMBDPID=$PIDDIR/nmbd.pid
SMBDPID=$PIDDIR/smbd.pid

# clear conflicting settings from the environment
unset TMPDIR

# See if the daemons are there
test -x /usr/local/samba/sbin/nmbd -a -x /usr/local/samba/sbin/smbd || exit 0

. /lib/lsb/init-functions

case "$1" in
        start)
                log_daemon_msg "Starting Samba daemons"
                # Make sure we have our PIDDIR, even if it's on a tmpfs
                install -o root -g root -m 755 -d $PIDDIR

                NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' 2>/dev/null`
                if [ "$NMBD_DISABLED" != 'Yes' ]; then
                        log_progress_msg "nmbd"
                        if ! start-stop-daemon --start --quiet --oknodo --exec /usr/local/samba/sbin/nmbd -- -D
                        then
                                log_end_msg 1
                                exit 1
                        fi
                fi

           if [ "$RUN_MODE" != "inetd" ]; then
                        log_progress_msg "smbd"
                        if ! start-stop-daemon --start --quiet --oknodo --exec /usr/local/samba/sbin/smbd -- -D; then
                                log_end_msg 1
                                exit 1
                        fi
                fi

                log_end_msg 0
                ;;
        stop)
                log_daemon_msg "Stopping Samba daemons"
                log_progress_msg "nmbd"

                start-stop-daemon --stop --quiet --pidfile $NMBDPID
                # Wait a little and remove stale PID file
                sleep 1
                if [ -f $NMBDPID ] && ! ps h `cat $NMBDPID` > /dev/null
                then
                        # Stale PID file (nmbd was succesfully stopped),
                        # remove it (should be removed by nmbd itself IMHO.)
                        rm -f $NMBDPID
                fi

                if [ "$RUN_MODE" != "inetd" ]; then
                        log_progress_msg "smbd"
                        start-stop-daemon --stop --quiet --pidfile $SMBDPID
                        # Wait a little and remove stale PID file
                        sleep 1
                        if [ -f $SMBDPID ] && ! ps h `cat $SMBDPID` > /dev/null
                        then
                                # Stale PID file (nmbd was succesfully stopped),
                                # remove it (should be removed by smbd itself IMHO.)
                                rm -f $SMBDPID
                        fi
                fi

                log_end_msg 0

                ;;

     reload)
                log_daemon_msg "Reloading /usr/local/samba/etc/smb.conf" "smbd only"

                start-stop-daemon --stop --signal HUP --pidfile $SMBDPID

                log_end_msg 0
                ;;
        restart|force-reload)
                $0 stop
                sleep 1
                $0 start
                ;;
        status)
                status="0"
                NMBD_DISABLED=`testparm -s --parameter-name='disable netbios' 2>/dev/null`
                if [ "$NMBD_DISABLED" != "Yes" ]; then
                        status_of_proc -p $NMBDPID /usr/local/samba/sbin/nmbd nmbd || status=$?
                fi
                if [ "$RUN_MODE" != "inetd" ]; then
                        status_of_proc -p $SMBDPID /usr/local/samba/sbin/smbd smbd || status=$?
                fi
                if [ "$NMBD_DISABLED" = "Yes" -a "$RUN_MODE" = "inetd" ]; then
                        status="4"
                fi
                exit $status
                ;;
        *)
                echo "Usage: /etc/init.d/samba {start|stop|reload|restart|force-reload|status}"
                exit 1
                ;;
esac

exit 0


Dann noch

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



Und nun fehlt noch Winbind:

nano /etc/init.d/winbind

mit folgendem Inhalt:

#!/bin/sh

### BEGIN INIT INFO
# Provides:          winbind
# Required-Start:    $network $remote_fs $syslog
# Required-Stop:     $network $remote_fs $syslog
# Should-Start:      samba
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: start Winbind daemon
### END INIT INFO


PATH=/sbin:/bin:/usr/sbin:/usr/bin

[ -r /etc/default/winbind ] && . /etc/default/winbind

DAEMON=/usr/local/samba/sbin/winbindd
PIDDIR=/var/run/samba
WINBINDPID=$PIDDIR/winbindd.pid

# clear conflicting settings from the environment
unset TMPDIR

# See if the daemon is there
test -x $DAEMON || exit 0

. /lib/lsb/init-functions

case "$1" in
        start)
                log_daemon_msg "Starting the Winbind daemon" "winbind"

                mkdir -p /var/run/samba/winbindd_privileged || return 1
                chgrp winbindd_priv $PIDDIR/winbindd_privileged/ || return 1
                chmod 0750 $PIDDIR/winbindd_privileged/ || return 1
                start-stop-daemon --start --quiet --oknodo --exec $DAEMON -- $WINBINDD_OPTS

                log_end_msg $?
                ;;

        stop)
                log_daemon_msg "Stopping the Winbind daemon" "winbind"
                start-stop-daemon --stop --quiet --oknodo --exec $DAEMON
                log_end_msg $?
                ;;

        restart|force-reload)
                $0 stop && sleep 2 && $0 start
                ;;

        status)
                status_of_proc -p $WINBINDPID $DAEMON winbind && exit 0 || exit $?
                ;;
        *)
                echo "Usage: /etc/init.d/winbind {start|stop|restart|force-reload|status}"
                exit 1
                ;;
esac

und auf diesen in den automatischen Start aufnehmen:

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

Winbind verlinken

Winbind braucht noch einen Weg zur einer Datei:

ln -s /usr/local/samba/lib/libnss_winbind.so /lib/libnss_winbind.so 
ln -s /lib/libnss_winbind.so /lib/libnss_winbind.so.2
ldconfig

Wenn es die schon gab - um so besser


Winbind einbinden

Wir bearbeiten nun die

nano /etc/nsswitch.conf

und ändern die beiden Zeilen

passwd:         compat
group:          compat

um in

passwd:         compat winbind
group:          compat winbind




Der erste Start von Samba!

Wir starten nun Samba und Winbind:

/etc/init.d/samba4 start
/etc/init.d/winbind start


Wenn beides ohne Fehlermeldung startet - prima, alles richtig gemacht!



Funktion von Winbind prüfen

Winbind ist dazu da sich die Gruppen und Benutzer aus dem Active Directory zu holen damit wir diese lokal nutzen können, zum Beispiel für Rechte auf Freigaben etc.
Schauen wir doch mal ob das klappt:

Benutzer abfragen (holt sich alle Benutzer aus dem AD, kann eine Weile dauern):

wbinfo -u

Ausgabe:

administrator
gast
...
...
ldapsearch



Das gleiche mit Gruppen:

wbinfo -g

Ausgabe:

domänencomputer
domänen-gäste
domänen-admins
richtlinien-ersteller-besitzer
domänencontroller
schreibgeschützte domänencontroller
domänen-benutzer
...
schreibgeschützte domänencontroller der organisation



Das ist schon mal gut - Winbind kann sich die Daten also holen, schauen wir mal ob samba damit auch umgehen kann:

id Administrator

Ausgabe:

uid=70001(administrator) gid=70001(domänen-benutzer) Gruppen=70001(domänen-benutzer),70004(richtlinien-ersteller-besitzer),70005(domänen-admins),70006(schema-admins),70007(organisations-admins),70008(organization management),70009(abgelehnte rodc-kennwortreplikationsgruppe),70010(scan operators),2001(BUILTIN\users),2000(BUILTIN\administrators)



Ein letzter Test noch:

getent passwd

Da müsste er die passwd auflisten ... macht dann Pause ... und dann kommen noch einmal alle Domänen-Benutzer


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/Setup_a_Samba_AD_Member_Server
https://wiki.samba.org/index.php/Samba4/InitScript
http://www.duschblog.de/2013/08/09/samba4-auf-dem-raspberry-pi/
http://linuxtot.com/add-a-simple-samba-file-server-as-a-domain-member/

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

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




--Bernhard Linz 20:50, 23. Mär. 2015 (CET)


Kommentare

Loading comments...