Kerberos část 1 – Microsoft Active Directory

Vítejte u prvního dílu seriálu, který se věnuje protokolu Kerberos se zaměřením na Single Sign-On (SSO) v prostředí Microsoft Active Directory.

Dnešní díl se přímo Kerberos protokolu nevěnuje, ale popíšeme si základní termíny Active Directory, které potřebujeme znát, a s kterými Kerberos autentizace souvisí (když ji používáme v doménovém prostředí). Nejprve stručně zmíníme AD komponenty, protože struktura souvisí s Kerberos Realm. Popíšeme si, jak klient hledá doménový řadič (což je zároveň Kerberos autentizační server). A docela podrobně se podíváme na přihlašovací jména uživatelských účtů (User Principal Name) a jména instancí služeb (Service Principal Name).

V dalších dílech si popíšeme obecně vlastnosti a funkce Kerberos protokolu. Podíváme se na to, co vlastně znamená SSO a jaké jsou možnosti. Rozebereme si jednotlivé komponenty a prvky, které Kerberos protokol používá. Popíšeme si proces Kerberos autentizace (tedy SSO) od zjednodušeného, přes podrobnější, až k detailnímu popisu. Podíváme se na fungování SSO autentizace mezi různými doménami. A zmíníme možnosti využití Kerberos SSO pro webové aplikace.

Jestli si někdo myslí, že této oblasti dobře rozumí, tak může dnešní díl přeskočit. Myslel jsem si to i já, ale když jsem studoval určité specifické detaily (například okolo UPN), tak jsem našel řadu nových informací.

Microsoft AD DS

Samozřejmě si tu nepopíšeme vše (a s určitou znalostí AD DS počítáme), nějaké další věci jsem popsal již před lety v článcích Adresářové služby a LDAP, Active Directory komponenty - domain, tree, forest, site a DNS (Domain Name System) zaměřeno na Microsoft. Odkaz na více materiálů se nachází na konci článku.

Active Directory Domain Services

Active Directory (AD) je adresářová služba od Microsoftu. Active Directory Domain Controller (DC či doménový řadič nebo pouze řadič) je server na kterém běží Active Directory Domain Services (AD DS, tento název se používá od Windows Server 2008, předtím se používal pouze Active Directory). AD DS poskytuje distribuovanou databázi, která v hierarchické struktuře obsahuje síťové objekty (jako je uživatel, počítač, skupina). Zajišťuje také autentizaci a autorizaci uživatelů a počítačů v síti. Využívá se LDAP protokol, rozšířený Kerberos verze 5 a DNS (Domain Name System).

Pro správu AD DS od Windows Server 2008 se využívá balíček Remote Server Administration Tools (RSAT), který je součástí serverových OS a na klientské jej můžeme doinstalovat.

Doména (Domain).

Doména (Domain) je logická skupina počítačů, které sdílí společnou AD databázi. Když vytvoříme doménu, tak se automaticky vytvoří strom a les. Nejjednodušší je mít vše pouze jednou. V praxi to ale vždy nelze, takže musím vytvářet složitější struktury. Doména se ve schématech znázorňuje jako trojúhelník, prvky uvnitř jsou členy dané domény.

Jméno Active Directory domény je běžně plné DNS (Domain Name System) jméno (příklad firma.local). Může obsahovat písmena, číslice, pomlčku a tečku (pouze pro oddělení komponent), maximální délka je 64 znaků. Každá doména má ale také (z důvodu kompatibility) pre-Windows 2000 jméno, které se označuje jako NetBIOS doménové jméno (příklad firma). To může být maximálně 15 znaků dlouhé a nesmí obsahovat tečku a řadu dalších znaků.

Zobrazit doménová jména si můžeme například pomocí nástroje Active Directory Domains and Trusts. V okně vidíme seznam domén a jejich DNS jména, pokud na doménu klikneme pravým tlačítkem a zvolíme Properties, tak uvidíme NetBIOS jméno a také stupeň lesa a domény.

