19.04.2023

Kerberos

Apache Webserver
Samba Server
eMail-Server
Kerberos einrichten
OpenSSH Server / Client
DSL Konfiguration unter Linux
NTP Server / Client
DNS Server
Subversion
iSCSI
LDAP-Server
Radius-Server
OpenSSL-Server einrichten
NNTP Server (NEWS-Server) INN und Leafnode
DHCP-Server einrichten
SNMP Service einrichten
Stunnel einrichten
MySQL-Server einrichten
Datensicherung auf Bandlaufwerk
Audio CDs in WAV umwandeln
CDs und DVD erstellen
Grafiken bearbeiten erstellen
FAX Versand und Empfang
Web und FTP Sites syncronisieren
Verschlüsselung von E-Mails und Dokumenten
Programm Übersicht
Datenrettung
Linux Terminalserver
PXE Boot
sonstige Programme

Seitenanfang

Kerberos einrichten (MIT)

Einführung
Documentation
Befehle
Kerberos Client im ActiveDirectory
PAM mit Kerberos
sonstiges

Seitenanfang

Einführung

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.

SSH mit Kerberos sshd.conf

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.

Seitenanfang

Befehle

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

Seitenanfang

Kerberos Client im ActiveDirectory

#/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

Einrichtung von SAMBA ab v.3.0.14a

#/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.

Seitenanfang

PAM mit Kerberos

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
Seitenanfang

sonstiges

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.

Seitenanfang

Documentation

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.

Konfigurationsdatei /etc/krb5.conf und /etc/krb5kdc/kdc.conf

- 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
}

Kerberos-Server einrichten (KDC)

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

Kerberos-Client einrichten

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"

Fehlermeldungen:

"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.