Kerberos-Authentifizierung

Allgemeines

Je weiter man in sicherheitsrelevante Netzwerke eintaucht, um so öfter begegnet man der Anforderung einer zentralen Benutzer-Authentifizierung. Klar man kann sich jetzt einen eigenen LDAP-Server mit openLDAP aufbauen, Schemata einrichten und mit Inhalten füllen. Wenn aber, wie in vielen Firmen, bereits ein Active Directory vorhanden ist, kann man ja auch gleich diese Möglichkeiten verwenden, oder? Also Kerberos-Utilities installiert, konfiguriert, Benutzer angelegt und los.

Ok, eine vollständige Integration, bei der neue Benutzer automatisch angelegt werden ist das nicht. Aber für die Administration von Linux-Servern über SSH wird das auch nicht unbedingt benötigt. Die Personen, die das System betreuen sind meistens überschaubar oder können z.B. durch Software-Verwaltungen wie Puppet angelegt werden.

Ich beschreibe hier die Einrichtung der Kerberos-Authentifizierung für Ubuntu/Debian. Für RPM-basierte Systeme müssen ggf. die notwendigen Pakete bzw. die Pfade angepasst werden.

Benötigte Pakete

Für Kerberos ist eine Zeitsynchronisation essentiell. Daher ist NTP Pflicht. Zusätzlich natürlich die Kerberos-Utilities:

apt-get install ntp ntpdate libpam-krb5 krb5-user

Konfiguration

NTP

Die Standard-Werte helfen uns in diesem Fall nicht weiter, da es darauf ankommt die gleiche Zeit wie der Kerberos-Server zu haben. Also müssen die vorhandenen Domain-Controller „herhalten“. Das ganze habe ich als sed-Statements zusammengeschrieben, damit ich es jedes Mal einfach auf die NTP-Konfigurationsdatei /etc/ntp.conf anwenden kann.

Backup der ntp.conf anlegen:

cp /etc/ntp.conf /etc/ntp.conf.bak

Domain-Controller angeben:

dc1=dc1.domain.tld
dc2=10.10.0.1

NTP-Sed für Debian:

sed -i 's/^server 0.debian.pool.ntp.org iburst/#server 0.debian.pool.ntp.org iburst/g' /etc/ntp.conf
sed -i 's/^server 1.debian.pool.ntp.org iburst/#server 1.debian.pool.ntp.org iburst/g' /etc/ntp.conf
sed -i 's/^server 2.debian.pool.ntp.org iburst/#server 2.debian.pool.ntp.org iburst/g' /etc/ntp.conf
sed -i 's/^server 3.debian.pool.ntp.org iburst/#server 3.debian.pool.ntp.org iburstnserver $dc2nserver $dc1/g' /etc/ntp.conf

NTP-Sed für Ubuntu:

sed -i 's/^server 0.ubuntu.pool.ntp.org/#server 0.ubuntu.pool.ntp.org/g' /etc/ntp.conf
sed -i 's/^server 1.ubuntu.pool.ntp.org/#server 1.ubuntu.pool.ntp.org/g' /etc/ntp.conf
sed -i 's/^server 2.ubuntu.pool.ntp.org/#server 2.ubuntu.pool.ntp.org/g' /etc/ntp.conf
sed -i 's/^server 3.ubuntu.pool.ntp.org/#server 3.ubuntu.pool.ntp.orgnserver $dc2nserver $dc1/g' /etc/ntp.conf

Kerberos

Nun muss noch die Verbindung zu den Domain-Controllern konfiguriert werden. Die notwendigen Schreibweisen habe ich durch die entsprechenden Umformatierungen bereits eingebaut. Es müssen nur die Werte für WORKGROUP, DOMAIN und DOMAIN-CONTROLLER angegeben werden:

# benötigte Variablen sicherheitshalber zurücksetzen
unset adm
unset kdc
# Workgroup
ownwg=OWNWORKGROUP
# Domäne angeben
owndomain=DOMAIN.TLD
# Domänen-Controller
dc[0]=dc1.domain.tld
dc[1]=dc2.domain.tld
### Nicht mehr ändern
DOMAIN=$(echo $owndomain | tr '[:lower:]' '[:upper:]')
domain=$(echo $owndomain | tr '[:upper:]' '[:lower:]')
WORKGROUP=$(echo $ownwg | tr '[:lower:]' '[:upper:]')
workgroup=$(echo $ownwg | tr '[:upper:]' '[:lower:]')
for i in "${dc[@]}"; do
  kdc=$(echo -e "kdc = $int$kdc")
  adm=$(echo -e "admin_server = $int$adm")
done
 
cat > /etc/krb5.conf << EOF
[libdefaults]
        default_realm = $DOMAIN
        clockskew = 300
        kdc_timesync = 1
        forwardable = true
        proxiable = true
 
[realms]
$DOMAIN = {
        $kdc
        default_domain = $DOMAIN
        $adm
}
 
 
 
[logging]
        kdc = FILE:/var/log/krb5/krb5kdc.log
        admin_server = FILE:/var/log/krb5/kadmind.log
#       default = SYSLOG:NOTICE:DAEMON
        default = FILE:/var/log/krb5.log
[domain_realm]
        .$WORKGROUP = $DOMAIN
        $WORKGROUP= $DOMAIN
[appdefaults]
pam = {
        ticket_lifetime = 6h
        renew_lifetime = 6h
        forwardable = true
        proxiable = false
        retain_after_close = false
        minimum_uid = 1
        use_shmem = sshd
}
EOF

Benutzer anlegen

Wie oben bereits erwähnt wurde lediglich die Verbindung zum Kerberos-Server konfiguriert, damit bestehende Benutzer authentifiziert werden können. Die Benutzer müssen aber weiterhin manuell angelegt werden. Dies muss mit dem Kontonamen aus der Domäne erfolgen:

useradd -s /bin/bash -m $SAM-Account

Um das zu testen, kann man sich jetzt ein Kerberos-Ticket ausstellen lassen:

kinit $SAM-Account
klist

Fallstricke

Zeitunterschied zu groß

Bei Kerberos darf der Zeitunterschied zwischen Client und Server maximal 5 Minuten sein. Sollte die Anmeldung mal nicht funktionieren unbedingt die Zeitsynchronisation prüfen und ggf. manuell synchronisieren:

# NTP-Dienst anhalten
/etc/init.d/ntp stop
# Manuelle Synchronisation
ntpdate dc1.domain.tld
# NTP-Dienst wieder starten
/etc/init.d/ntp start
# NTP kontrollieren
ntpq -p

Installations-Benutzer kann Passwort nicht ändern

In der Standard-Konfiguration kann der Benutzer, der bei der Installation angelegt wurde, sein Passwort nicht mehr ändern. Grund dafür ist die PAM-Konfiguration, die die Passwortänderung für alle Benutzer aber UID>=1000 an Kerberos weiterleitet. Da der Installationsbenutzer dort aber wahrscheinlich nicht existiert, schlägt die Änderung fehl.

# z.B. in /etc/pam.d/common-auth kontrollieren:
# auth [success=2 default=ignore] pam_krb5.so minimum_uid=1000

Dies lässt sich aber sehr leicht durch das Austauschen der entsprechenden Zeile ändern:

sed -i 's/pam_krb5.so minimum_uid=1000/pam_krb5.so minimum_uid=1001/g' /etc/pam.d/common-*

Damit werden in allen common-Dateien unterhalb von /etc/pam.d/ die uid von 1000 auf 1001 hochgesetzt.

# auth [success=2 default=ignore] pam_krb5.so minimum_uid=1001

Dadurch wird der Installationsbenutzer wieder nur noch lokal authentifiziert.