Benutzer-Werkzeuge

Webseiten-Werkzeuge


 [[anwenderwiki:erweiterungen:samba_lehrernetz]] 

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

  • Das Lehrernetz ist physikalisch oder per VLAN getrennt vom Schülernetz, aber alle Rechner im Lehrernetz haben Zugriff auf den linuxmuster.net Server.
  • Der linuxmuster.net server hat die IP 10.16.1.1
  • Hier hat das Lehrernetz die IPs 10.16.12.0/24.
  • Der Lehrerserver hat die IP 10.16.12.100 und läuft unter Ubuntu 12.04 oder 14.04
  • Als Clients werden Linuxclients mit Ubuntu 12.04 eingesetzt

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
  • Die LDAP-Konfiguration testen mit lehrerserver ~# ldapsearch -x uid=administrator testen. Es sollten die Daten des Kontos erscheinen.

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
  • Die nssldap-Konfiguration testen mit getent passwd. Es sollten alle Konten (Schüler, Lehrer, etc.) durchlaufen.

SAMBA konfigurieren

lehrerserver ~# aptitude install samba smbclient

SAMBA konfigurieren

  • Auf dem Lehrerserver die samba-Konfiguration austauschen.
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
  • Samba neustarten
lehrerserver ~# service smbd restart
  • Mounten auf einem Linuxclient testen (wird fehlschlagen, siehe Hack unten):
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:

  • die SambaSID der Domäne SCHULE herausfinden
    server ~# ldapsearch -x SambaDomainName=SCHULE -LLL sambaSID
    dn: sambaDomainName=SCHULE,dc=linuxmuster-net,dc=lokal
    sambaSID: S-1-5-21-ZZZZZZZZZ-YYYYYYYY-XXXXXXXXX
  • Datei erstellen mit der sambaSID von „SCHULE“:
    modify.lehrerserver.ldif
    dn: sambaDomainName=LEHRERSERVER,dc=linuxmuster-net,dc=lokal
    changetype: modify
    replace: sambaSID
    sambaSID: S-1-5-21-ZZZZZZZZZ-YYYYYYYY-XXXXXXXXX
  • Veränderung vornehmen:
    server ~# ldapmodify -D "cn=admin,dc=linuxmuster-net,dc=lokal" -W -f modify.lehrerserver.ldif
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 neustarten

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

  • Die PAM Konfiguration auf dem Linuxclient muss geändert werden.
  • Beachten, dass man in /etc/linuxmuster-client/auth/config die Autokonfiguration beendet (und dann ein neues Image macht, oder sowohl /etc/ldap.conf also auch folgende Datei per postsync hinkopiert.
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.

  • Das Problem ist, dass beim zweiten HOME die Abfrage in den linuxmuster-client skripten nicht abbricht, weil $VOLUME = $USER ist. Die Annahme, dass das nur einmal stattfindet, ist jetzt nicht mehr gegeben. Man sollte noch den $SERVER auswerten oder sicherstellen, dass Home_auf_Server leer ist.

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

  • sicherstellen, dass es ein Backup gibt
  • sicherstellen, dass es ein quota gibt
  • sicherstellen, dass alte Lehrer ab und zu gelöscht werden.

TODO

  • sicherstellen, dass neue Lehrer ein Verzeichnis bekommen (hacken der sophomorix-add Befehle?), Workaround, siehe samba-shares_anlegen
 [[anwenderwiki:erweiterungen:samba_lehrernetz]] anwenderwiki/erweiterungen/samba_lehrernetz.txt · Zuletzt geändert: 2018/01/17 21:32 von Tobias