Strom (Tree) a hierarchie domén

V rámci stromu (Tree) existuje hlavní kořenová doména (Tree Root Domain), která má svůj jmenný prostor (namespace, třeba firma.local). Pod kořenovou doménou můžeme vytvořit další domény, které se označují Child Domain, ty obsahují jmenný prostor nadřazené domény (Parent Domain) a svoje relativní jméno (tedy třeba test.firma.local). Každá doména má vlastní AD databázi, která se nachází na všech doménových řadičích dané domény. V rámci stromu může existovat pouze jedna kořenová doména, pokud chceme druhou (hlavně kvůli novému namespace), tak musíme vytvořit nový strom. Strom se ve schématech znázorňuje jako ovál či kruh.

Les (Forest), schéma a vztahy důvěry

Jeden nebo více stromů se nachází v lese (Forest). Les sdílí společné AD schéma (Active Directory Schema). Schéma definuje AD databázi, co v ní může být uloženo a jakou to má strukturu. Každá doména má vlastní databázi (obsah), ale stejnou strukturu (schéma). V rámci lesa existuje jedna kořenová doména (Forest Root Domain), jde o prvně vytvořenou doménu v daném lese. Ta obsahuje skupiny Enterprise Admins a Schema Admins. Les se ve schématech znázorňuje jako obdélník či kruh.

Když chceme zjistit, jaká doména je Forest Root, tak můžeme spustit nástroj Active Directory Domains and Trusts, který také použijeme pro správu vztahů důvěry. Zvolíme Action – Change forest a zde vidíme aktuální kořenovou doménu.

Všechny domény v rámci lesa mají automaticky vytvořenou důvěru (Trust). Jde o Two-way Transitive Trust, to znamená, že vztah důvěry je obousměrný a není omezen na dvě přímo propojené domény, ale může se rozšířit dále (pokud má druhá doména důvěru s další doménou, tak této třetí doméně důvěřuje i ta první). Vytváří se důvěra mezi kořenovými doménami stromů v rámci lesa, ta se označuje Tree-Root Trust. A mezi nadřízenými doménami v rámci stromu, to je Parent-Child Trust. Ručně můžeme vytvořit důvěru mezi různými lesy (navazuje se mezi Forest Root Domain), to je Forest Trust, a dále Shortcut Trust, Realm Trust a External Trust.

Pro správu schématu slouží nástroj Active Directory Schema. Ten se standardně nenachází mezi Administrative Tools (ani když jsme nainstalovali RSAT, který potřebujeme), ale je třeba zaregistrovat knihovnu regsvr32 schmmgmt.dll. Potom můžeme použít mmc konzoli a přidat Snap-in Active Directory Schema (nejlépe následně uložit).

Global Catalog

V rámci lesa je důležitá služba Global Catalog (GC). Ta obsahuje index pro všechny objekty v rámci lesa (jde o částečnou kopii adresářových oblastí pouze pro čtení), ke každému má pouze základní informace. V každé doméně musí být alespoň jeden GC server (a ten je zároveň DC). Doménový řadič má údaje pouze o objektech, které patří do jeho domény. Pokud chceme přistoupit k prvku z jiné domény, tak se právě využije Global Catalog, který nám poskytne informace, na jakém doménovém řadiči se tento objekt nachází.

Pro nastavení globálního katalogu se používá nástroj Active Directory Sites and Services, kde se proklikáme přes odpovídající Site na hledaný DC a pod ním klikneme pravým tlačítkem na NTDS Settings a zvolíme Properties.

Schéma doménových vazeb

Následující obrázek jednoduše zobrazuje výše popsané. Je zde prostředí s jedním lesem, dvěma stromy a celkem pěti doménami. První byl instalován řadič DCfirma1, čímž vznikla doména firma.local (a strom i les) a stala se kořenovou pro strom i celý les. K této doméně byla přidána podřazená doména pr.firma.local. Byl také vytvořen druhý les, který má kořenovou doménu firma.test. V tomto lese jsou dvě podřazené domény.

