Einführung
Documentation
Befehle
Kerberos Client im ActiveDirectory
PAM mit Kerberos
sonstiges
Als Vorraussetzung zum Betrieb von Kerberos ist es wichtig, das die Uhrzeit im Netz syncron auf allen Rechnern ist, bei einer Abweichung von mehr als 5 Minuten verweigert der Kerberos-Server die Ausstellung des initialen Tickets. Des weiteren muss DNS im Netzwerk funktionieren, als Notlösung kann man auch über die /etc/hosts auf den Clients den FQDN des Kerberos-Servers auflösen lassen.
auf dem Adminserver ausführen um einen Benutzeraccount anzulegen
> kadmin.local > ank mmustermann > quit
Der Principal (etwas das Kerberos authentifizieren kann) des Benutzers besteht dann aus dem Namen und den REALM z.B. MMustermann@domain.tld
um Administrationsaufgaben zu erledigen kann man für den Benutzer noch einen weiteren Principal anlegen z.B. mmustermann/admin@domain.tld. So kann man mit einer Regel definieren das alle Principals mit Instanz "admin" Administratorrechte anfordern dürfen.
Mit Kerberos ist es auch möglich Service Principals anzulegen, so kann sich auch ein Dienst gegenüber eines Benutzers der ihn nutzt ausweisen z.B. HTTP/www.domain.tld@domain.tld für einen Webserver
einen HOST Principal damit der Computer zweifelsfrei identifiziert werden kann legt man folgendermaßen an
kadmin.local ank -rendkey host/sonne.domain.tld ktadd host/sonne.domain.tld
Bei der Authentifizierung mit einem Benutzerpricipal wird nach einem Kennwort gefragt, die Service und HOST Principals authentifizieren sich mittels Keytab einer Datei in der die Kennwörter gespeichert sich (auf Zugriffsrechte achten)
Konfigurationsdatei
#krb5.conf [kdcdefaults] kdc_ports = 750,88 [libdefaults] default_realm = DOMAIN.TLD [realms] DOMAIN.TLD = { database_name = /var/lib/krb5kdc/principal admin_keytab = FILE:/etc/krb5kdc/kadm5.keytab acl_file = /etc/krb5kdc/kadm5.acl key_stash_file = /etc/krb5kdc/stash kdc_ports = 750,88 max_life = 10h 0m 0s max_renewable_life = 7d 0h 0m 0s master_key_type = des3-hmac-sha1 supported_enctypes = aes128-cts-hmac-sha1-96:normal aes256-cts-hmac-sha1-96:normal \ des3-hmac-sha1:normal default_principal_flags = +preauth }
- Passwortrichtlinie Names adminpol definieren
add_policy -minlife "14 days" -maxlife "100 days" -minlength 8 \ -minclasses 3 -history 10 adminpol
das Passwort ist maximal 100 Tage gültig, muss aus mind. 8 Zeichen aus 3 verschiedenen Klassen (Groß- oder Kleinbuchstaben, Ziffern und Sonderzeichen) und eine History von 10 Passwörtern wird gespeichert, erst nach 14 Tagen darf man sein Passwort ändern.
- die Richtlinie einen Account zuweisen
ank -policy adminpol mmustermann/admin
- Kerberos automatisch ein Passwort für einen HOST erzeugen lassen
ank -randkey host/sonne.domain.tld
- HOST Principal der Datei /etc/krb5.keytab hinzufügen
ktadd host/sonne.domain.tld
- wenn man z.B. für bestimmt Service eine eigene Keytab Datei braucht, z.B. wenn der Service unter einem Benutzernamen läuft der nicht Root ist, hat dieser auf die Datei /etc/krb5.keytab
keine Leserechte.
Ein Beispiel ist der Webserver Apache der normalerweise unter dem Benutzer wwwdata läuft, kann man für diesen eine eigene keytab Datei anlegen und auf dieser eine Leseberchtigung
für den Benutzer einrichten z.B. unter /etc/apache2/apache2.keytab.
Um den Kerberos Client den verantwortlichen KDC für den REAL mitzuteilen, kann man im DNS im Zonenfile einen Eintrag setzen. Der Eintrag _kerberos für den KDC _kpasswd und _kerberos-adm für den AdminServer
_kerberos TXT "DOMAIN.TLD" _kerberos._udp SRV 0 0 88 sonne _kpasswd._udp SRV 0 0 464 sonne _kerberos-adm._tcp SRV 0 0 749 sonne
/etc/krb5.conf auf dem Kerberos Client setzen
dns_lookup_realm = true
auf dem AdminServer in der Datei kdc.conf verweist der Eintrag acl_file auf eine Datei die die Zugriffsrechte auf den AdminServer regelt durch den Eintrag
*/admin *
setzt man z.B. dass jede AdminInstanz eines Principals sämtliche Zugriffsrechte auf die Kerberos Datenbank besitzt. So kann man mit kadmin auf einen entfernten Rechner auch sämtliche Funktionen ausführen.
Beispiel für das anlegen eines neuen Hostes in der Kerberos Datenbank
kadmin ank -randkey host/mond.domain.tld ktadd -k /tmp/krb5.keytab host/mond.domain.tld exit
Zugriffsrechte auf die Keytab Datei setzen
chmod 700 /tmp/krb5.keytab chown root:root /tmp/krb5.keytab mv /tmp/krb5.keytab /etc/
Um Apache auf Kerberos umstellen muss man das Modul mod_auth_kerb aktivieren. Dann den Principal anlegen und KeyTab erstellen
kadmin ank -randkey HTTP/mond.domain.tld ktadd -k /etc/apache2/apache2.keytab HTTP/mond.domain.tld exit chmod 700 /etc/apache2/apache2.keytab chown wwwdata:wwwdata /etc/apache2/apache2.keytab
Einstellungen in der mod_auth_kerb.conf
AuthName "Big Zs Blog" AuthType Kerberos Krb5keytab /etc/apache2/apache2.keytab # Authentifizierte Benutzer Zugriff erlauben Require valid-user
PAM mit Kerberos
Mobul pam_krb5.so installieren und unter /etc/pam.d den Eintrag setzen
auth, account und session werden beim Anmelden durchlaufen und password beim ändern des Passwortes.
auth sufficient pam_krb5.so auth required pam_unix.so account required pam_krb5.so account required pam_unix.so session required pam_krb5.so session required pam_unix.so password sufficient pam_krb5.so password sufficient pam_unix.so
Systemweite Benutzer werden durch Kerberos mit dem Modul pam_krb5.so authentifiziert, Systembenutzer z.B. root werden durch pam_unix.so authentifiziert, da sie nicht in der KerberosDB geführt werden
Feinabstimmung vom pam_krb5.so
ignore_root
minimum_uid=1000.
Systembenutzer z.B. Root werden nicht über Kerberos authentifiziert, da sie eine kleiner ID als 1000 haben. So stockt der Login für root auch nicht, wenn der KDC nicht im Netz verfügbar ist.
use_first_pass
Sorgt dafür das bei einem Tippfehler das nachfolgende Modul pam_unix.so nicht nach dem Passwort fragt, da der Benutzer in der lokalen Benutzerdatenbank sowieso nicht existiert und eine authentifizierung damit sowieso fehlschlägt.
Da PAM schon auf Kerberos eingestellt ist, soll das auch gleich für SSH genutzt werden.
UsePAM
ChallengeResponseAuthentication = yes
um SSH auf Kerberos umzustellen ist es nötig auf jedem Rechner die Rechner von denen eine SSH Anmeldung abgesetzt wird in die Datei /etc/krb5.keytab aufzunehmen
z.B erfolgt der Login vom Rechner mond.domain.tld muss für diesen der Eintrag host/mond.domain.tld in den keytabs aller Rechner gesetzt werden, damit ein Single Sign-On möglich ist und nicht beim Login von einem zum anderen Rechner nach dem Kerberos Passwort gefragt wird.
in der sshd_config muss die Option GSSAPI-Authentication = yes gesetzt werden und in der ssh_config die Option GSSAPIAuthentication und GSSAPIDelegateCredentails.
/etc/krb5.conf
[libdefaults] forwardable = true
um das Ticket beim SSH Login von einem Rechner zum anderen übertragen zu können.
Befehle | Erläuterung |
---|---|
kpasswd | ändern des Kerberos Passwort |
kinit user | Ticket für den Benutzer "user" erstellen |
klist | Ticket-Cache anzeigen |
kdestroy | Ticket-Cache löschen |
kdb5_util create | legt neue Datenbank für den REALM an, Passwort für die Datenbank wird abgefragt |
kdb5_util stash | erzeugt eine Datei mit dem Schlüssel zum Zugriff auf die Datenbank |
kadmin.local | Erstkonfiguration auf dem KerberosPC |
kadmin | wie kadmin.local setzt aber einen bestehenden Pricipal zur Anmeldung voraus, da es gegen Kerberos authentifiziert |
Dateien | Bedeutung |
/etc/default/krb5-admin-server | kadmin Default Einstellung |
/etc/default/krb5-kdc | KDC Server Default Einstellung |
/etc/krb5kdc/kadm5.acl | welcher Principal welche Berechtigungen für die Veränderung der Kerberos Datenbank erhält. |
/etc/krb5kdc/kadm5.keytab | Datei, in der die geheimen Schlüssel der kadmin Principals hinterlegt werden. |
/etc/krb5kdc/kdc.conf | KDC Server Konfiguration |
/var/lib/krb5kdc/principal | Principal Datenbank |
/etc/krb5.conf | für Kerberos Server und Client |
/etc/krb5.keytab | Geheime Schlüssel des Rechners "Host-Principals" |
kadmin - Befehle | Erläuterung |
---|---|
get_principal | zeigt bestehende Benutzer-Attribute an |
getprincs | Kurzform von get_principals |
cpw | Passwörter ändern |
add_principal | Hinzufügen eines Principals. Dabei wird auch das Passwort gesetzt. Hierbei können eine Menge Optionen gesetzt werden, wie Beispielsweise die Lebensdauer des Principals selbst, seines Passworts und seiner Tickets, welche Arten von Tickets erlaubt sind, wie sie verschlüsselt werden, u.v.m. |
delete_principal | Löschen eines Principals. |
modify_principal | Vornehmen von Veränderungen an einem Principal. Es können alle Optionen verändert werden, die beim Anlegen eines Principals gesetzt werden können. |
change_password | Das Passwort eines Principals kann verändert werden, falls z.B. ein Benutzer sein Passwort vergessen hat, oder es abgelaufen ist. |
list_principals oder get_principals | Hauptbenutzerliste anzeigen |
add_policy | Fügt eine "Policy" für Passwörter hinzu. Eine Policy regelt Eigenschaften von Passwörtern wie Ihre Lebensdauer, wie viele verschiedene Zeichenklassen16mindestens enthalten sein müssen und wie viele vorige Passwörter in der so genannten ,,history'' aufbewahrt werden, um zu verhindern, dass Benutzer ein vergangenes Passwort erneut verwenden oder zu einfache Passwörter wählen. |
delete_policy | Löscht eine Policy. |
modify_policy | Verändert die Eigenschaften einer Policy. |
get_policy | Zeigt eine Policy an. |
list_policies | Listet alle Policies auf. |
ktadd | Fügt einen Principal zu einer keytab hinzu. |
ktremove | Löscht einen Principal aus einer keytab. |
kadmin.local kann auf dem Master-KDC von root aufgerufen werden, ohne das der krb5-admin-server läuft. Mit kadmin kann man die Kerberos Datenbank bearbeiten,
auch von entfernten Hosts z.B. zum Passwort ändern, dazu muss dann der krb5-admin-server läufen.
Hilfe bekommt man mit man kadmin
#/etc/krb5.conf [libdefaults] default_realm = KDC.DOMAIN.TLD dns_lookup_realm = false dns_lookup_kdc = false [realms] KDC.DOMAIN.TLD = { kdc = w2k.kdc.domain.tld default_domain = KDC.DOMAIN.TLD } [domain_realm] .domain.tld = KDC.DOMAIN.TLD
#/etc/samba/smb.conf [global] workgroup = kdc password server = srv.kdc.domain.tld security = ads realm = KDC.DOAMIN.TLD encrypt passwords = yes local master = no os level = 20 domain master = no preferred master = no #Winbind winbind separator = + idmap gid = 10000-20000 idmap uid = 10000-20000 template shell = /bin/bash template homedir = /home/%D/%U
Das Winbindd Paket von Samba macht die Übersetzung der Unix User und Gruppen mit den AD-Usern und Gruppen. Mit wbinfo läst sich dann die Verbindung mit dem Domaincontroller und dem Linux-Client prüfen.
apt-get install libpam-krb5
/etc/pam.d/common-account /etc/pam.d/common-auth /etc/pam.d/common-password /etc/pam.d/common-session
unter Debian Woody die Datei /etc/pam.d/login und /etc/pam.d/other
#%PAM-1.0 account sufficient pam_krb5.so account sufficient pam_unix.so
auth required pam_securetty.so auth required pam_nologin.so auth required pam_env.so auth required pam_mail.so auth sufficient pam_krb5.so auth required pam_unix.so md5 use_first_pass
password required pam_pwcheck.so password sufficient pam_krb5.so use_first_pass use_authtok password required pam_unix.so use_first_pass use_authtok
session required pam_limits.so session required pam_unix.so none # debug or trace session optional pam_krb5.so
Principal | z.B. der Benutzer an einer Workstation |
REALM | sollte den Namen der Domain entsprechen, nur in GROSSBUCHSTABEN. |
Ticket Granting Server | ist der Server der die Kerberos Tickets ausgibt (hat den "Principal" krbtgt/DOMAIN.TLD@DOMAIN.TLD, wenn der "REALM" DOMAIN.TLD lautet). |
Ticket Granting Ticket | (TGT) Tickets des Users (haben eine beschränkte Gültigkeitsdauer) |
PAM | Pluggable Authentication Modules |
Bei der Autorisierung bracht man dann kein Passwort mehr eingeben, bei jedem
Dienst wird man dann über das Ticket autorisiert. Mit "telnet -x server.domain.tld" kann
man dann auf einen Server zugreifen, die Option (-x) weist dem Programm an, das
es Kerberos zur Autorisierung verwenden soll, der Netzwerkverkehr wird dabei
auch gleich Verschlüsselt. Die Option (-x) ist auch unter FTP, SSH ua. möglich,
wenn die Dienste Kerberosfähig sind.
apt-get install krb5-doc
- Server-Documentation
/usr/share/doc/krb5-doc/admin.html
- Client-Documentation
/usr/share/doc/krb5-doc/user-guide.html
- Anwendungen, die PAM verwenden, können Kerberos zur Authentifizierung nutzen mit dem Paket "libpam-krb5"
apt-get install libpam-krb5
DNS aktualisieren damit die Clients den KDC-Server finden.
- Die Sektion "libdefaults" enthält allgemeine Voreinstellungen
für alle Kerberos Programme, Clienten und Server.
Die Direktive "default_realm" teilt den Programmen mit, welches "Realm" als
Voreinstellung zu benutzen ist. "Principals" können so z.B. ohne
Angabe des Namens des Kerberos 5 Realms verwendet werden.
Mit "default_tkt_enctypes" werden die Verschlüsselungstypen
spezifiziert, die die Clienten anfordern sollen, mit default_tgs_enctypes jene,
die der KDC
zurückgeben soll. Standardmäßig sind des-cbc-crc, des-cbc-md5
und
des3-hmac-sha1 die einzigen Optionen, allerdings kann Kerberos auch dahingehend
erweitert werden,
dass andere Typen möglich sind.
#/etc/krb5.conf [libdefaults] default_realm = DOMAIN.TLD default_tgs_enctypes = des3-hmac-sha1 des-cbc-crc des-cbc-md5 default_tkt_enctypes = des3-hmac-sha1 des-cbc-crc des-cbc-md5 dns_lookup_kdc = false dns_lookup_realm = false [realms] DOMAIN.TLD = { kdc = DOMAIN.TLD admin_server = DOMAIN.TLD } [domain_realm] .DOMAIN.TLD = DOMAIN.TLD .TLD = DOMAIN.TLD [login] kdc = CONSOLE kdc = SYSLOG:INFO:DAEMON admin_server = FILE:/var/log/kadmin admin_server = DEVICE=/dev/tty09
#/etc/krb5kdc/kdc.conf [kdcdefaults] kdc_ports = 750,88 [realms] DOMAIN.TLD = { database_name = /var/lib/krb5kdc/principal admin_keytab = /etc/krb5kdc/kadm5.keytab acl_file = /etc/krb5kdc/kadm5.acl key_stash_file = /etc/krb5kdc/stash kdc_ports = 750,88 max_life = 10h 0m 0s max_renewable_life = 7d 0h 0m 0s master_key_type = des3-hmac-sha1 supported_enctypes = des3-hmac-sha1:normal default_principal_flags = +preauth }
1. Server Pakete installieren
apt-get install krb5-admin-server krb5-config krb5-kdc krb5-user libkadm55 libkrb53
2. erstellt die Datenbank, die zum Speichern der Schlüssel für den
Kerberos-Realm verwendet wird.(/var/lib/krb5kdc/principal)
kdb5_util create
3. Datei /etc/krb5kdc/kadm5.acl erzeugen und die Benutzer die die Datenbank ändern
sollen eintragen. Hierin ist festgelegt, dass alle Principals mit der Instanz "admin" alle
Rechte zur Veränderung der Kerberos 5 Datenbank haben.
root/admin@DOMAIL.TLD *
4. ersten Principal (Admin-Principal) erstellen mit
kadmin.local -q "addprinc username/admin"
(kadmin ist interaktiv, um diesen Modus zu nutzen reicht wenn man "kadmin.local" aufruft,
Hilfe im interaktiven-Modus mit.)
5. Nun müssen die administrativen Accounts kadmin/admin und kadmin/changepw
noch in die in der Datei kdc.conf angegebene "keytab" gelegt werden:
kadmin.local -q "ktadd -k /etc/krb5kdc/kadm5.keytab kadmin/admin kadmin/changepw"
6. Kerberos-Server starten
/etc/init.d/krb5-kdc start
7. Benutzer (Principal) hinzufügen mit "kadmin" oder wenn man
am Master-KDC sitzt mit "kadmin.local"
kadmin.local -q "addprinc username"
8. Testen ob man ein Ticket erzeugen kann (kinit Principal).
kinit username
- eine Referenzenliste im Cache anzeigen.
klist
- um den Cache sowie die enthaltenen Referenzen zu zerstören.
kdestroy
Stellen Sie sicher, dass zwischen dem Kerberos-Client und KDC Zeitsynchronisierung
vorhanden ist. DNS auf dem Kerberos-Client fehlerfrei läuft.
Ü
berschreitet die Zeitdifferenz zwischen der Server- und den Clientuhren fünf
Minuten (der Standardwert kann in Kerberos 5 konfiguriert werden), sind die Kerberos-Clients
nicht in der Lage, sich am Server anzumelden. Diese Zeitsynchronisierung (NTP-kompatibel)ist
notwendig, um Angreifer davon abzuhalten, ein altes Kerberos-Ticket zu verwenden,
um sich als gültigen Benutzer auszugeben.
1. Client installieren
apt-get install krb5-config krb5-user libkadm55 xinetd
2. Konfigurationsdatei /etc/krb5.conf sollte die gleiche sein wie auf dem Server
3. auf der Workstation das xinetd-Paket installieren und den Hostprincipal in
der Kerberos-Datenbank eintragen.
kadmin.local -q "addprinc -randkey host/host.domain.tld"
4. kadmin auf der Workstation aufrufen
kadmin -q "ktadd -k /etc/krb5.keytab host/host.domain.tld"
"kinit(v5): Preauthentication failed while
getting initial credentials"
- kann an einem Zeitunterschied zwischen Server und Client liegen. Fehlermeldung im Syslog "preauth (timestamp) verify failure: Clock skew too great"
- nachdem man "kadmin.local -q "ktadd -k /etc/krb5kdc/kadm5.keytab user/admin kadmin/admin ..." aufgerufen hat sollte man das Passwort des Users noch einmal neu setzen, bis die Erstellung des Tickets funktioniert, dann kann man auch "kadmin" auf dem Client aufrufen.