Einrichtung eines FreeBSD NFSv4 Clients mit Kerberos und AutoFS im Linux-Netzwerk

Diese Anleitung zeigt dem geübten Linux-Administrator, wie man unter FreeBSD ein Linux NFSv4 Verzeichnis mit Kerberos-Absicherung und AutoFS mounten kann.

Voraussetzung:

Ein funktionierendes Netzwerk mit Kerberos,NFSv4 und NTP. In unserem Szenario ist der Kerberos-KDC, der Kerberos-Admin und der NFSv4 Server auf dem selben Host, mit dem Namen nasserver, installiert. Die Benutzer und deren Prinzipals sind angelegt und geprüft. Die Domäne soll beispiel.net heißen und der Realm BEISPIEL.NET.

Benutzername,UID und GID sind auf dem Linux-Server nasserver und dem FreeBSD Client nasclient identisch. Dieses kann durch z.B NIS, Ldap oder manuelle Einrichtung erreicht werden. In diesem Fall reicht das manuelle Anlegen des Benutzers aus. Unser virtueller Benutzer ist nasuser mit der UID 1001 ind GID 1001.

nasclient:$ adduser

Username: nasuser
Full name: nasuser
Uid (Leave empty for default):
Login group [nasuser]:
Login group is jru. Invite nasuser into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh zsh nologin) [sh]: bash
Home directory [/home/nasuser]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username   : nasuser
Password   : ****
Full Name  : nas
Uid        : 1001
Class      :
Groups     : nasuser wheel
Home       : /home/nasuser
Shell      : /usr/local/bin/bash
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (nasuser) to the user database.
Add another user? (yes/no): no
Goodbye!
$

Notwendig ist der vollständige (inkl. domain) Hostname des FreeBSD-Clients, ein funktionierender DNS-Service im Netzwerk oder zumindest eine gepflegte /etc/hosts auf dem Client und dem Server. Unser Rechner heißt nasclient, die Domäne beispiel.net

nasclient$ nano /etc/rc.conf

hostname = nasclient.beispiel.net #Kleinschreibung beachten !


nasclient$ nano /etc/hosts

192.168.0.1 nasclient.beispiel.net
192.168.0.2 nasserver.beispiel.net


Der FreeBSD Kerberos-Client hat Heimdal als Standard, unser Linux-KDC ist ein MIT Kerberos KDC. Wir installieren als erstes MIT:

nasclient$ pkg install krb5

Dann erstellen oder kopieren wir die /etc/krb5.conf mit unserem REALM BEISPIEL.NET

nasclient$ nano /etc/krb5.conf

[libdefaults]

default_realm = BEISPIEL.NET
# The following krb5.conf variables are only for MIT Kerberos.
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
[realms]
BEISPIEL.NET = {
kdc = nasserver.beispiel.net
admin_server = nasserver.beispiel.net
}

---


Der Prinzipal vom host und vom Dienst nfs auf nasclient muss noch erzeugt werden. Dieses erledigen wir auf dem Linux-Server.

#nasserver$ kadmin -p admin/admin
#kadmin> addprinc -randkey host/nasclient.beispiel.net
#kadmin> addprinc -randkey nfs/nasclient.beispiel.net

Danach testen wir unser Konfiguration auf dem FreeBSD-Client:

nasclient$ kinit nasuser

Passwort für nasuser@BEISPIEL.NET:


nasclient$ klist

Principal: nasuser@BEISPIEL.NET ...


Damit NFSv4 mit Kerberos funktioniert, wird der gssd Dienst benötigt, der für die Keys auf die Datei /etc/krb5.keytab zugreift. (siehe man gssd) Wichtig ist es zu beachten, dass der Hostname vollständig kleingeschrieben ist. Der gssd-Dienst schlägt sonst fehl da er mit falschen Prinzipal beim KDC anfragt.
MIT-Programme befinden sich unter /usr/local/bin ein nasclient$ ktutil öffnet also die Heimdal-Version. Wir benötigen MIT.

nasclient$ /usr/local/bin/kadmin -p admin/admin
$kadmin> ktadd host/nasclient.beispiel.net
$kadmin> ktadd nfs/nasclient.beispiel.net