Automaticky se vytvořily vztahy důvěry, takže z domény pr.firma.local můžeme komunikovat s objekty ve vyvoj.firma.test (musí to být samozřejmě zařízeno síťově, zde řešíme logickou část). Komunikace postupuje po vztazích důvěry, nejprve na kořenovou doménu stromu firma.local, přes kořenový vztah lesa na firma.test až na vyvoj.firma.test.

Pozn.: Ve schématech je pro každou doménu znázorněn pouze jeden doménový řadič. V praxi bývají většinou minimálně dva.

1-01.gif

Nalezení doménového řadiče potažmo KDC

Když se uživatel přihlašuje v rámci domény, tak musí nalézt vhodný doménový řadič (DC). V případě Kerberos autentizace kontaktuje službu Authentication Service (AS) na Key Distribution Center (KDC), tato služba běží na každém DC.

Řadič se hledá pomocí DNS SRV záznamu (případně NetBIOS) pro danou doménu. Obecně jde o záznam _ldap._tcp.DnsDomainName (třeba _ldap._tcp.firma.local), ale Microsoft používá speciální záznamy, aby hledal pouze Windows LDAP servery, _ldap._tcp.dc._msdcs.DnsDomainName (třeba _ldap._tcp.dc._msdcs.firma.local) Klient získá seznam všech dostupných řadičů a odešle na ně LDAP dotaz, oni odpoví základními informacemi. Klient použije první DC, který odpověděl a pomocí své IP adresy a subnetu zjistí, do jaké patří Site. Pomocí DNS SRV záznamu _ldap._tcp.SiteName._sites.dc._msdcs.DnsDomainName (třeba _ldap._tcp.Praha._sites.dc._msdcs.firma.local) zjistí seznam všech DC v dané Site. Na všechny odešle LDAP dotaz, první který odpoví, použije pro autentizaci. Výsledek je, že se upřednostňují řadiče ve stejné Site jako klient, pokud jich je více, tak se volí pomocí Round Robin.

Pro některé situace je třeba nalézt Global Catalog (GC), to se provádí obdobně pomocí záznamu _ldap._tcp.gc._msdcs.DnsForestName (třeba _ldap._tcp.gc._msdcs.firma.local). Existují i další záznamy pro GC. Identicky existuje několik záznamů pro Kerberos KDC, některé obecné a jiné speciálně pro Microsoft servery. Pro MS je hlavní _kerberos._tcp.dc._msdcs.DnsDomainName (třeba _kerberos._tcp.dc._msdcs.firma.local).
Pozn.: Všechny tyto SRV záznamy si registruje NetLogon služba na DC při svém startu.

Uživatelské účty

Uživatelský účet je objekt v Active Directory a jedná se o Security Principal, takže umožňuje autentizaci a autorizaci. Pro správu účtů můžeme použít Active Directory Users and Computers (ADUC). Kerberos slouží k autentizaci uživatelů, takže je důležité jaké uživatelské jméno z AD používá.

Každý objekt v AD má několik různých jmen (Naming Attributes – možností jak na objekt odkazovat či jej identifikovat). Pro provázání se používají ID, takže ostatní jména můžeme měnit, aniž by se ovlivnili různé vazby. Možné formy jména objektu, spolu s těmi, které jsou speciálně pro uživatelský účet:

  • Relative Distinguished Name (RDN) – relativní LDAP jméno v rámci kontejneru (Organizational Unit), u uživatelů jde o Common Name (CN), atribut cn, příklad bouska
  • Distinguished Name (DN) – globální unikátní LDAP jméno, obsahuje RDN a umístění objektu v rámci AD hierarchie, atribut distinguishedName, příklad CN=bouska,CN=Users,DC=firma,DC=local
  • Canonical Name – obdoba DN v jiné notaci, jde o konstruovaný atribut (vytváří se při dotazu) canonicalName, příklad firma.local/Users/bouska
  • Name – je stejné jako Common Name (CN), atribut name
  • Security Identifier (SID) – unikátní identifikátor uživatele, používá se pro Kerberos a zařazování do skupin, atribut objectSid
  • Globally Unique Identifier (GUID) – unikátní identifikátor objektu, atribut objectGUID

