Kerberos, PAM


Jiří Matela, xmatela@fi.muni.cz


Obsah


PAM (Pluggable Authentication Modules)

Elementárními impulsy pro nastarování práce na projektu PAM byly dvě poměrně nepříjemné skutečnosti. Jedním problémem byl fakt, že každá aplikace vyžadující jakýkoliv druh autentizace měla toto ověřování implementováno vlastním způsobem. Ať už byla, či je taková implementace bezchybná, pořád popírá základní unixový princip – každý program dělá jednu činnost a dělá ji pořádně. A navíc, ne nutně každý programátor musí být expertem na autentizaci a bezpečnost, a tudíž ne nutně každý program musí mít autentizaci implementovánu zcela bechybně.

Druhý problémek vystoupal na povrch z hlubin temných unixových zákoutí v době, kdy se za účelem zvýšení bezpečnosti přecházelo na systém stíněných hesel. Původní soubor s uživatelskými informacemi (/etc/passwd) se nadále používal, ovšem hesla z něj byla přeložena do běžným uživatelům nepřístupné lokace (/etc/shadow). Při pohledu jedním okem se vše zdálo být v pořádku. Nic složitého. Prozřením oka druhého byl však spatřen nemalý kámen úrazu celé operace přesunu hesel. Každý program, každou aplikaci využívající pro ověřování identit standardní unixovou cestu bylo potřeba předělat.

Obě dvě a i mnohé další situace, řeší PAM. PAM si je možno představit jako mezivrstvu, jež propjuje na straně jedné aplikaci požadující ověření identity s na durhé straně ležící autentizační metodou(/etc/passwd, NIS, Kerberos, biometrika...).

DrawObject


Konfigurace systému PAM

Definice bezpečnostních pravidel a autentizačních metod je PAMu sdělována skrze konfigurační soubor /etc/pam.conf, nebo nověji jednotlivými soubory v adresáři /etc/pam.d/, kde název souboru je roven názvu programu, pro který je konfigurace vytvořena. Některé moduly mechanismu PAM vyžadují detailnější nastavení, jenž bývá uloženo v odpovídajícím souboru v adresáři /etc/security/.


#příklad konfigurace programu login

auth requisite pam_securetty.so

auth requisite pam_nologin.so

auth required pam_env.so

auth required pam_unix.so nullok_secure

account required pam_unix.so

session optional pam_lastlog.so

session optional pam_motd.so

session optional pam_mail.so standard noenv

password required pam_unix.so nullok obscure min=4 max=8 md5


Každé pravidlo v konfiguračním souboru je zapsáno na samostatném řádku a každý takovýto záznam je složen ze tří povinných a jedné nepovinné částí:

  1. fuknční oblast může nabývat těchto čtyř hodnot:

    1. auth (autentizace uživatele) – v této sekci je dle zvoleného modulu (pam_krb5.so = kerberos, pam_unix.so = /etc/passwd, ...) prováděno ověřování identity uživatele, či například ověření, zda superuživatel přistupuje k počítači z bezpečného terminálu.

    2. account (kontrola účtu) – další ověřování jako je například omezení počtu přihlášení uživatele, či povolení přístupu jen v určitou denní dobu

    3. session (správa relace) – ošetření potřebných nastavení před a po vykonání služby. Při konfiguraci programu login se zde nastavuje přidělování prostředků (nastavení systémových limitů) či mountování disku při přihlášení.

    4. password (práce s heslem) – umožňuje nastavit kritéria pro heslo, jako je délka kvalita, způsob šifrování

  2. kontrolní příznaky definují jak se má systém zachovat pokud daný modul neuspěje:

    1. required (povinné pravidlo) – pokud modul při kontrole selže, je služba uživateli odmítnuta. Odmítnutí je ovšem uživateli oznámeno až poté co jsou prověřena všechna pravidla ve skupině – například všechna auth-pravidla

    2. requisite (bezpodmínečné pravidlo) – při selhání takto označeného pravidla dojde k okamžitému odepření služby. Používá se například pro domítnutí přihlášení (zaslání hesla) nešifrovaným spojením

    3. sufficient (postačující pravidlo) – jestliže nedošlo v žádném z předchozích pravidel k odepření služby a i aktuální pravidlo vyhovuje, je služba okamžitě povolena, tedy postačuje PAMu k jejímu povolení. Při neúspěchu je pravidlo ignorováno.

    4. optional (nepovinné pravidlo) – namá vliv na úspěch či neúspěch

  3. název modulu může být zadán:

    1. absolutně – například /usr/lib/security/pam_unix.so

    2. názvem – například pam_unix.so. Moduly jsou potom hledány v defaultním adresáři, kterým je dle konvencí /lib/security

  4. parametry modulu – pozn. některé moduly vyžadují rozsáhlejší konfiguraci, jenž je uložena v konfiguračním souboru modulu – typicky v /etc/security/