Password for admin/admin@BEISPIEL.NET:
Entry for principal host/nasclient.beispiel.net@BEISPIEL.NET with kvno 2,enc
Entry for principal host/nasclient.beispiel.net@BEISPIEL.NET with kvno 2,enc
Entry for principal host/nasclient.beispiel.net@BEISPIEL.NET with kvno 2,enc
Entry for principal host/nasclient.beispiel.net@BEISPIEL.NET with kvno 2,enc
Entry for principal nfs/nasclient.beispiel.net@BEISPIEL.NET with kvno 2,enc
Entry for principal nfs/nasclient.beispiel.net@BEISPIEL.NET with kvno 2,enc
Entry for principal nfs/nasclient.beispiel.net@BEISPIEL.NET with kvno 2,enc
Entry for principal nfs/nasclient.beispiel.net@BEISPIEL.NET with kvno 2,enc


Überprüfung von /etc/krb5.keytab auf nasclient:

nasclient$ ktutil list (Heimdal tut es hier auch)

Vno  Type        Principal
    2  aes256-cts-hmac-sha1-96  host/nasclient.beispiel.net@BEISPIEL.NET
    2  arcfour-hmac-md5         host/nasclient.beispiel.net@BEISPIEL.NET
    2  des3-cbc-sha1            host/nasclient.beispiel.net@BEISPIEL.NET
    2  des-cbc-crc              host/nasclient.beispiel.net@BEISPIEL.NET
    2  aes256-cts-hmac-sha1-96  nfs/nasclient.beispiel.net@BEISPIEL.NET
    2  arcfour-hmac-md5         nfs/nasclient.beispiel.net@BEISPIEL.NET
    2  des3-cbc-sha1            nfs/nasclient.beispiel.net@BEISPIEL.NET
    2  des-cbc-crc              nfs/nasclient.beispiel.net@BEISPIEL.NET

Oder mit MIT.

nasclient$ /usr/local/bin/ktutil

ktutil:  rkt /etc/krb5.keytab
ktutil:  list
slot KVNO Principal
---- ---- ---------------------------------------------------------------------
   1    2 host/nasclient.beispiel.net@BEISPIEL.NET
   2    2 host/nasclient.beispiel.net@BEISPIEL.NET
   3    2 host/nasclient.beispiel.net@BEISPIEL.NET
   4    2 host/nasclient.beispiel.net@BEISPIEL.NET
   5    2 nfs/nasclient.beispiel.net@BEISPIEL.NET
   6    2 nfs/nasclient.beispiel.net@BEISPIEL.NET
   7    2 nfs/nasclient.beispiel.net@BEISPIEL.NET
   8    2 nfs/nasclient.beispiel.net@BEISPIEL.NET

Nun fehlen dem Client noch drei Dienste die wir zur /etc/rc.conf hinzufügen.

gssd, der Sicherheits-Dienst
nfsuserd, wird für das GID/UID mapping benötigt
nfscbd, wird für die Kommunikation vom NFSv4 Server zum Client benötigt

nasclient$ nano /etc/rc.conf

nfsuserd_enable="YES"
nfscbd_enable="YES"
gssd_enable="YES"
gssd_flags="-h"

Zum Testen starten wir gssd mit verbose,debug und dem "host-based initiator creditals support" Schalter, sprich es werden Kerberos NFS mounts erlaubt wenn der Service-Prinzipal nfs/nasclient.beispiel.net@BEISPIEL.NET in der /etc/krb5.keytab enthalten ist.

nasclient$ gssd -vhd

Ist alles fehlerfrei, können wir die Dienste starten.

nasclient$ service nfsuserd start
nasclient$ service nfscbd start
nasclient$ service gssd start


Angenommen unsere /etc/exports auf dem NFSv4 Server ist diese:

nasserver# cat /etc/exports

/nas           192.168.0.0/24(sec=krb5:krb5i,rw,fsid=0,insecure,no_subtree_check,sync)
/nas/share 192.168.0.0/24(sec=krb5:krb5i,rw,no_root_squash,nohide,insecure,no_subtree_check,sync)


