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.

Debian in ein Active Directory integrieren

Quelle

Diese Dokumentation ist zu großen Teilen dem Artikel Debian Linux in eine Active Directory Domäne integrieren auf www.administrator.de entnommen. Eine sehr gute Anleitung, die ich hier nur für mich spezialisiert und erweitert habe.

Vorraussetzungen

Zeitsynchronisation (NTP)

Da das Kerberos Protokoll, das der Debian Server nutzen soll um mit dem Active Directory zu kommunizieren, stark von einer exakten Systemzeit abhängt, muss der Debian Server als NTP Client und der Windows Server als NTP Client als auch NTP Server konfiguriert sein, damit die Zeitsynchronität gewährleistet werden kann. Der Windows Server bezieht in unserem Szenario die Systemzeit von einem externen NTP Server, während der Debian Server als NTP Client die Systemzeit vom Windows Server bezieht.

DNS Namensauflösung (Forward Lookup und Reverse Lookup)

Ermitteln der verschiedenen Namen die der Domaincontroller trägt (Netbios, Workgroup, Domänen-Name, Kerberos-Realm) Man kann die NETBIOS- und Workgroup Namen auf dem Server2003 mit dem Befehl

nbtstat –n

ermitteln. Der Debian Server muss einen Reverse DNS Lookup auf den Domaincontroller machen können, also die IP Adresse in den DNS Namen auflösen können. Testen mit:

host 192.168.178.140
140.178.168.192.in-addr.arpa domain name pointer dc.firma.de

In aller Regel gilt z. B. bei einem Domaincontroller namens DC.FIRMA.DE

  • der NETBIOS Name ist „DC“
  • der Workgroup Name ist „FIRMA“
  • der DNS Name ist „DC.FIRMA.DE“
  • der Kerberos Realm ist „FIRMA.DE“
  • der Domänen-Name ist „FIRMA.DE“

Damit die AD-Integration des Linux Servers einwandfrei funktioniert ist es wichtig dass..

  • beide Server (Debian und DC) den Namen des anderen auflösen können
  • Forward-Lookup (nslookup debian.firma.de bzw. nslookup dc.firma.de) als auch
  • Reverse-Lookup (nslookup 192.168.178.140 bzw. nslookup 192.168.178.150)

einwandfrei auf beiden Servern funktionieren!

Debian IP Konfiguration

IP-Konfiguration: /etc/network/interfaces

# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
     address 192.168.178.150
     netmask 255.255.255.0
     network 192.168.178.0
     broadcast 192.168.178.255
     gateway 192.168.178.1

DNS Konfiguration: /etc/resolv.conf

# search firma.de 
nameserver 192.168.178.140

Interface resetten (nur bei Konsolenverbindung machen!!!)

# ifdown eth0 
# ifup eth0

Berechtigungen im Active Directory

Man benötigt für die AD-Integration ein AD-Benutzerkonto mit entsprechenden Berechtigungen. Dies kann ein Domänenadministrator sein. Es kann jedoch auch ein spezielles Benutzerkonto erstellt werden das die Berechtigung bekommt Objekte im AD anzulegen. Das ist notwendig da der Debian Server selbst ein Computerkonto im Active Directory anlegen muss und auch Berechtigungen braucht um Anfragen an das AD stellen zu können.

Debian Server Konfiguration

Installation Samba, Winbind, NTP, ntpdate, Kerberos und SSH

Installation für Windows Server 2003 Domänen

# aptitude install libkrb53 krb5-{user,config} samba smbclient winbind ntpdate ntp ssh

Unter Ubuntu (10.04 LTS) heißt das Paket libkrb53

libkrb5-3

Installation für Windows Server 2008 Domänen

Für die Integration des Servers in einen W2k8 Domäne ist zum aktuellen Zeitpunkt (20.05.2010) die Samba-Version des aktuell stabilen Debian Lenny zu alt, da ab Windows Server 2008 nur noch Kerberos und nicht mehr NTLM als Authentifizierung genutzt werden kann. Diese wird aber in der Samba-Version (3.2.5) noch nicht unterstützt. Deswegen müssen für eine Integration in W2k8-Domänen die Pakete aus dem Backport Repository installiert werden.

Dazu die folgende Zeile in die Datei /etc/apt/sources.list einfügen:

deb http:// www.backports.org/debian lenny-backports main contrib non-free

Danach ein …

# aptitude update

… und mann kann mit dem angepassten Install-Befehl die neueren Versionen installieren:

# aptitude -t lenny-backports install libkrb53 krb5-{user,config} samba smbclient winbind ntpdate ntp ssh telnet

Die Konfiguration ist die gleiche, wie in 2003-Domänen.

Dienste beenden

/etc/init.d/samba stop
/etc/init.d/winbind stop
/etc/init.d/ntp stop

Unter Ubuntu (10.04 LTS) heißt der Samba-Dienst anders:

/etc/init.d/smbd stop

Die Warnmeldung bzgl. upstart kann ignoriert werden.

Backup der Linux Config Dateien

Es ist ratsam zunächst alle Config Dateien auf dem Debian System zu sichern bevor man anfängt sie zu editieren. Wenn man beispielsweise bei der PAM Konfiguration die Config zerschießt ist u. U. keine Anmeldung am System mehr möglich.

cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
cp /etc/nsswitch.conf /etc/nsswitch.conf.bak
cp /etc/krb5.conf /etc/krb5.conf.bak
tar -czf /etc/pam.d.targ.gz /etc/pam.d
tar -czf /var/lib/samba.tar.gz /var/lib/samba

Konfiguration der Dienste

Kerberos

Hier eine detailierte Beschreibung möglicher Parameter der krb5.conf

Datei: /etc/krb5.conf

[libdefaults]
    Default_realm = FIRMA.DE
     #The following krb5.conf variables are only for MIT Kerberos.
    krb4_config = /etc/krb.conf
    krb4_realms = /etc/krb.realms
    kdc_timesync = 1
    ccache_type = 4
    forwardable = true
    proxiable = true
[realms]
     FIRMA.DE = {
        kdc = dc.firma.de
        admin_server = dc.firma.de
    }
[domain_realm]
     .firma.de = FIRMA.DE
[login]
    krb4_convert = true
    krb4_get_tickets = false

NTP

In der Datei /etc/ntp.conf den Domänencontroller als Zeitserver eintragen:

server 192.168.178.140

ntpdate

ntpdate dc.firma.de

NTP Dienst starten

/etc/init.d/ntp start

Zeitsynchronisation testen

ntpq -p
dat

Bei Bedarf Zeitzone ändern

Ich verwende Europe/Berlin.

dpkg-reconfigure tzdata

Winbind

Datei: /etc/samba/smb.conf

Hier eine detailliertere Beschreibung des winbind Dienstes

[global]
     workgroup = FIRMA (Arbeitsgruppen Name; in aller Regel Domänen-Name ohne Suffix)
      realm = FIRMA.DE (Domänen-Name)
      netbios name = DEBIAN (NETBIOS-Name des Debian Servers; max. 15 Zeichen lang!)
      security = ADS (Active Directory soll die Authentisierung stellen)
      idmap uid = 10000-20000 (Range der UIDs für das Mapping von AD-RIDs auf UIDs)
      idmap gid = 10000-20000 (Range der GIDs für das Mapping von AD-RIDs auf GIDs)
      template shell = /bin/bash (Shell die der Benutzer nach der Anmeldung bekommt)
      winbind use default domain = yes (User muss kein Prefix bei der Anmeldung angeben)

Hintergrundwissen „idmap“:

Das Linux System hat auch eine lokale Benutzerverwaltung (/etc/passwd). Jeder Benutzer und jede Gruppe benötigt eine eindeutige Kennung.

Im Active Directory sind dies die „SIDs“. Die SID besteht aus dem Domänen-Identifikator und einer RID (Relative Identifier). Jedes Benutzerkonto und jede Gruppe hat eine SID, eine eindeutige Sicherheitskennung.

Da Active Directory und Linux verschiedene Techniken für die Zuordnung von User- und Gruppennamen zu SIDs bzw. UID/GIDs benutzen, ist eine der Aufgaben von winbind, ein Mapping von Active Directory SIDs zu Linux UIDs/GIDs durchzuführen. Diese Zuordnung (welche SID ist zu welcher UID/GID zugeordnet) wird auf dem Linux Server in einer lokalen Datenbank unter /var/lib/samba/winbindd_idmap.tib gespeichert.

Durch den Eintrag „idmap uid = 10000-20000“ wird definiert, dass der Bereich von UID 10000 bis 20000 nicht von der internen Benutzerverwaltung verwendet wird, also für das Mapping von Active Directory SIDs zu Linux UIDs bzw. GIDs verwendet werden soll.

Testen der winbind Config mit

testparm

NSSWITCH

Datei: /etc/nsswitch.conf

Hier eine detailliertere Beschreibung der nsswitch Funktionalität

# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
passwd:        compat winbind
group:         compat winbind
shadow:        compat
hosts:         files dns
networks:      files
protocols:     db files
services:      db files
ethers:        db files
rpc:           db files
netgroup:      nis

PAM

Datei: /etc/pam.d/common-auth

Hier eine detailliertere Beschreibung der pam.d Konfigurationsdateien

# /etc/pam.d/common-auth - authentication settings common to all services
# This file is included from other service-specific PAM config files,
# and should contain a list of the authentication modules that define
# the central authentication scheme for use on the system
# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the
# traditional Unix authentication mechanisms.
#
auth sufficient pam_winbind.so
auth required pam_unix.so nullok_secure use_first_pass