Dalším validním záznamem v konfiguraci může být includování souboru užitím @include nazev_souboru. Toho s výhodou využívá například standardní konfiurace PAMu v debianu, kde tak existuje jedno nastaveni pro práci s hesly, keteré je posléze vkládáno do konfiguračních souborů programu login nebo passwd.

Vysvětlení ukázkové konfigurace

# příklad konfigurace programu login

# striktní zákaz přihlásit superuživatele z nedůvěryhodného terminálu

auth requisite pam_securetty.so



# existuje-li soubor /etc/nologin, je všem uživatelům vyjma
# roota zakázáno přihlášení

auth requisite pam_nologin.so



# propársování souboru /etc/environment

auth required pam_env.so



# Standardní unixové ověření hesla. Parametr nullok_secure
# umožňuje použití účtů bez hesla

auth required pam_unix.so nullok_secure



# Znemožnění přihlášení uživatelům, jejichž platnost účtu vypršela

account required pam_unix.so



# Po úspěšném přihlášení vytiskne informace o posledním sezení

session optional pam_lastlog.so



# Po úspěšném přihlášení vypíše na obrazovku obsah souboru /etc/motd

session optional pam_motd.so



# Po úspěšném přihlášení vypíše informace o uživatelově mailové schránce

session optional pam_mail.so standard noenv



# Kontrola hesla povoluje prázdná hesla, parametrem obscure je zajištěna další
kontrola hesla (prilis jednoduche heslo, palindrom ..), pro šifrování se
používá MD5

password required pam_unix.so nullok obscure min=4 max=8 md5



Kerberos

Jako základní popis Kerbera bych si dovolil použít část textu z http://meta.cesnet.cz/cs/docs/software/system/kerberos.html:

Kerberos poskytuje sofistikované mechanismy pro autentizaci a zabezpečení síťové komunikace. Systém Kerberos je definován standardem IETF RFC 1510 a tvoří základní autenizační prvek v řadě komerčních i open-source systémů. Kerberos je navržen tak, aby zajišťoval silné zabezpečení současně s jednoduchým uživatelským rozhraním. Způsob autentizace, tj. prokázaní totožnosti je v systému Kerberos založen na použití tzv. lístků vydávaných centrálním autentizačním serverem, který spravuje databázi všech uživatelů.

Vedle podpory autentizace poskytuje mechanismus kerberovských lístků také podporu tzv. principu single sign-on, který umožňuje uživatelům pohodlné použití prostředků aniž by byli zbytežně zatíženi složitými bezpečnostními procedurami. Uživatel se totiž autentizuje vůči serveru Kerbera pouze jednou a získá tak základní lístek (tzv. Ticket Granting Ticket (TGT)), který se dále použije k získání dalších lístků pro přístup k službám v systému, které vyžadují autentizaci. Při vzdáleném přihlašování na jiné stroje, se přenese také TGT lístek a uživatel tak má stále možnost, jak se autentizovat. Veškeré operace, kromě prvotní autentizace však již probíhají transparentně bez zásahu uživatele, který tak není zdržován ve své činnosti.

Pozn.: Implementací Kerbera existuje hned několika: MIT Kerberos, Heimdal, Microsoft a Shishi. MIT je původní implementace kerbera, která je však v naších končinách často nahrazována implementací Heimdal a to z důvodu amerických exportních omezení na MIT Kerberos. Také Sun Java má svou implementaci Kerbera.