Active Directory používá v DN názvu tři klíčová slova dle LDAP normy, jde o CN - Common Name, OU - Organizational Unit a DC - Domain Component. Oproti tomu Canonical Name využívá DNS formát.

Uživatelský účet má dva možné typy přihlašovacího jména (Logon Name), jsou to zároveň také Naming Attributes:

sAMAccountName - Security Accounts Manager (SAM) Account Name

  • označuje se také jako Pre-Windows 2000 Name
  • používá se zápis Domain\sAMAccountName, který se označuje jako NetBIOS Logon Name
  • maximální délka je 20 znaků
  • je unikátní v rámci domény a povinný
  • ukládá se do atributu sAMAccountName

User Principal Name (UPN)

  • označuje se jako Internet-style login name a je založen na RFC 822
  • skládá se ze dvou částí, UPN předpony (UPN prefix) - uživatelské přihlašovací jméno (User Logon Name) a UPN přípony (UPN suffix) – DNS doménové jméno, spojených pomocí znaku @, příklad logon.name@firma.local
  • maximální délka je 64 znaků
  • je unikátní v rámci lesa a nepovinný
  • ukládá se do atributu userPrincipalName
1-02.gif

User Principal Name (UPN)

Protože věci okolo UPN nejsou úplně jednoduché, tak se na ně podíváme podrobněji.

Microsoft začal UPN používat pro doménové uživatele v době Windows 2000. Mělo se jednat o primární přihlašovací jméno, které by měl uživatel používat. Jeho forma je kratší než Distinguished Name a MS představa byla, že bude stejné jako emailová adresa (což v praxi může zjednodušit práci útočníkovi, který nemusí hádat jméno, ale pouze heslo), takže bude pro uživatele jednoduché pro pamatování. Oproti DN také není závislé na přesunu do jiného kontejneru ani přejmenování domény (přípona nemusí odpovídat doméně). Přesto bych řekl, že i v kombinaci Windows Server 2012 a Windows 8 se hojně využívá NetBIOS Logon Name.

Jako UPN přípona se defaultně nabízí DNS jméno aktuální a kořenové domény, ale můžeme přidat alternativní doménové jméno (v podstatě libovolný řetězec v DNS formátu), které vytvoří administrátor v rámci lesa. Správa se provádí pomocí Active Directory Domains and Trusts, kde klikneme pravým tlačítkem na stejně pojmenovanou položku a zvolíme Properties.

V souvislosti se sAMAccountName Microsoft doporučuje používat začátek UPN shodný. Ale protože je zde omezení na 20 znaků, tak v řadě případů se třeba v UPN používá jméno a příjmení, ale v sAMAccountName první písmeno jména a příjmení.

Microsoft v některých materiálech uvádí, že uživatelský účet má vždy sAMAccountName i User Principal Name. Jiné potvrzují to, co můžeme ověřit v praxi, že povinný je pouze atribut sAMAccountName a nikoliv userPrincipalName. Přesto je tu zajímavá informace, kterou jsem nalezl pouze v neoficiálních materiálech. A to, že UPN existuje vždy, i když není atribut userPrincipalName vyplněn. Někde mluví o defaultním UPN, někde o implicitním UPN, ale ve výsledku je to stejné (a možná ani nejde o UPN, ale prostě o jiný zápis sAMAccountName). Ať máme nebo nemáme vyplněné UPN, tak můžeme použít username@DnsDomainName, kde username je sAMAccountName a DnsDomainName je DNS jméno domény, kde se účet nachází. Pokud atribut userPrincipalName vyplníme, tak tím definujeme další explicitní UPN, kde můžeme použít libovolné uživatelské jméno a příponu (tu musíme zaregistrovat v rámci lesa).

