Inhaltsverzeichnis

Einen SAMBA-Server im Lehrernetz

Um nach einer Trennung von Lehrernetz und Schülernetz den Lehrern auch Platz für Daten bereitzustellen, kann man auch ein NAS ins Lehrernetz stellen.

Hier wird beschrieben, wie man einen weiteren (z.B. virtuellen) Server mit SAMBA betreibt und die entsprechenden Shares nur im Lehrernetz gemountet werden. Die Idee ist, dass auf einem extra Server (hier: lehrerserver.linuxmuster-net.lokal) ein SAMBA-Server im getrennten Lehrernetz läuft, der die Benutzer über LDAP angebunden kennt, und ihnen ein HOME zur Verfügung stellt. Auf dem Client muss dann dieses HOME nur noch an einer Stelle (z.B. unter ~/Privat_auf_Lehrerserver, ähnlich dem eigentlichen ~/Home_auf_Server) gemountet werden.

Durch die Trennung auf virtueller Netzebene, kann dieses Mounten nur im Lehrernetz stattfinden. In übrigen Netzen schlägt es mangels server fehl. Zusätzlich wird das Mounten auf einem Linuxclient durch Konfiguration (gid=„10000“) auf Lehrer beschränkt.

Voraussetzungen

LDAP konfigurieren

Entsprechend der Anleitung http://www.linuxmuster.net/wikiarchiv/dokumentation:techsheets:additional-sambaserver hat werden folgende Pakete auf dem Lehrerserver installiert:

lehrerserver ~# aptitude install libnss-ldap libpam-ldap

Bei der Konfiguration von libnss-ldap bzw. libpam-ldap wird interaktiv folgende Einstellungen in der Datei /etc/ldap.conf abgefragt, bzw. automatisch angelegt:

/etc/ldap.conf
base dc=linuxmuster-net,dc=lokal
uri ldap://10.16.1.1/
ldap_version 3
rootbinddn cn=admin,dc=linuxmuster-net,dc=lokal
timelimit 30
bind_timelimit 30
pam_password md5
nss_initgroups_ignoreusers backup,bin,daemon,games,gnats,irc,landscape,libuuid,list,lp,mail,man,messagebus,news,proxy,root,sshd,sync,sys,syslog,uucp,www-data

Zudem muss noch folgende Datei (nach dem Vorbild auf dem Server) angepasst werden:

/etc/nsswitch.conf
# cat /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
 
passwd:         compat ldap
group:          compat ldap
shadow:         compat
 
hosts:          files dns
networks:       files
 
protocols:      db files
services:       db files
ethers:         db files
rpc:            db files
 
netgroup:       nis

SAMBA konfigurieren

lehrerserver ~# aptitude install samba smbclient

SAMBA konfigurieren

Ubuntu 14.04: hat die Optionen
        server role = standalone server
        map to guest = Bad User

die standardmäßig bei 12.04 nicht dabei sind. ich vermute die folgende Konfiguration funktioniert trotzdem auf für 12.04.

/etc/samba/smb.conf
[global]
        dos charset =
        unix charset = UTF8
        workgroup = SCHULE
        server string = %h server (Samba, Ubuntu)
        server role = standalone server
        map to guest = Bad User
        passdb backend = ldapsam:ldap://10.16.1.1
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 1000
        disable netbios = Yes
        time server = Yes
        socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
        hostname lookups = Yes
        load printers = No
        logon path = 
        logon home = \\%L\%u
        os level = 25
        domain master = Yes
        dns proxy = No
        wins server = 10.16.1.1
        ldap admin dn = cn=admin,dc=linuxmuster-net,dc=lokal
        ldap delete dn = Yes
        ldap group suffix = ou=groups
        ldap machine suffix = ou=machines
        ldap replication sleep = 5000
        ldap suffix = dc=linuxmuster-net,dc=lokal
        ldap user suffix = ou=accounts
        panic action = /usr/share/samba/panic-action %d
        winbind enum users = Yes
        winbind enum groups = Yes
        idmap config * : backend = tdb
        admin users = domadmin
        printing = bsd
        print command = lpr -r -P'%p' %s
        lpq command = lpq -P'%p'
        lprm command = lprm -P'%p' %j
        map archive = No
        mangled names = No
        delete readonly = Yes
 
[homes]
        comment = Heimatverzeichnis
        path = %H
        valid users = %S
        admin users = administrator
        read only = No
        veto files = /.locked/.htaccess/
        hide files = /$RECYCLE.BIN/desktop.ini/
        browseable = No
lehrerserver ~# service smbd restart
rlpc01 ~# mount -t cifs //10.16.12.100/kuechel /home/teachers/kuechel/Privat_auf_Lehrerserver -o "user=kuechel,rw,nosuid,nodev,nobrl"

sambaSID in LDAP "korrigieren"

Einziger Hack (mangels besseren Wissens) in dieser Anleitung: Die sambaSID des lehrerservers wird (auf dem linuxmuster.net-Server LDAP) verändert.

In LDAP wird automatisch vom Lehrerserver aus ein neuer Eintrag hinterlegt:

server ~# ldapsearch -x SambaDomainName=LEHRERSERVER -LLL
dn: sambaDomainName=,dc=linuxmuster-net,dc=lokal
objectClass: sambaDomain
objectClass: sambaUnixIdPool
sambaDomainName:: U0NIVUxFIA==
sambaSID: S-1-5-21-556912907-1234567891-2234567890
uidNumber: 1000
gidNumber: 1000

