Einrichtung eines FreeBSD NFSv4 Clients mit Kerberos und AutoFS im Linux-Netzwerk
Diese Anleitung erklärt, 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: |
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 |
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: |
Ü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,(vfs.usermount=1 und vfs.nfs.enable_uidtostring sind gesetzt in der sysctl.conf) 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.
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 / .
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: Wheezy/Jessie/Ascii, FreeBSD 11.2/12 (aktualisiert 10/20)