Wenn die Rechte von nasuser UID 1001/GID 1001 für das Verzeichnis share richtig gesetzt und das Ticket noch gültig ist, dann sollte mit:

nasclient$ mount_nfs -o sec=krb5,vers=4,soft,intr,gssname=nfs nasserver.beispiel.net:/share /mnt/share

das Verzeichnis /mnt/share gemountet werden. Wichtig ist, es zu beachten, dass mount_nfs :/nas/share mit der Option NFSv4 (vers=4) nicht akzeptiert.

nasclient $ nano /etc/fstab

nasserver.beispiel.net:/share /mnt/share nfs  bg,rw,soft,sec=krb5,nfsv4,gssname=nfs,late  0 0  

Optional: Login per pam_krb5

nasclient$ pkg install pam_krb5 (siehe man pam_krb5)

Und in der /etc/pam.d/system PAM-Kerberos einschalten.


nasclient$ nano /etc/pam.d/system

# auth
auth            sufficient      pam_opie.so                    no_warn no_fake_prompts
auth            requisite       pam_opieaccess.so        no_warn allow_local
auth            sufficient      pam_krb5.so                    no_warn try_first_pass
#auth          sufficient      pam_ssh.so                     no_warn try_first_pass
auth            required       pam_unix.so                    no_warn try_first_pass

# account

#account       required        pam_krb5.so
account       required        pam_login_access.so
account       required        pam_unix.so
account       required        pam_krb5.so                   try_first_pass

# session
#session       optional        pam_ssh.so              want_agent
session         required       pam_lastlog.so          no_fail


# password
password       sufficient      pam_krb5.so                   no_warn try_first_pass
password       requiered     pam_unix.so                   no_warn try_first_pass


Achtung,falls eine /root/.k5login vorhanden ist, unbedingt den Prinzipal prüfen bzw. hinzufügen, sonst sperrt man sich unter Umständen aus ! Wenn das der Fall sein sollte, dann hilft booten im "single user modus" und ein schreibbar machen der Partition mit /sbin/mount -u / .


Ab jetzt sollte das Ticket beim Login erzeugt werden.

Netzwerk-Freigaben automatisch einhängen mit AutoFS:


Als optimale Ergänzung bietet sich automount an. Mit autofs (man autofs)kann man auf einfache Weise Geräte oder Netzwerkfreigaben automatisch bei Bedarf einbinden. Im Gegensatz zum statischen Einbinden erfolgt auch das Aushängen automatisch ohne Zugriff. Autofs liest in der Datei /etc/auto_master den Dateipfad zum Einhängen und dessen Map-Datei. Die Map-Dateien enthalten den speziellen Mount-Befehl. Ein weiterer Vorteil ist, dass für NFS die Mount-Befehle für BSD und Linux fast identisch sind. In unseren Szenario wollen wir die Freigabe share unter dem Einhängepfad /mnt/NFSv4/ einhängen.


nasclient$ mkdir /mnt/NFSv4/
nasclient$ nano /etc/auto_master

#Einhängepfad    Map-Datei
/mnt/NFSv4    /etc/nfs.auto

nasclient$ nano /etc/nfs.auto

#Verzeichnis    Mountbefehl
nasserver/share    -fstype=nfs,sec=krb5,vers=4,gssname=nfs nasserver.beispiel.net:/share

Unter FreeBSD braucht man autofs nur in der /etc/rc.conf aktivieren.


nasclient$ nano /etc/rc.conf

autofs_enable = "YES"

nasclient$ service automount onestart
nasclient$ service automountd onestart
nasclient$ service autounmountd onestart


Falls automount fehlschlägt, kann man mit nasclient$ automount -v und nasclient$ tail /var/log/messages den Fehler eingrenzen. Oft ist auch nur das Kerberos-Ticket ungültig. Ein kdestroy und kinit sind dann die Lösung. Für Rechner die durchgehend in Betrieb sind, sollte man ggf. das Ticket periodisch mit einem Cronjob verlängern.


0 * * * * /usr/local/bin/kinit -R #MIT

Testumgebung: Debian Wheezy/Jessie, FreeBSD 11.2/12