Co je uživatelské jméno je hodně důležité pro Kerberos autentizaci. Kerberos užívá termín Client Name (Principal Name) a Realm, často narazíme i na použití User Principal Name. V AD doméně je Realm rovno DNS doméně a praktickými pokusy jsem ověřil, že Client Name je rovno sAMAccountName. Ve výsledku to odpovídá implicitnímu UPN.

Abych výše uvedené ověřil v praxi, tak jsem provedl následující testy. V doméně s DNS jménem firma1.local a NetBIOS jménem firma1 jsem vytvořil UPN příponu pokus a uživatele s následujícími jmény:

distinguishedName     CN=uzivatelsdlouhymjmenem,CN=Users,DC=firma1,DC=local sAMAccountName     uzivatelsdlouhymjmen 
cn                             uzivatelsdlouhymjmenem 
name                        uzivatelsdlouhymjmenem 
userPrincipalName     uzivatelsdlouhymjmenem@pokus

Pak jsem se zkoušel přihlásit. Následující jména prošla:

  • FIRMA1\uzivatelsdlouhymjmen - NetBIOS logon name
  • uzivatelsdlouhymjmenem@pokus – zadané UPN
  • uzivatelsdlouhymjmen@firma1.local – implicitní UPN
  • firma1.local\uzivatelsdlouhymjmen – použití DNS jména domény v NetBIOS přihlášení

Přihlášení se nepodařilo:

  • FIRMA1\uzivatelsdlouhymjmenem
  • uzivatelsdlouhymjmenem@firma1.local
  • firma1.local\uzivatelsdlouhymjmenem

V popisu u MS jsem se o přihlašování dočetl následující. Když použijeme pro přihlášení sAMAccountName, tak zároveň určujeme doménu, v které se účet nachází (případně se použije aktuální). Při použití UPN není jasná doména (zadáváme pouze příponu, která nemusí odpovídat doméně), takže se nejprve hledá v aktuální doméně, pokud se UPN nenalezne, tak se použije globální katalog a hledá se doména, kde se účet nachází.

Při pokusech s různým přihlášením jsem také zachytával komunikaci. Aby bylo vše zajímavější, tak jsem se přihlašoval z jiné důvěryhodné domény (šlo o firma2.local). Když se klient snaží přihlásit, tedy získat TGT, tak v žádosti posílá přihlašovací údaje, které jsme zadali (viz. výše uvedené příklady). Pokud úspěšně získáme tiket, tak je v něm vždy DNS doména a uživatelské jméno sAMAccountName.

Pokud zadáme tvar doména\jméno, tak se hledá jméno (porovnává se s atributem sAMAccountName) v rámci domény doména (jedno jestli jde o NetBIOS nebo DNS). Tedy v KRG-AS-REQ paketu se použije Client Name = jméno, Realm = doména.

Pokud zadáme jméno@doména (tedy UPN), tak se nejprve hledá v lokální doméně, použije se Client Name = jméno@doména (porovnává se s atributem userPrincipalName), Realm = DNS jméno aktuální domény. Pokud se nenalezne, tak DC hledá pomocí globálního katalogu, jestli UPN existuje v jiné doméně nebo přípona odpovídá jiné doméně. Pokud ano, tak vrátí odkaz na doménu. Klient provede nový dotaz s jiným Realm a zaslaný na DC z odkazu.

Informace o uživateli na stanici

Na stanici můžeme použít určité řádkové příkazy, abychom získali informace o uživateli. První příkaz je dotaz na libovolného uživatele v doméně:

C:\>net user bouska /domain 
The request will be processed at a domain controller for domain firma.local. 

User name                           bouska 
Full Name                            Bouška Petr 
Comment                             Ing. Petr Bouška 
User's comment 
Country/region code              (null) 
Account active                      Yes 
Account expires                    Never  
Password last set                 1.3.2014 14:54:14 
Password expires                  Never 
Password changeable            1.3.2014 14:54:14 
Password required                 Yes 
User may change password    Yes  
Workstations allowed              All 
Logon script 
User profile 
Home directory 
Last logon                             19.5.2014 16:24:41  
Logon hours allowed               All  
Local Group Memberships 
Global Group memberships    *G Jabber IM *Domain Users 

