Kerberos Grundkonfiguration

Diese Anleitung beschreibt die vom RRZE empfohlene Grundkonfiguration zur Anbindung eines Ubuntu-Systems an die Kerberos Infrastruktur des RRZE. Die meisten Schritte sind allerdings allgemeingültig uns können für eigene Installationen leicht angepasst werden.

Nach Durchführung aller Schritte wird bei Systemanmeldung automatisch ein Kerberos-Ticket zur Verfügung gestellt und Anmeldungen per SSH an und von dem System sind per Kerberos-Authentifizierung möglich. Außerdem können CIFS und NFSv4 Netzlaufwerke kerberos-authentifiziert eingebunden werden.

Pakete für Ubuntu 14.04/16.04/18.04/20.04

# i-want-it-all one-liner
bash$ sudo DEBIAN_FRONTEND=noninteractive apt-get install krb5-user libsasl2-modules-gssapi-mit libpam-krb5 nfs-common keyutils cifs-utils openssh-server openssh-client
# single services

# for kerberos login authentication
bash$ sudo DEBIAN_FRONTEND=noninteractive apt-get install krb5-user libpam-krb5 

# for kerberized ssh logins (client + server side)
bash$ sudo DEBIAN_FRONTEND=noninteractive apt-get install openssh-server openssh-client

# for kerberos nfsv4 mounts
bash$ sudo DEBIAN_FRONTEND=noninteractive apt-get install nfs-common keyutils 

# for kerberized windows cifs mounts
bash$ sudo DEBIAN_FRONTEND=noninteractive apt-get install cifs-utils 

# to enable kerberos support via GSSAPI for various software packages (e.g. pidgin)
bash$ sudo DEBIAN_FRONTEND=noninteractive apt-get install libsasl2-modules-gssapi-mit

Kerberos Join (LINUX.FAU.DE) / Download der Keytab

Wird benötigt, wenn NFSv4-Freigaben eingebunden oder Kerberos-authentifizierte Dienste auf dem Host betrieben werden sollen.

Der Kerberos Join ermöglicht eine Anbindung des Clients an die LDAP Infrastruktur des RRZE, sowie den Bezug einer Keytab mit ServicePrincipals, um eigene Dienste mit Kerberos-Authentifizierung anzubieten. Klassischerweise ist das unter Linux z.B. der Host-Principal für per Kerberos authentifizierte SSH Logins auf dem Client.

Der Join (genauer: eine Keytab mit NFS-Pricipal) wird ebenfalls benötigt, um NFSv4-Freigaben einbinden zu können.

Die entsprechende Anleitung zur Aktivierung von Kerberos für Ihr System finden Sie auf der Seite des rrzelinux Kommandozeilenwerkzeugs unter „Kerberos Join durchführen„.

Konfiguration

Einrichtung der verschiedenen Dienste.

Kerberos

Die Grundkonfiguration für Kerberos an der FAU ist können Sie nach folgendem Beispiel übernehmen.
Bitte beachten Sie die Kommentare und führen Sie ggf. notwendige Anpassungen durch.

Für Ubuntu 16.04 und älter müssen die entsprechend kommentierten Einstellungen deaktiviert werden.

