Architektura systemu Kerberos w wersji MIT Athena
Główne składowe systemu
Schemat nazewnictwa
Autentyfikacja typu ( user-to-host )
Czynności administracyjne
Interakcja z innymy systemami Kerberos
Kerberos z praktycznego punktu widzenia
Autentyfikacja typu ( user-to-user )
Problemy otwarte
Wykorzystana literatura
Główne składowe systemu
- Biblioteka do tworzenia aplikacji ( API Kerberos )
Interfejs dla klienckiej i serwerowej części aplikacji,
zawiera wywołania systemowe dla tworzenia lub analizowania
zapytań autentyfikacji oraz dla tworzenia prywatnych
i bezpiecznych komunikatów
- Biblioteka do szyfrowania
Szyfrowanie opiera się na Data Encryption Standard ( DES ).
Stosowane metody : DES Cypher Block Chaining oraz,
DES propagating Cypher Block Chaining.
Moduł jest niezależną składową systemu i w każdej chwili może
zostać zamieniony.
- System zarządzania bazami danych
W głównej bazie są trzymane dane niezbędne dla autentyfikacji
poszczególnych elementów systemu :
identyfikator, klucz prywatny, termin ważności
oraz administracyjna informacja.
Dane ogólne o elemencie systemu są przechowywane
na masynie zdalnej ( Hesiod ), co zmniejsza nakład
związany z propagacją oraz pozwala udostępniać dane nie
mające krytycznego wpływu na działanie systemu w sposób
szybki ( możliwy brak szyfrowania ).
Serwery autentyfikacji i administracji korzystają
z tego modułu do przeprowadzania operacji na bazie danych.
- Serwer administracji ( ang. Kerberos
Database Managment KDBM )
Interfejs do operacji zapisu i odczytu
na bazie danych. Kliencka część może się
znajdować na dowolnej maszynie, część serwerowa
może znajdować się na maszynie Master
- Serwer autentyfikacji ( Kerberos )
Przeprowadza tylko i wyłącznie operacje odczytu
na bazie danych w celach autentyfikacji elementów systemu
i generowania kluczy sesji. Może działać jak na maszynie Master
tak i na Slave
- Oprogramowanie do propagowania bazy danych
wspomaga przesyłanie kopii danych z Master do Slave
- Programy użytkowników
Klienckie programy po stronie użytkownika - do zalogowania się,
do zmiany hasła, dodawanie/usuwanie użytkownika etc ( kpasswd, kinit, kadmin ... )
- Aplikacje
Aplikacje programistyczne które korzystają z usług Kerberos ( korzystają
z API Kerberosa )
Schemat nazewnictwa
W systemie Kerberos serwery usługowe oraz użytkownicy posiadają nazwę.
Postać nazwy w Kerberos 4 :
name.instance@realm
Postać nazwy w Kerberos 5 :
component/component/component@realm
W praktyce trzeci component nie jest używany.
Przyjęto kowencję nadawać składowej realm nazwę domeny z DNS zapisaną wielkimi literami.
Autentyfikacja typu ( user-to-host )
W wersji Kerberos 4 ( początkowo projektowany protokół ) jest
założenie, że usługi systemowe są udostępniane na serwerach bezpiecznych,
komunikacja z tymi serwerami odbywa się ze stacji roboczych
o wolnym dostępie oraz przez sieć o której bezpieczeństwie nie wolno nic zakładać.
Spowodowane jest to koniecznością pamiętania
klucza prywatnego danej usługi w pamięci serwera usługi.
Schemat komunikacji typu "user-to-host"
Na następnych rysunkach wygodne są następujące oznaczenia :
- c -> klient
- s -> serwer
- addr -> sieciowy adres klienta
- life -> czas ważności biletu
- Kerberos -> serwer autentyfikacji
- KDBM -> serwer administracji
- tgs, TGS ( and. Ticket Grating Service ) -> serwer
wydający kluczy sesji dla poczczególnych usług,
wymaga okazania TGT
(ang. Ticket-Granting-Ticket ) wydawanego
przez Kerberos
- Kx -> klucz prywatny x
- Kx,y -> klucz sesji dla x i y
- {abc}Kx -> abc zakodowane kluczem x
- Tx,y -> bilet x dla korzystania z y
- Ax -> poświadczenie dla x
Bilet i poświadczenie w systemie Kerberos
Główny cel biletu - bezpieczne dostarczanie danych
identyfikujących użytkownika do końcowego serwera
Główny cel poświadczenia - wyposażenie
serwera w informacje konieczne dla sprawdzenia czy bilet został wysłany
przez użytkownika wspomnianego w bilecie
Bilet może być wykorzystany WIELE RAZY.
Poświadczenie może być wykorzystane TYLKO RAZ.
Ciekawe rodzaje biletów :
- Ekspediowalne ( ang. forwardable ) - tylko dla TGT, przekazuje do TGS,
informację, że
może wysłać TGT z innym adresem na podstawie adresu w otrzymanym TGT.
- Wznawialne ( ang. renewable ) - pomocne dla aplikacji które powinny wykonywać
obliczenia w tle przez okres dłuższy niż typowy czas istnienia biletu.
Dość niebezpieczne jest używanie przez długi czas tego samego
klucza sesji. Użytkownik w celu wzowienia biletu przesyła go wraz
z autentyfikatorem do TGS, który sprawdza czy bilet jest aktualnie
ważny i może zostać wznowiony. W pozytywnym przypadku
znawianie biletu pociąga za sobą automatyczną zmianę
klucza sesji, reszta danych biletu pozostaje bez zmian .
- Zastępcze ( ang. proxy ) - stosowane w pierwszym rozwiązaniu
problemu delegowania autentyfikacji ( patrz dalej )
- Wykorzystywane w przyszłości (ang. postdatable ) - wydawane
przez TGS, ale można będzie z nich skorzystać dopiero w
przyszłości ( zastosowania : aplikacje uruchamiane
okresowo ) .
Problem delegowania autentyfikacji :
Klient ma dostęp do usług serwera N2 i chce żeby serwer N1 miał taki sam
dostęp do usług serwera N2 jak klient, nie patrząc na to w jakiej relacji
są serwer N1 i serwer N2.
Rozwiązanie 1 : klient pobiera bilet do
serwera N2 i podaje go serwerowi N1 - niewygodne powinien zawsze znać
nazwę serwera N2, co w większości aplikacji jest wyznaczane dynamicznie.
Bilety używane w tym przypadku mają ustawioną flagę proxy.
Rozwiązanie 2 : klient wysyła do serwera N1
swój TGT, który powinien być forwardable.
Różnica pomiędzy biletami proxy a forwardable
polega na niemożliwości delegowania biletu proxy
w przypadku gdy jest on TGT.
Bilety proxy są rzadziej stosowane w praktyce.
Schemat autentyfikacji przy pomocy Kerberos od strony wewnętrznej
Schemat autentyfikacji przy pomocy Kereros od strony zewnętrznej
- Żądanie biletu dla TGS
- Bilet dla TGS ( TGT )
- Żądanie biletu dla serwera
- Bilet dla serwera
- Żądanie obsługi zamówienia dla serwera
Czynności administracyjne
W implementacji zakłada się, że zmieniana może być zawartość tylko i
wyłącznie bazy na maszynie Master, ale autentyfikacja może
się odbywać jak i na Master tak i na Slave.
Schemat obsługi żądań autentyfikacji
Schemat obsługi żądań administracyjnych
Schemat obsługi żądania zmiany hasła lub dodawania/usunięcia użytkownika
- Żądanie biletu dla KDBM
- Pobranie biletu
- Żądanie kpasswd lub kadmin
- Ewentualna aktualizacja danych ( zależnie od autoryzacji )
- Zpisanie log'u ( następuje zawsze )
Uwaga : korzystanie z usługi KDBM odbywa się
bezpośrednio ( bez udziału TGS ). Użytkownik powinien wprowadzić hasło
jak w przypadku żądania biletu dla TGS. Spowodowane jest podnoszeniem stopnia bezpieczeństwa.
Schemat propagowania głównej bazy danych
Zalety :
- Wzrost wydajności : autentyfikacja możliwa gdy przynajmniej jedna z maszyn
posiadających kopię danych jest w aktywnym stanie
- Prawie całkowite usunięcie możliwości powstania wąskiego gardła systemu ( centralizacja )
Powoduje problem utrzymywania kopii danych na maszynach Slave w stanie spójnym ( zgodnym z Master ).
Problem jest rozwiązany - baza z Master jest w całości przesyłana przez każdą godzinę do Slave.
Algorytm propagowania :
- Program kprop na maszynie Master wylicza sumę kontrolną bazy
- Przesyła sumę kontolną zakodowaną kluczem Master'a, który
jest współdzielony przez Master i Slave, do programu
nasłuchowującego kpropd na maszynie Slave, po czym
przesyła dane z bazy ( każdy rekord w bazie jest zakodowany
kluczem Master'a )
- kpropd po otrzymaniu danych oblicza sumę kontrolną
i porównuje z otrzymaną. W przypadku zgodności wzbogaca
lokalną bazę o otrzymane dane
Kerberos z praktycznego punktu widzenia
Użytkownik
Gwarantowana prawie całkowita przezroczystość - użytkownik nie musi nic
wiedzieć o istnieniu Kerberos w systemie :
- logowanie - część zwykłego login
- zmiana hasła - część zwykłego passwd
- po wylogowaniu się użytkownika - wszystkie bilety są automatycznie kasowane
Co pogarsza przezroczystość :
- W przypadku trwania sesji dłużej niż czas istnienia TGT - użytkownik
powinien wprowadzić hasło
( uruchamiany jest proces kinit wysłania
żądania TGT do TGS
)
- Użytkownik uruchamiając klist może zobaczyć listę biletów używanych
w jego imieniu
Programista
Programista tworzący aplikację dla systemu z Kerberos może i powinien :
- Skorzystać z Biblioteki tworzenia aplikacji ( API Kerberos).
Pomocne są wywołania krb_mk_req, krb_mk_priv dla strony klienckiej, oraz krb_rd_req, krb_mk_priv dla strony serwera
- Skorzystać z biblioteki do szyfrowania w przypadku wysyłania
zakodowanych wiadomości
Administrator
Czynności związane z uruchamianiem systemu :
- Inicializacja bazy danych
- Rejestracja poszczegónych elementów systemu ( użytkowników, usług )
- Wystartowanie serwerów administrowania i autentyfikacji
- W przypadku istnienia maszyn Slave wystartowanie demonów propagowania danych
- Teraz administrator manipuluje systemem korzystając z programu kadmin
Jako przykład - proces dodawania usługi do systemu :
- Zarejestruj usługę w bazie przydzielając jej klucz prywatny ( losowo generowany )
- Zainstaluj dany klucz razem z pewnymi administracyjnymi danymi na
maszynie usługi ( uaktualniając plik /etc/srvtab, który
autentyfikuje serwer w podobny sposób jak hasło identyfikuje użytkownika )
Teraz widać czemu maszyny udostępniające usługi muszą być bezpieczne.
Administrator powinien pamiętać o tworzeniu kopii zapasowych
Uwaga : dodawanie systemu Kerberos do już
istniejącego systemu jest zadaniem nie banalnym ( problem tworzenia
kluczy dla elementów )
Interakcja z innymi systemami Kerberos
Możliwa jest interakcja pomiędy różnymi systemami używającymi Kerberosa.
Administratorzy powinni wymienić się kluczami dla szyfrowania biletów -
podzielić tajemnicę.
Schemat żądania usługi z innego systemu
- Żądanie biletu do usługi ze zdalnego królewstwa od lokalnego TGS
- Zwrot TGT do TGS ze zdalnego królewstwa zaszyfrowanego kluczem dzielonym
- Ządanie biletu do usługi ze zdalnego królewstwa od zdalnego TGS
- Uprawnienie "obcego" klienta do usługi lokalnej
- Wysłanie żądania do usługi zdalnej
- Otrzymanie odpowiedzi na zapytanie
Jak efektywnie połączyć N systemów ?
Istnieją dwie metody :
- Przydział każdej parze systemów klucza - niewygodne ( O(N2) kluczy )
- Tranzytywna autentyfikacja ( tylko w Kerberos 5 ) polega
na zdefiniowaniu ścieżek w systemie "idąc" którymi dochodzimy do
żądanego systemu ( O(N) kluczy ).
Jedną ze znanych metod tworzenia ścieżek jest grupowanie w chierarchię
Operacja "łączenia systemów jest bezpieczna" - kluczy do usługi z
danego systemu wydaje tylko i wyłącznie TGS z danego systemu.
W Kerberos 5 domyślnie ustawione jest ignorowanie żądań z innych systemów ( musisz
dodać ewentualnego klienta z zewnętrznego systemu do listy dostępu danego systemu ).
Autentyfikacja typu ( user-to-user )
User-to-user jest protokołem zaimplementowanym w Kerberos 5.
Pozwala on na udostępnianie w niebezpiecznej sieci bezpiecznych aplikacji na potencjalnie
podejrzałych maszynach. W user-to-host dla udostępnienia usługi
na maszynie zakładano że jest ona bezpieczna, bo przechowuje się w jej
pamięci trwałej przez dość długi okres klucz prywatny danej usługi.
Takie ograniczenie jest zbyt silne dla rzeczywistych potrzeb użytkowników.
Przepowadzone badania wykazały, że w praktyce o wiele więcej razy występuje konieczność komunikacji user-to-user, niż user-to-host.
Naprzykład użytkownik chce udostępnić usługi nfs lub ftp.
Protokół udostępnia możliwość wystartowania serwera na stacji roboczej o dostępie
swobodnym bez konieczności przechowywania klucza serwera w pamięci stacji.
Jako klucza serwera używa się klucza sesji klienta dla TGT ( Kc,tgt ),
którego czas istnienia jest mały.
W celu obejrzenia teoretycznego materiału na temat komunikacji user-to-user
odsyłam do pracy :
Don Davis, Ralph Swick, "Workstation Services and Kerberos Authentication at Project Athena"
ftp://athena-dist.mit.edu/pub/ATHENA/kerberos/doc/user2user.ps
Tutaj wyświetlę tylko najważniejze aspekty tej pracy.
Kliencka część aplikacji user-to-user jest całkowicie rozwiązana
przez protokół user-to-host.
Dla uniknięcia szeregu problemów i pzejrzystośi rozwišzania
zapostulowano następujące aksjomaty :
- Serwer Kerberos jest bezstanowy
- Nie wolno dodać często zmienającego się stanu do bazy danych Kerberos
- Kerberos może przeprowadzić tylko jedną tranzakcję w czasie danego połączenia
- Przeciążenie serwera Kerberos jest niedopuszczalne
- Nie istnieje kluczy o nieskończonym czasie istnienia
Oczywistym wydaje się wysłać przez TGS do użytkownika żądającego usługę komunikat
postaci
ale dla spełnienia aksjomatów trzeba trochę pomyśleć.
Przykład :
Jak dostarczyć do TGS dwa TGT wraz z ich poświadczeniami ( jak zdobyć
autentyfiktor usługi, pobranie samego TGT usługi jest bezpieczne ) ?
Autorzy protokołu user-to-user zrobili relaksację ograniczeń na komunikowanie
się z TGS. Mianowicie, pokazali redundancje autentyfikatora dla TGS.
Najpierw tworzono prostą analagię pomiędzy elementami uwierzytelniającymi
dla TGS a zwykłą usługą,
teraz - analogia z serwerem uwierzytelniającym Kerberos.
Użytkownik autentyfikuje sam siebie przez zastosowanie
klucza prywatnego do pakietu z TGT.
Główny cel systemu Kerberos - nie autentyfikacja elementów systemu, a dostarczanie
usług dla autentyfikacji jednych elementów systemu przez inne.