Autentizační systémy -Kerberos, PAM
Jiří Caha, xcaha@fi.muni.cz
Obsah
V roce 1983 vzniká v MIT (Messachusetts Institute of Technology)
projekt Athena (prostředí pro distribuované výpočty).
V rámci tohoto projektu bylo třeba vytvořit distribuovaný autentizační systém
(pro AAA - authentication, autorization, accounting) zvaný Kerberos, jehož první
veřejná verze byla dostupná už v roce 1987 pod názvem Kerberos v4.
První zkušenosti s tímto systémem odhalily však některé nedostatky, a systém se
dočkal redefinice jako Kerberos v5 v roce 1993 v podobě RFC 1510.
První kompletní referenční implementace vychází v MIT v roce 1996.
Ve spojených státech však v té době platí silné omezující podmínky pro export
kryptografických protokolů mimo území USA. Proto vzniká v roce 1997 zcela volně šiřitelná evropská implementace
Heimdal.
Heimdal (aktualní verze 0.6.3) se však snaží zachovávat kompatibilitu
jak s Kerberem v4 tak s Kerberem v5.
(Z dalších volně šiřitelných implementací Kerbera 5 ještě zmiňme
shishi ve verzi 0.0.18)
Kerberos je od počátku navržen tak, aby autentizace neprobíhala
zasíláním hesel, ale pomocí lístku, které pak mohou putovat i přes nezabezpečenou síť.
Autentizace je založena na důvěryhodné třetí straně (KDC, Key Distribution Center).
Kerberos v4 využívá(l) symetrické kryptografie (DES)
Zatímco Kerberos v5 je založen na kryptografii s veřejným klíčem (PKC, public key cryptogtaphy)
- konkrétněji pak na Denning-Soccoove modifikaci Needham-Schroederova tří-stranného
autentifikačního protokolu.
Kerberos používá dva typy důvěryhodných stran (ze kterých se skládá KDC):
- Autentifikační server (AS, Authentication server)
- Server poskytující lístky (TGS, Ticket-Granting Server)
Každý uživatel sdílí tajný klíč s AS. Tento tajný klíč není nikdy posílán po
síti. Místo něj se ale posílají tzv. lístky.
AS slouží k autentizaci uživatele. Komunikace s AS probíhá obvykle jednou za
sezení.
Uživatel obdrží od AS TGS ticket pro komunikaci s TGS, u něhož žádá
o server ticket pro každou službu kterou využívá v rámci jednoho sezení.
Komunikace se serverem (službou) pak probíhá pomocí server ticket, jehož
součástí je i symetrický klíč pro zabezpečenou komunikaci client-server.
+---------------+ +--------------+
| Kerberos | | Ticket |
| Authentication| | Granting |
| Server (AS) | /| Server (TGS) |
+---------------+ / +--------------+
| / (1) request TGT ticket
|(1) /(2) (2) request server ticket
| / (3) request service
+---------------+ (3) +--------------+
| Client |-----|Server/service|
+---------------+ +--------------+
Princip komunikace:
- (1) client:
- Klient se autentifikuje u AS = požádá o TGT lístek.
Klient tedy pošle AS svůj Client.name.
- (1) AS:
- AS vyhledá klienta v databázi sdílených klíčů a podle nalezeného klíče
vytvoří (hash sdíleného klíče) tajný klíč key_C-AS.
Zároveň vygeneruje dočasný klíč tmpkey_C-TGS pro komunikaci Client-TGS,
a tento klíč zašifruje pomocí key_C-AS.
Dále vytvoří TGT lístek:
(Client.name, TGS.name, Client.address, tmpkey_C-TGS), který pak zašifruje pomocí
tajného klíče TGS key_AS-TGS.
Zašifrované Ekey_C-AS(tmpkey_C-TGS) a Ekey_AS-TGS(Client.name,TGS.name,Client.address,tmpkey_C-TGS)
pak pošle klientovi
- (1) client:
- Klient si dokáže vytvořit key_C-AS ze znalosti sdíleného klíče s AS
(=autorizace klienta) a rozšifrovat dočasný klíč tmpkey_C-TGS pro
komunikaci s TGS.
- (1)
- Komunikace Client-AS probíhá jen jednou za sezení. Uživatel tak
např. zadává heslo jen jednou, i když využívá několik různých služeb.
Vlastní už totiž TGT ticket, díky kterému mu TGS vydává lístky pro
jednotlivé servery/služby.
- (2) client:
- Chce-li nyní klient použít server, požádá TGS o lístek:
vytvoří tzv. authenticator=
(Client.name, Client.address, timestamp1)
a zašifruje jej pro TGS pomocí tmpkey_C-TGS.
Zašifrovaný authenticator pošle spolu s TGT lístkem a názvem požadované
služby TGS.
- (2) TGS:
- TGS dokáže pomocí svého klíče rozšifrovat TGT lístek, tím získá klíč tmpkey_C-TGS,
kterým zase rozšifruje authenticator a ověří platnost všech položek
(timestamp1, Client.address, ...).
Vytvoří dočasný klíč tmpkey_C-S pro komunikaci Client-Server.
Vytvoří server-ticket který obsahuje (Client.name,Server.name,
Client.address, ticket.lifetime, timestamp,tmpkey_C-S),
a zašifruje tento lístek pomocí klíče key_TGS-S sdíleného spolu se serverem.
Klientovi pak pošle takto zašifrovaný lístek a klíčem tmpkey_C-TGS
zašifrovaný tmpkey_C-S.
- (2) client:
- Klient si rozšifruje dočasný klíč tmpkey_C-S pro komunikaci se serverem.
Zároveň obdržel lístek pro použití serveru (služby).
- (3) client:
- Klient nyní vytvoří nový authenticator obsahující
(Client.name,Client.address,timestamp2) zašifrovaný pomocí klíče tmpkey_C-S.
A pošle jej spolu se server-ticket serveru.
- (3) server:
- Dešifruje lístek a authenticator, a ověří platnost všech položek.
pošle zpět klientovi zašifrovaný timestamp2+1.
- (3)
- I další komunikace Client-Server probíhá šifrovaně pomocí tmpkey_C-S.
Popsaná konfigurace je pro verzi z MIT na Red Hat Linux 9
Aktualní verze krb5-1.3.5 je možné stáhnout z http://web.mit.edu/kerberos/dist/index.html.
Je doporučeno zprovoznit DNS a časovou synchronizaci (ntp).
Nainstalovat balíčky krb5-libs,krb5-server,krb5-workstation (pro GUI konfiguraci pak např. gnome-kerberos).
Upravit soubor /etc/krb5.conf, např.:
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
ticket_lifetime = 24000
default_realm = FI.MUNI.CZ
dns_lookup_realm = false
dns_lookup_kdc = false
[realms]
FI.MUNI.CZ = {
kdc = agaue-alpha.fi.muni.cz:88
admin_server = agaue-alpha.fi.muni.cz:749
default_domain = fi.muni.cz
}
[domain_realm]
.fi.muni.cz = FI.MUNI.CZ
fi.muni.cz = FI.MUNI.CZ
[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
Upravit soubor /var/kerberos/krb5kdc/kdc.conf, např:
[kdcdefaults]
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
v4_mode = nopreauth
[realms]
FI.MUNI.CZ = {
master_key_type = des-cbc-crc
supported_enctypes = arcfour-hmac:normal arcfour-hmac:norealm arcfour-hmac:onlyrealm des3-hmac-sha1:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal des-cbc-crc:v4 des-cbc-crc:afs3
}
Vytvořit databázi pomocí kdb5_util:
/usr/kerberos/sbin/kdb5_util create -s
příkaz create vytváří databázi klíčů pro Kerberos realm.
Parametr -s vytvoří soubor, ve kterém bude uložen hlavní klíč serveru. Pokud žádný soubor neuvedeme, bude se náš Kerberos server (krb5kdc) při každém spuštění na tento klíč ptát.
Upravíme soubor /var/kerberos/krb5kdc/kadm5.acl:
tento soubor používá kadmind pro zjištění kteří uživatelé (principals) mají přístup k databázi a s jakou úrovní.
*/admin@FI.MUNI.CZ *
Utilita kadmin komunikuje s kadmin serverem po síti, a k autentifikaci používá Kerbera, proto pokud chceme vytvářet prvního uživatele, musíme jej vytvořit pomocí kadmin.local:
/usr/kerberos/sbin/kadmin.local -q "addprinc username/admin"
Kerbera spustíme příkazy:
/sbin/service krb5kdc start
/sbin/service kadmin start
Uživatele nyní můžeme přidávat příkazem addprinc u kadmin.
Pro získání lístku slouží kinit, pro jejich vypsání klist, a zrušení kdestroy.
Opět je doporučena synchronizace času.
Nainstalované balíčky krb5-libs a krb5-workstation.
Upravit soubor /etc/krb5.conf (obvykle může být stejný jako u KDC).
addprinc -randkey host/agaue-alpha.lab.fi.muni.cz
ktadd -k /etc/krb5.keytab host/agaue-alpha.fi.muni.cz
http://cryptnet.net/fdp/admin/kerby-infra/en/kerby-infra.html - Kerberos Infrastructure HOWTO
http://www.redhat.com/docs/manuals/linux/RHL-9-Manual/ref-guide/s1-kerberos-server.html - Red Hat Linux Reference Guide (Chapter 17. Kerberos).
V dřívějších dobách si autentifikaci uživatelů přistupujících k dané aplikaci musela obstarat aplikace sama.
Tento přístup má několik nevýhod:
nejen že to je zcela proti filozofii unixových systému (kde každý program děla jednu věc, ale dělá ji dobře),
ale hlavně nedovoluje jednoduchou změnu autentizačních mechanizmů.
Linux-PAM (Pluggable Authentication Modules for Linux) je systém modulů dovolující aplikacím nezávislost na autentizačních mechanizmech, které jsou plně pod správou systému PAM.
Aplikace pak samotný proces autentizace (realizovaný heslem, biometrikami, čipovými kartami, ...) přenechává na knihovně
libpam.
Důležitou součástí systému PAM jsou autentizační moduly (dynamické objektové soubory) umístěné v adresáři /lib/security/ nebo /usr/lib/security/.
Konfigurační soubory
Ve starších verzích byl konfigurační soubor /etc/pam.conf,
novější verze má pro každou aplikaci (schopnou pracovat s PAM) zvláštní konfigurační soubor nacházející se v adresáři
/etc/pam.d/ (např. /etc/pam.d/reboot). Soubor /etc/pam.conf se pak bere na vědomí jen v případě, že adresář /etc/pam.d/ neexistuje.
Struktura /etc/pam.conf je:
service-name
module-type
control-flag
module-path
args
Struktura /etc/pam.d/<service-name> je:
module-type
control-flag
module-path
args
Kde:
- service-name
- Jméno služby/aplikace.
Speciální service-name OTHER je rezervovaný pro defaultní autentifikační mechanismus. Zde je dobrým zvykem zakázat vše, co není vysloveně povoleno:
#%PAM-1.0
# This is /etc/pam.d/other
auth required pam_deny.so
auth required pam_warn.so
account required pam_deny.so
account required pam_warn.so
password required pam_deny.so
password required pam_warn.so
session required pam_deny.so
session required pam_warn.so
- module-type
Jeden ze čtyř možných typů modulu:
- auth
- autentizace uživatele (heslem, biometrikami, ...);
- account
- provádí se další ověřování přístupu k službě, které však nemá nic společného s ověřováním identity uživatele (např. přístup jen v určitou dobu,...);
- session
-
provádí se před a po skončení služby. Stará se o správu sezení. Může např. nastavovat proměnné prostředí, omezovat systémové prostředky, chroot, logovaní, ...
- password
-
provádí aktualizaci uživatelských autentizačních tokenů (heslo, otisk prstu, ...).
Obvykle také umožňuje kontrolu "kvality" hesla (délka, odolnost proti slovníkovému útoku).
- control-flag
- používá se k definici reakce na (ne)úspěšné ukončení modulu.
Moduly stejného typu se spouštějí v sérii (jeden po druhém). Kontrolní příznaky pak určují reakci při skončení modulu. Aplikace se ale nedozví jak skončil který modul, místo toho obdrží jen celkovou odpověď success/fail.
Od Linux-PAM v0.60 lze kontrolní příznak definovat jedním ze dvou způsobů:
pomocí jednoho z klíčových slov:
- required
- jeho neúspěch způsobí zamítnutí, ale až po provedení ostatních modulů ze stejné oblasti.
- requisite
- liší se od required okamžitým oznámením neúspěchu.
Např. při přihlašování přes nespolehlivý kanál nám nedovolí zadávat heslo.
- sufficient
- modul s tímto příznakem může okamžitě ukončit kontroly s výsledkem success, pokud tento modul uspěl a žádný z předchozích modulů nezamítl přístup. Jinak je modul ignorován a pokračuje se dál v kontrole.
Využívá se převážně pro přeskočeni zdlouhavých kontrol, pokud službu požaduje superuživatel.
- optional
- (ne)úspěch těchto modulů se nezahrnuje do celkového výsledku.
Nebo pomocí propracovanější syntaxe, ve které je kontrolní příznak tvaru:
[value1=action1 value2=action2, ...]
- module-path
- cesta k modulům. Implicitně (pokud není zadána cesta absolutní) se hledá v /usr/lib/security/ (/lib/security/).
- args
- argumenty předávané modulu při jeho spuštění.
Příklad modulu
- pam_localuser
- vyžaduje uživatele uvedeného v /etc/passwd
- pam_krb5
- autentizace přes Kerberos 5
- pam_succeed_if
- úspěch tohoto modulu závisí na širší charakteristice uživatelova účtu (LOGIN,UID,GID,SHELL,HOME).
- pam_cracklib
- kontrola odolnosti hesla.
- pam_limits
- nastavování limitu (/etc/security/limits.conf).
- pam_time
- přístup jen v určitou dobu (/etc/security/time.conf).
- pam_warn
- slouží pro zápis do syslogu.
Příklad konfiguračního souboru
/etc/pam.d/login
#%PAM-1.0
auth required pam_securetty.so
#kontrola, zda pristupujeme pres bezpecny kanal
auth required pam_stack.so service=system-auth
#vyhodnoce se ulozi na zasobnik
auth required pam_nologin.so
#kontrola zda neexistuje soubor /etc/nologin
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
session required pam_stack.so service=system-auth
session optional pam_console.so
http://www.kernel.org/pub/linux/libs/pam/ - Linux-PAM
http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/ - online dokumentace
http://www.root.cz/clanek/478 - PAM -- správa autentizačních mechanismů
http://www.root.cz/clanek/495 - PAM -- použití v praxi