The command completed successfully.

Druhá možnost je řada různých parametrů známého příkazu whoami, který zobrazí aktuálně přihlášeného uživatele.

C:\>whoami /upn 
bouska@firma.local 
C:\>whoami /fqdn 
CN=Bouška Petr,OU=IS,OU=Firma,DC=firma,DC=local 
C:\>whoami /logonid 
S-1-5-5-0-1835268 
C:\>whoami /user /fo list 
USER INFORMATION 
---------------- 
User Name: ok\bouska 
SID: S-1-5-21-2200232112-3866456066-1594429224-1223

Hodně informací se můžeme dozvědět i z jednoduchého výpisu systémových proměnných. Je zde vidět jméno počítače, autentizačního severu (DC), domény (NetBIOS i DNS) či uživatele. Ukázkový kousek výpisu:

C:\>set 
COMPUTERNAME=BOUSKAP 
LOGONSERVER=\\DC 
USERDNSDOMAIN=FIRMA.LOCAL 
USERDOMAIN=FIRMA 
USERNAME=bouska 
USERPROFILE=C:\Users\bouska 
windir=C:\WINDOWS

Service Principal Name (SPN)

Service Principal Name (SPN) se využívají v Active Directory, kde jsou uloženy v atributu servicePrincipalName u účtu. Jde o jeden ze základních prvků fungování Kerberos autentizace, spolu se službou DNS. SPN je unikátní identifikátor služby běžící na serveru. Jinak řečeno, je to jméno, pomocí kterého klient jednoznačně identifikuje instanci služby v rámci lesa. Každá služba, kde chceme využít Kerberos autentizaci, musí mít SPN registrované na účtu, který používá k přihlášení. Jedna služba může mít více rozdílných SPN, stejně tak k jednomu účtu může být přiřazeno více SPN.

SPN syntaxe je obecně ServiceClass/Host:Port/ServiceName, ale nejčastěji jde pouze o ServiceClass/Host. První část je název, který identifikuje obecně třídu služby, příkladem je ldap, GC, HOST, DNS, HTTP, TERMSRV, MSSQLSvc. Pro webové servery, ať jde o protokol HTTP nebo HTTPS, se používá HTTP. Druhá část je jméno počítače, kde služba běží. Většinou se používá FQDN (Fully Qualified Domain Name), ale pokud ke službě přistupujeme přes NetBIOS jméno, tak musíme použít to. Stejně tak v některých případech potřebujeme přidat DNS alias. Naštěstí SPN můžeme registrovat více. Příkladem SPN pro webový server je HTTP/www.firma.local.

Ve Windows (od Windows 7 / Server 2008) máme k dispozici nástroj pro příkazový řádek setspn, který slouží k prohlížení, nastavování a mazání SPN v Active Directory. Pro určité operace potřebujeme patřičné oprávnění. Můžeme tak ověřit existenci určitého SPN, či vyhledat všechna SPN pro danou službu či server. Několik příkladů hledání pomocí setspn:

setspn -Q HTTP/server.firma.local
setspn -Q HTTP/*
setspn -Q */server.firma.local
setspn -Q */*

Pokud chceme hledat v rámci celého lesa, tak musíme přidat přepínač F.

setspn –F -Q HTTP/server.firma.local

Další příklad ukazuje registraci nového SPN pro webový server k účtu webserver.

setspn –S HTTP/www.firma.local firma\webserver

Odkazy

Active Directory

Uživatelské účty

Nalezení DC

Service Principal Name

Autor: Petr Bouška

Články ze série Microsoft TechNet nevytváří redakce Živě.cz, ale partneři programu Microsoft TechNet. Jsou publikovány v rámci mediálního partnerství Živě.cz a společnosti Microsoft.

Váš názor Další článek: Slavný sovětský Tetris dnes slaví 30. narozeniny

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,