Průběh autentizace

  1. Uživatel pošle zprávu Authentication Serveru (AS) – „Ahoj, ja jsem Franta Uživatel a chci komunikovat se Službou“

  2. Jakmile AS obdrží zprávu, vytvoří 2 kopie úplně nového klíče – session key – který bude použit pro komunikaci mezi uživatelem a službou

  3. Jednu kopii klíče uloží do Krabice 1, tu označí nálepkou Služba a zamkne ji klíčem Franty Uživatele

  4. Druhou kopii klíče vloží do Krabice 2, označí ji nápisem Franta Uživatel a uzamkne ji klíčem Služby

  5. Pošle obě Krabice uživateli.

  6. Uživatel odemkne Krabici 1, a vytáhne z ní session key a nálepku Služba

  7. Uživatel vytvoří novou Krabici 3, vloží do ní papír s aktuálním časem a zamkne ji pomoci session key. Pošle Krabici 2 a Krabici 3 Službě

  8. Služba odemkne svým klíčem Krabici 1, vyndá z ní session key a nálepku Franta Uživatel. Pomocí session key otevře Krabici 3 a vyndá z ní papír s aktuálním časem. Pokud čas na papíře není příliš neaktuální, je Frantovi uznán přístup.

  9. Pozn.: při skutečné komunikaci je Krabice 2 nazývána ticket a Krabice 3 authenticator. Aunthenticator ve skutečnosti obsahuje mnohem více informací.

A je to. Vše funguje tak jak má, ale je zde jedena malá vada na kráse. Aby Franta odemkl Krabici 1, musí použít své heslo a to musí udělat pokaždé, když chce použít nějakou autentifikovanou službu. V Kerberovi je tento problém vyřešen přizváním dalšího hráče do hry – Ticket Granting Server(TGS). TGS je sice logicky oddělen od AS, ale většinou jsou obě části umístěny na jednom stroji, či dokonce implementovány jako jeden celek. Takovéto seskupení se potom nazývá Key Distribution Center (KDC). TGS se na procesu autentizace podílí tak, že před jakýmkoliv použitím služby požádá Franta Uživatel o zaslání ticketu pro TGS úplně stejně, jako by to byla obyčejná služba. Tento ticket (lístek) se nazývá Ticket Granting Ticket (TGT). Jakmile Franta zdárně ukořistí magický TGT, nemusí už zadávat žádné heslo, jelikož veškeré žádosti o autentizaci jsou od nynějška zasílány TGS. Franta jednoduše zašle TGS požadavek na komunikaci s určitou službou a přibalí k tomu svůj TGT.


Kerbeří konfigurace

Konfigurace pro Heimdal kerberos na Debianu.

  1. soubor /etc/krb5.conf

[libdefaults]

default_realm = LAB.FI.MUNI.CZ

forwardable = yes

forward = yes

encrypt = yes

[realm]

LAB.MUNI.CZ = {

kdc = thoe.lab.fi.muni.cz

admin_server = thoe.lab.fi.muni.cz

}

[domain_realm]

thoe.lab.fi.muni.cz = LAB

  1. soubor /var/heimdal/kdc.conf

[kdc]

require-preauth = yes

admin_server = thoe.lab.fi.muni.cz

logging = 0-8/FILE:/var/heimdal/kdc.log

acl_file = /var/heimdal/kadm5.acl

key-file = /var/heimdal/m-key

  1. soubor /var/heimdal/kadm5.acl

    jirka/admin@FI.MUNI.CZ all

Nástroje

kadmin – utilita pro správu KDC - příkazem init LAB.FI.MUNI.CZ se vytvoří databáze pro realm LAB.FI.MUNI.CZ (v MIT se pro tuto činnost používá příkaz kdb5_util create -r LAB.FI.MUNI.CZ)

kinit – autentizace uživatele

kauth – symlink na kinit

klist – seznam lístků

kdestroy – zahození lístků



Zdroje

PAM:

Dokumentace k PAMu z balíku libpam-doc

http://www.root.cz/clanky/pam-sprava-autentizacnich-mechanismu/

http://www.root.cz/clanky/pam-pouziti-v-praxi/


Kerberos:

http://meta.cesnet.cz/cs/docs/software/system/kerberos.html

http://web.mit.edu/kerberos/

http://www.pdc.kth.se/heimdal/

http://josefsson.org/shishi/

http://www.isi.edu/gost/brian/security/kerberos.html

http://orgs.man.ac.uk/documentation/heimdal/