In jenem Eintrag ist eine sambaSID hinterlegt. Wenn diese aber mit der sambaSID der Domäne „SCHULE“ übereinstimmt, dann funktioniert auch der mount-Befehl.

Austauschen der sambaSID:

Das hat sicher etwas mit Domänenzugehörigkeit oder Maschinenpasswort austausch zu tun, oder ist einfach in Samba zu konfigurieren. Wer das weiß, bitte verbessern und mir eine Mail schreiben

LDAP-Passwort in SAMBA speichern

Das LDAP Passwort (hier 12345678) des Servers aus /etc/ldap.secret muss dem zusätzlichen Server bekannt gemacht werden:

lehrerserver ~# smbpasswd -w 12345678

SAMBA-shares anlegen

Dieser Schritt muss nach jedem Lehrer Zugang/Weggang wiederholt werden.

Auf dem linuxmuster.net Server:

server ~# cd /home/teachers
server /home/teachers # for i in * ; do ssh lehrerserver "mkdir -p /home/teachers/$i; chown $i:teachers /home/teachers/$i; chmod 700 /home/teachers/$i"; done

Linux-Client-Konfiguration

pam_mount.conf.xml
<?xml version="1.0" encoding="UTF-8"?>
<pam_mount>
<debug enable="0" />
<mkmountpoint enable="1" />
<lsof>/usr/bin/lsof %(MNTPT)</lsof>
<fsck>/sbin/fsck -p %(FSCKTARGET)</fsck>
<cifsmount>/usr/sbin/linuxmuster-pam-mount %(SERVER) %(VOLUME) %(MNTPT) %(USER) "user=%(USER),%(OPTIONS)"</cifsmount>
<umount>/usr/sbin/linuxmuster-pam-umount %(SERVER) %(VOLUME) %(MNTPT) %(USER)</umount>
<mntcheck>/bin/mount</mntcheck>
<pmvarrun>/usr/sbin/pmvarrun -u %(USER) -d -o %(OPERATION)</pmvarrun>
 
<volume options="rw,nosuid,nodev,nobrl" user="*" mountpoint="~/Home_auf_Server" path="%(USER)" server="10.16.1.1" fstype="cifs" />
<volume options="rw,nosuid,nodev,nobrl" user="*" mountpoint="~/Privat_auf_Lehrerserver" path="%(USER)" server="10.16.12.100" fstype="cifs" gid="10000"/>
<volume options="rw,nosuid,nodev" user="*" mountpoint="/home/students" path="students" server="10.16.1.1" fstype="cifs" />
<volume options="rw,nosuid,nodev" user="*" mountpoint="/home/share" path="shares" server="10.16.1.1" fstype="cifs" />
<volume options="rw,nosuid,nodev" user="*" mountpoint="/home/samba/progs" path="pgm" server="10.16.1.1" fstype="cifs" />
<volume options="rw,nosuid,nodev," user="*" mountpoint="/home/samba/cds" path="cdrom" server="10.16.1.1" fstype="cifs" />
<volume options="rw,nosuid,nodev" user="*" mountpoint="/var/cache/sophomorix/tasks" path="tasks" server="10.16.1.1" fstype="cifs" />
</pam_mount>

Verhindern, dass Home_auf_Server noch mal gesynct wird.

Beispiel 1:

/etc/linuxmuster-client/pre-mount.d/010-profilecopy
<snip/>
 
# this script gets executed only once, before the users home from the
# server gets mounted. in this case $USER and $VOLUME are the same
if [ $USER != $VOLUME ]; then
    return 0
fi
# check, if the Home_auf_Server Directory is not empty and return
. /etc/linuxmuster-client/linuxmuster-client.conf || exit 1
if [ "$(ls -A $HOMEDIR/$HOMEFOLDERNAME)" ]; then
    msg2log pre-mount "$HOMEFOLDERNAME is not empty, not syncing."
    return 0
fi
 
# log success
$LOGGING && msg2log pre-mount "We are mounting users home, copy default profile"
 
rsync -r $RSYNC_OPTIONS /home/$PROFILE_USER/ $HOMEDIR/
 
mkdir -p $MNTPT

Beispiel 2 (m.E. bessere Variante):

/etc/linuxmuster-client/pre-mount.d/010-profilecopy
# this script gets executed only once, before the users home from the
# server gets mounted. in this case $USER and $VOLUME are the same
mainserverip=$(gethostip $SERVER | awk '{print $2}')
requestserverip=$(grep "^uri\ ldap://" /etc/ldap.conf | head -n 1 | sed "s@^uri\ ldap://@@;s@/.*@@")
if [ $USER != $VOLUME -o $mainserverip != $requestserverip ]; then
    return 0
fi
 
# Additional check, if the Home_auf_Server Directory is not empty and return
. /etc/linuxmuster-client/linuxmuster-client.conf || exit 1
if [ "$(ls -A $HOMEDIR/$HOMEFOLDERNAME)" ]; then
    msg2log pre-mount "$HOMEFOLDERNAME is not empty, not syncing."
    return 0
fi
Achtung!

Solange diese Abfrage noch nicht in den offiziellen linuxmuster-client* Paketen verbessert wurde, wird in jedem pre/post-mount/umount.d/* Skript diese Änderung nötig sein.

Für diese Befehle muss syslinux auf dem Client installiert sein. Einfach mal gethostip server aufrufen und schauen, ob es klappt.

Optional

TODO