Kerberos, synchronizace času po síti
Vladimír Štill, xstill@fi.muni.cz
Obsah
Kerberos
Kerberos je protokol pro autentizaci po síti. Umožňuje aby komunikující strany ověřili vzájemně svou identitu za pomoci důvěryhodné třetí strany – Kerberos serveru. Toto ověření probíhá po síti, která sama není nijak zabezpečená – protokol zajišťuje odolnost proti odposlechům a útokům přehráváním paketů. Aktuální verze Kerberos 5 je popsána v RFC 4120. Kerberos běží na UDP portu 88.
Pojmy
- realm
- jméno oblasti zpravované daným serverem, typicky doménové jméno psané velkými písmeny (např.
FI.MUNI.CZ
, PROTO11.PV090.FI.MUNI.CZ
). Obecně ASCII řetězec. Jednotlivé stroje náleží do určité oblasti podle mapování v konfiguraci serveru, lze ovlivnit i DNS záznamy.
- KDC
- (= Key Distribution Center), Kerberos server, zajišťuje autentizaci a vydávání lístů, rozděleno na AS (Authentication Server) a TGS (Ticket Granting Service).
- principal
- unikátní identifikace entity která vstupuje do protokolu, typicky uživatele, služby nebo stroje. Typicky ve formátu
primary/instance@REALM
, kde primary je typicky uživatelské jméno, nebo hodnota host
pro principal stroje (pro který je pak secondary
jeho hostname). Např. xstill@FI.MUNI.CZ
, host/proto11-alpha.ip4.pv090.fi.muni.cz@PROTO11.PV090.FI.MUNI.CZ
.
- lístek
- je informace umožňující ověření identity dané entity. Obsahuje v sobě symetrický klíč, který sdílí uživatel s příslušnou službou (buď TGS, nebo služba vůči které se uživatel autentizuje). Lístek je zašifrovaný buď klíčem TGS (v případě TGT), nebo klíčem dané služby.
- TGT
- (= Ticket-Granting Ticket) iniciální lístek, který umožňuje dané entitě získávat další lístky od KDC/TGS.
- stash soubor
- slouží k autentizaci KDC k sobě samému při jeho spuštění. Soubor obsahuje hlavní klíč daného KDC.
- single sign-on
- princip jednoho přihlášení, které je možné předávat mezi stroji. Např. po přihlášení heslem na
aisa.fi.muni.cz
(pomocí Kerbera) je možné se odtamtud přihlásit na nymfe105.fi.muni.cz
bez dalšího zadání hesla.
- keytab soubor
- je soubor s klíči pro entity (principals), které mají být na daném stroji použitelné bez zadání hesla. Systémový keytab v
/etc/krb5.keytab
slouží mimo jiné k ukládání host
principals, které danému stroji odpovídají; přístup k němu byl měl mít jen root
.
Komunikační protokol
- Iniciální přihlášení: uživatel se autentizuje vůči KDC, které mu vydá TGT (zašifrovaný klíčem TGS + časová známka) a zašle sdílený klíč, typicky při přihlášení uživatele.
- Pro komunikaci s další entitou/službou uživatel:
- odešle na KDC/TGS svůj TGT a identifikátor služby (principal) + autentizační informace (s časovou známkou) zašifrované sdíleným klíčem,
- TGS ověří TGT a autentizační informace a zjistí, zda má uživatel právo užívat danou službu a pokud ano, vydá mu lístek + klíč pro komunikaci s danou službou (lístek obsahuje klíč pro komunikaci se službou zašifrovaný klíčem, který sdílí služba s KDC),
- uživatel použije lístek a autentizační informace s časovou známkou k přihlášení se ke službě (služba extrahu komunikační klíč z lístku a jím dešifruje autentizační informace),
- při úspěšném ustavení spojení pošle služba uživateli zpět zašifrovanou časovou známku.
- Časové známky brání útokům spočívajícím v přehrávání starých zachycených komunikací.
Implementace
- MIT Kerberos 5
- je původní implementace, dostupná pod BSD licencí, vyvíjí the Kerberos Consortium.
- Heimdal
- je alternativní implementace, vzniklá původně kvůli exportním omezením šifrovacích technologií v USA. Snaží se být kompatibilní s MIT.
- GNU Shishi
- je GNU implementací Kerberos 5, pod GPLv3, poslední release v roce 2010.
- Další implementace
- jsou v Microsoft Windows a distribuci Javy od Sun/Oracle.
Zdroje ke kompatibilitě: MIT Kerberos – Interoperability, MIT vs. Heimdal – API rozdíly, Heimdal vs. Windows.
Replikace dat
- master/slave režim (s možností více slave KDC)
- master KDC má zapisovatelnou databázi, tu replikuje na slave KDC
- slave instance podporují přidělování lístků, ale ne změny v databázi
- je doporučeno mít všechny servery nastaveny tak, aby mohli fungovat v obou režimech (tj. slave server šlo povýšit na master)
Vazba na DNS
Jméno oblasti/realm a příslušné KDC mohou být mapovány buď v systémovém konfiguračním souboru (/etc/krb5.conf
), nebo pomocí DNS.
SRV záznamy v DNS ve tvaru: _kerberos._Proto.Realm TTL Class SRV Priority Weight Port Target
, kde _Proto
je _tcp
nebo _udp
(je třeba mít oba záznamy), Realm
je Kerberos realm a Target
je KDC. Např.:
_kerberos._udp.EXAMPLE.COM. IN SRV 0 0 88 kdc1.example.com.
_kerberos._udp.EXAMPLE.COM. IN SRV 1 0 88 kdc2.example.com.
_kerberos._tcp.EXAMPLE.COM. IN SRV 0 0 88 kdc1.example.com.
_kerberos._tcp.EXAMPLE.COM. IN SRV 1 0 88 kdc2.example.com.
Cross-realm důvěra
Důvěra jiným oblastem se řeší pomocí principal pro oblast, které chceme důvěřovat. Např. chce-li EXAMPLE.COM
využívat zdrojů z EXAMPLE.ORG
, přidají oba servery do databáze principal krbtgt/EXAMPLE.ORG@EXAMPLE.COM
.
Konfigurace Kerbera na Debianu
# apt install krb5-admin-server krb5-kdc
+ případně libpam-krb5
krb5-kdc.service
selže při instalanci, protože není vytvořená oblast (realm)
- konfigurace je v
/etc/krb5.conf
# krb5_newrealm
– vytvoření nové oblasti (master heslo)
- konfigurace viz ArchWiki (databáze je však vytvořena příkazem
krb5_newrealm
)
- problém s různými hostname: Pokud chceme aby např.
proto11.pv090.fi.muni.cz
akceptovalo ticket pro host/proto11-alpha.ip6.pv090.fi.muni.cz@PROTO11.PV090.FI.MUNI.CZ
je třeba nastavit v /etc/krb5.conf
sekci [libdefaults]
hodnotu ignore_acceptor_hostname = true
. To způsobí, že služby se budou moct autentizovat i s jiným hostname, pokud je tento v příslušné oblasti a zadaný v keytab souboru příslušného serveru.
ssh
: Všechna užívaná jména serveru musí mít příslušný host
principal a být zavedena v keytab
souboru.
Uživatelské utility
kadmin.local
- administrace databáze lokálního KDC
kadmin
- administrace KDC po síti
kdb5_util
- pro manipulaci s databází Kerbera, včetně vytváření, zálohování a obnovy databáze
kinit
- k „ručnímu“ získání TGT (např.
root
může získat TGT pro pv090 a pak se pomocí něj přihlásit přes ssh
)
kpasswd
- umožňuje příslušnému uživateli/principal změnit heslo
klist
- seznam aktivních lístků uživatele
kdestroy
- zahodí všechny aktivní lístky uživatele
Udržování přesného času v síti
Typicky se dnes používá protokol NTP (Network Time Protocol), který umožňuje synchronizaci času přes síť (typicky Internet). Mnoho klientů: ntpd, systemd-timesyncd, …
Dostupné protokoly
- NTP
- synchronizace času přes paketové sítě, schopný vyrovnat se s variabilitou latence na síti. Synchronizace až na úroveň desítek milisekund přes Internet. Typicky klient-sever, ale má i P2P variantu. Časové zdroje jsou rozděleny do vrstev (clock strata), které indikují vzdálenost od primárních zdrojů času (vrstva 0). NTP umožňuje postupnou změnu času. RFC 5905. Běží na UDP portu 123.
- SNTP
- zjednodušená verze NTP, která nevyžaduje ukládání stavu po delší dobu. Typicky používaný pro koncové klienty (tj. nepokytující časové informace dále). Kompatibilní s NTP.
- time
- zastaralý protokol pro synchronizaci časů v *nix prostředí. Provádí skokovou změnu času. Utilita
rdate
pro sychronizaci pomocí protokolu time. Synchronizace na úrovni celých sekund, problémy s přetoky (používá 32bit Unix čas – od 1. 1. 1970 00:00 UTC).
- PTP
- (Precision Time Protocol) umožňuje přesnější synchronizaci než NTP (méně než mikrosekundová přesnost). Používaný například pro synchronizaci finančních transakcí či vysílačů pro mobilní telefony.
Hardware pro přesný čas
Za primární zdroj přesného času lze považovat International Atomic Time (TAI), který využívá více než 400 atomových hodin po celém světě.
Kromě internetových zdrojů lze čas synchronizovat pomocí GPS, který využívá atomové hodiny v satelitech GPS a umožňuje synchronizaci až do řádu stovek nanosekund. GPS čas se od UTC liší díky přestupným sekundám.
NTP pool
pool.ntp.org
je seskupení serverů poskytujících NTP, obsahuje přes 4000 serverů po celém světě.
- vhodný výchozí NTP server
- servery
{0..3}.pool.ntp.org
představují brány ukazující na NTP server vybraný s ohledem na lokaci klienta
- jsou k dispozici i oblastní servery:
europe.pool.ntp.org
, cz.pool.ntp.org
, …
- při zajišťování synchronizace času pro síť je doporučeno nastavit si vlastní NTP server, který se synchronizuje proti
pool.ntp.org
a poskytuje čas dále
Konfigurace NTP – systemd-timesyncd
- jen klient, SNTP
- předinstalovaný na většině Linuxových distribucí, často i zapnutý
- stačí zapnout příslušnou službu:
systemctl start systemd-timesyncd.service
- konfigurace v
/etc/systemd/timesyncd.conf
- stav synchronizace lze zjistit pomocí
timedatectl timesync-status
- více viz ArchWiki
Konfigurace NPT – ntpd
- Debian:
# apt install ntp
- konfigurace v
/etc/ntp.conf
- stav synchronizace lze zjistit pomocí
ntpq -p
- více viz ArchWiki
Literatura
Kerberos
NTP