Datei: /etc/pam.d/common-session

Damit bei der ersten Anmeldung am Rechner ein lokales Home-Verzeichnis angelegt wird, kann als erster Eintrag die Zeile

session required pam_mkhomedir.so skel=/etc/skel/ umask=0022

eingetragen werden.

Direkt dahinter sollte noch

session sufficient pam_winbind.so

stehen, damit der gdm bereits beim ersten Anmeldeversuch beim AD nachfragt.

Die vollständige Datei sieht dann bei mir so aus:

session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
session sufficient pam_winbind.so
session required pam_unix.so

Debian Server in die Domäne integrieren

Checkliste

  • host 192.168.178.140 (Funktioniert der Reverse Lookup?)
  • nslookup dc.firma.de (Funktioniert die DNS Namensauflösung?)
  • ping dc.firma.de (Ist der Domaincontroller erreichbar?)
  • telnet dc.firma.de 445 (Port TCP445 erreichbar?)
  • telnet dc.firma.de 139 (Port TCP139 erreichbar?)
  • ntpq –p (Läuft die Zeitsynchronisation?)
  • dpkg-reconfigure tzdata (Stimmt die Zeitzone?)
  • ps –ef | grep mbd (Testen ob der Dienst läuft – wenn ja, stoppen!)
  • ps –ef | grep winbind (Testen ob der Dienst läuft – wenn ja, stoppen!)
  • /etc/init.d/winbind stop (winbindd stoppen!)
  • /etc/init.d/samba stop (smbd / nmbd stoppen!)
  • rm –rf /var/lib/samba/* (eventuell vorhandene winbind cache DB löschen!)

net join

net ads join –U Administrator (Das ist der Domänen-Administrator oder ein Benutzerkonto das berechtigt ist Objekte im AD anzulegen)

Dienste starten

/etc/init.d/samba start 
/etc/init.d/winbind start

Unter Ubuntu (10.04 LTS) heißt der Samba-Dienst anders:

/etc/init.d/smbd start

Die Warnmeldung bzgl. upstart kann ignoriert werden.

Kontrollieren ob SMBD, NMBD und WINBIND Dienste gestartet sind:

ps –ef | grep mbd 
ps –ef | grep winbind

Funktionalität testen

wbinfo –t (zeigt an ob das RPC trust secret passt)
wbinfo -a Administrator%Passwort (zeigt an ob sich AD-User Administrator über winbind authentisieren kann)
wbinfo –u (zeigt die Active Directory Benutzer an)
wbinfo –g (zeigt die Active Directory Gruppen an)
ssh Administrator@localhost (testen ob man sich lokal per SSH als Administrator (oder andere AD-Benutzer) anmelden kann) 
init 6 (Debian Server neu starten und schaun ob die Dienste beim Neustart sauber starten)
update-rc.d samba defaults (Dienste, die eventuell nicht automatisch starten, zu den Autostart Services hinzufügen)
update-rc.d ntp defaults
update-rc.d winbind defaults

Fehlersuche

Was tun wenn es nicht funktioniert, oder wenn es „in der Regel“ funktioniert und plötzlich nicht mehr funktioniert?

Es wird dann Zeit für das wofür man eigentlich bezahlt wird – Fehlersuche und Fehlerbeseitigung.

Teste die grundsätzliche Erreichbarkeit auf Netz- und Portebene

  • ping IP-Adresse (beidseitig)
  • telnet 192.168.178.140 445
  • telnet 192.168.178.140 139

Teste die DNS Namensauflösung auf beiden Servern

Debian Server:
  • host 192.168.178.140 (funktioniert Reverse-Lookup?)
  • host dc.firma.de (funktioniert Forward-Lookup?)
  • ping dc.firma.de (funktioniert Layer3 Konnektivität?)
Windows Server:
  • nslookup 192.168.178.150
  • nslookup debian.firma.de
  • ping debian.firma.de

Logfiles checken

Debian Server:
  • /var/log/samba/log.winbindd
  • /var/log/messages
Windows Server:
  • Ereignisanzeige

Active Directory checken

  • Ist das Computerkonto des Debian Servers deaktiviert? Wenn ja – aktivieren.
  • Ist das Computerkonto des Debian Servers gelöscht? Wenn ja – neu anlegen mit „net ads join -U Administrator“ auf dem Debian-Server. Computerkonto nicht manuell auf dem DC anlegen!

Wiederherstellung der Funktionalität

Siehe oben in der Anleitung ab Backup der Linux Config Dateien.

Informationen aus dem AD anzeigen

Benutzerinformationen zu einem Benutzer

wbinfo -i <benutzername>

AD-Gruppen eines Benutzers abfragen

for GID in $(wbinfo -r <benutzername>); do echo Windows-Gruppe: $(wbinfo -s $(wbinfo -G $GID)), Unix-GID: $GID ; done