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.