bash$ for i in $(grep -l minimum_uid=1000 /etc/pam.d/* | grep -v -e bak -e old); do echo $i; sudo sed -i -e 's/minimum_uid=1000/minimum_uid=2000/' $i; done

bash$ sudo cp /etc/krb5.conf /etc/krb5.conf_old
bash$ sudo vi /etc/krb5.conf

[libdefaults]
    default_realm = LINUX.FAU.DE
    # START: disable for Ubuntu 16.04 and older
    default_ccache_name = FILE:/tmp/krb5cc_%{euid}
    # END: disable for Ubuntu 16.04 and older
    kdc_timesync = 1
    ccache_type = 4
    forwardable = true
    proxiable = true

    # maximum is 24h - but client defaults to 10h
    ticket_lifetime = 10h



# START: disable for Ubuntu 16.04 and older
[appdefaults]
    forwardable = true
    pam = {
        ccache = FILE:/tmp/krb5cc_%u
        ccache_dir = /tmp
        external = sshd
    }
# END: disable for Ubuntu 16.04 and older
[realms]
    FAUAD.FAU.DE = {
        kdc = fauad.fau.de:88
        auth_to_local = RULE:[1:$1]
        auth_to_local = DEFAULT
    }
    LINUX.FAU.DE = {
        kdc = linuxkdc.rrze.uni-erlangen.de:88
        auth_to_local = RULE:[1:$1]
        auth_to_local = DEFAULT
    }
    EXCH.FAU.DE = {
        kdc = exch.fau.de:88
        auth_to_local = RULE:[1:$1]
        auth_to_local = DEFAULT
    }
    UBAD.FAU.DE = {
        kdc = ubad.fau.de:88
        auth_to_local = RULE:[1:$1]
        auth_to_local = DEFAULT
    }

[domain_realm]
    # Add domain-realm mappings here
    # Additional mapping are necessary to map hostnames to a kerberos realm other than 
    # the default realm set below
    # Examples:
    # some-windows-host.xyz.uni-erlangen.de = FAUAD.FAU.DE
    # some-linux-host.xyz.uni-erlangen.de = LINUX.FAU.DE
    # ...

    # some usual windows hosts
    mordor.rrze.uni-erlangen.de = FAUAD.FAU.DE
    moloch.rrze.uni-erlangen.de = FAUAD.FAU.DE
    home.rrze.uni-erlangen.de = FAUAD.FAU.DE
    projekte.rrze.uni-erlangen.de = FAUAD.FAU.DE
    fauprint.rrze.uni-erlangen.de = FAUAD.FAU.DE
    fauprint2.rrze.uni-erlangen.de = FAUAD.FAU.DE
    wisoprint.wiso.uni-erlangen.de = FAUAD.FAU.DE
    wisoprint2.wiso.uni-erlangen.de = FAUAD.FAU.DE
    rocky.rrze.uni-erlangen.de = FAUAD.FAU.DE
    newton.wiso.uni-erlangen.de = FAUAD.FAU.DE
    fausmb.rrze.uni-erlangen.de = FAUAD.FAU.DE
    mecke12.rrze.uni-erlangen.de = FAUAD.FAU.DE
    godzilla.rrze.uni-erlangen.de = FAUAD.FAU.DE
    .exch.fau.de = EXCH.FAU.DE
    .ubad.fau.de = UBAD.FAU.DE

     # choose what should be the default below

     # if not specified otherwise - all hosts will be seen as members of the FAUAD.FAU.DE realm by default
     #.fau.de = FAUAD.FAU.DE
     #.uni-erlangen.de = FAUAD.FAU.DE

     # if not specified otherwise - all hosts will be seen as members of the LINUX.FAU.DE realm by default
    .fau.de = LINUX.FAU.DE
    .uni-erlangen.de = LINUX.FAU.DE

[login]
    #krb4_convert = true
    #krb4_get_tickets = false

[logging]
     kdc = SYSLOG:INFO:DAEMON
     admin_server = SYSLOG:INFO:DAEMON
     default = SYSLOG:INFO:DAEMON


SSH Client

Folgende Einstellungen ermöglichen das kerberos-authentifizierte Einloggen auf anderen Systemen via SSH.

bash$ sudo cp /etc/ssh/ssh_config /etc/ssh/ssh_config_old
bash$ sudo vi /etc/ssh/ssh_config
...
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
GSSAPITrustDns yes 
...

SSH Server

Folgende Einstellungen ermöglichen das kerberos-authentifizierte Einloggen  von anderen Systemen via SSH.

bash$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config_old
bash$ sudo vi /etc/ssh/sshd_config
...
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
...

NFS Client

Folgende Einstellungen konfigurieren das Name-Id-Mapping für NFSv4 Netzlaufwerke.

bash$ sudo cp /etc/idmapd.conf /etc/idmapd.conf_old
bash$ sudo vi /etc/idmapd.conf

[General]
Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs

# have no fear - we only need fauad.fau.de as single unified namespace!
Domain = fauad.fau.de
Local-Realms = LINUX.FAU.DE,FAUAD.FAU.DE
    
[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup

CIFS Client

Folgende Einstellungen ermöglichen das kerberos-authentifizierte Einbinden von CIFS Netzlaufwerken.

bash$ sudo cp /etc/request-key.conf /etc/request-key.conf_old
bash$ sudo vi /etc/request-key.conf
...
create  cifs.spnego     *       *               /usr/sbin/cifs.upcall -t %k
...
bash$ sudo cp /etc/request-key.d/cifs.spnego.conf /etc/request-key.d/cifs.spnego.conf_old
bash$ sudo vi /etc/request-key.d/cifs.spnego.conf

create  cifs.spnego     *       *               /usr/sbin/cifs.upcall -t %k

Generic Security Api (GSS)

Stellen Sie sicher der der gssd gestartet ist:

bash$ ps aux | grep gssd
root 1760 0.8 0.0 43796 3852 ? Ss Nov15 112:24 /usr/sbin/rpc.gssd

Sollte das nicht der Fall sein , so starten Sie den gssd mittels

# Ubuntu 18.04 / 20.04
bash$ sudo systemctl start rpc-gssd

# Ubuntu 16.04
bash$ sudo systemctl start gssd

# Ubuntu 14.04
bash$ sudo service gssd start

Restart/Reboot

Nach der Umstellung auf Kerberos – inbesondere bei Verwendung der NFS/CIFS Funktionalität – ist ein Reboot dringend empfohlen.

Generell können Tests mit falschen oder unvollständigen Konfigurationen dazu führen, dass der Kernel ungültige Informationen cached und dadurch darauffolgende Versuche – sogar mit korrekter Konfiguration – fehlschlagen.
Leider scheint der einzig effektive Weg ein Reboot zu sein, um sicher zu gehen, dass jegliche Caches geleert sind (Stichwort: Kernel keyring).

Test

Um die korrekte Einrichtung zu verifizieren können die hier beschriebenen Tests durchgeführt werden.

Kerberos

bash$ kinit [Kennung]
bash$ klist

Ticket cache: FILE:/tmp/krb5cc_[UID]_qdIQWB
Default principal: [Kennung]@LINUX.FAU.DE

Valid starting       Expires              Service principal
17.11.2016 16:07:22  18.11.2016 16:07:22  krbtgt/LINUX.FAU.DE@LINUX.FAU.DE

SSH Client

bash$ ssh dialog.rrze.uni-erlangen.de

# login success

bash$ klist

Ticket cache: FILE:/tmp/krb5cc_[UID]_fNDrEQQxAx
Default principal: [Kennung]@LINUX.FAU.DE

Valid starting       Expires              Service principal
17.11.2016 17:16:44  18.11.2016 16:07:22  krbtgt/LINUX.FAU.DE@LINUX.FAU.DE

NFS

bash$ sudo mkdir /mnt/rzlin
bash$ sudo mount -t nfs4 -o minorversion=1,sec=krb5p rrzenfs4.rrze.uni-erlangen.de:/export/linuxhome /mnt/rzlin
bash$ sudo su $USER
bash$ cd /mnt/rrzelinuxhome/$USER
bash$ ls -al

insgesamt 1116
drwx------   52 [Kennung] fau_user        12288 Nov 17 17:16 .
drwx-----x 6254 root     root            483328 Nov 17 15:05 ..
...

bash$ exit
bash$ sudo umount /mnt/rzlin
bash$ sudo rmdir /mnt/rzlin

CIFS

bash$ id

uid=[UID]([KENNUNG]) gid=100000(fau_user) Gruppen=100000(fau_user),...

# root werden
bash$ sudo su 
bash$ mkdir -p /mnt/rzwin/[KENNUNG]

# WICHTIG: Der Mount-Befehl benötigt root-Rechte aber die Felder [KENNUNG]/[UID] (siehe Ausgabe des "id" Befehls) müssen auf einen unprivilegierten Zugang verweisen, für den ein Home-Verzeichnis tatsächlich existiert.
bash$ mount -t cifs -o user=[KENNUNG],domain=FAUAD,sec=krb5,cruid=[UID],multiuser,noserverino,nodfs,vers=2.1 //home.rrze.uni-erlangen.de/[KENNUNG] /mnt/rzwin/[KENNUNG]

# Anmerkung für Ubuntu 17.10:
# Scheinbar ist hier außerdem die Angabe der SMB Version erforderlich
# Beispiel: -o vers=2.1

bash$ su [KENNUNG]
bash$ cd /mnt/rzwin/[KENNUNG]
bash$ ls -al
...

bash$ exit
bash$ umount /mnt/rzwin/[KENNUNG]
bash$ rmdir /mnt/rzwin/[KENNUNG]
bash$ rmdir /mnt/rzwin