V průběhu posledních tří měsíců se bavím bezpečnostní a rizikovou analýzou v jedné bance v německu. A zrovna jsem musel zjistit přesně, jak funguje tzv. passphrase v SharePoint 2010 a jaké to má vlastně bezpečnostní parametry a jaká jsou s tím spojena rizika. Oni jsou navíc tak speciální, že mají regionální farmu, takže je to zajímá o to více.
Nikde na webu k tomu není moc detailů, tak je tu chci teď pěkně zdokumentovat.
SharePoint 2010 passphrase
SharePoint má svoji konfigurační databázi uloženou v SQL Serveru. Do konfigurační databáze přistupuje pod svým tzv. farm account, servisním účtem, pod kterým běží SharePoint Time Service a případně centrální administrace (Central Administration).
Ten SQL server může být vzdálený, SharePoint k němu přistupuje přes SQL protokol - tzn. buď statický port TCP 1433, nebo dynamický. Přístup je ověřován Kerberos autentizací, pokud je to dobře nastaveno (existují správně service principal name - SPN), nebo NTLM, pokud je to nastaveno špatně.
Komunikace může být šifrována SSL/TLS Server Authentication certifikátem, pokud takový na SQL serveru nainstalujete a správně nakonfigurujete (musí s ním být schopen pracovat servisní účet pod kterým běží ten SQL server).
SharePoint má ale v konfigurační databázi uložena hesla a loginy svých tzv. service managed accounts. Dokonce i heslo toho farm accountu je tam uloženo. Správce SQL server by tedy měl přístup k těmto heslům a to nechceme. Kdo ví, kdo to je, že?
Takže hesla všech managed accounts jsou v databázi nějak šifrována. Pro jednoduchost řekněme, že pomocí tzv. passphrase. A to je přesně to, co jsem musel vyzkoumat, protože nikde není nic moc detailně vysvětleno, jak to vlastně přesně funguje uvnitř.
Při vytváření konfigurační databáze musíte tuto passphrase zadat (buď New-SPConfigurationDatabase, nebo během SharePoint Products Configuration Wizard). Jako druhou věc musíte zadat login a heslo farm accountu.
Když si později chcete do farmy připojit (Connect-SPConfigurationDatabase) další SharePoint webový server (web front end, nebo web service application backend), musíte už zadat pouze tuto passphrase - dokonce už vůbec nepotřebujete znát heslo pro farm account. Heslo je schované v databázi a pomocí passphrase ho prostě vyndáte.
Pokud passphrase neznáte, můžete ji natvrdo vyresetovat pomocí Set-SPPassphrase. Jde o reset, takže nemusíte znát její původní hodnotu. Nemusíte dokonce znát ani heslo pro farm account. Požadavek na Set-SPPassphrase je pouze ten, že se to musí provést z nějakého existujícího člena farmy. Nemusí na něm dokonce ani běžet SharePoint Timer Service ani nic vlastně pořádně fungovat. A navíc ten cmdlet má ještě parametr -LocalServerOnly, který změní passphrase jen "nějak lokálně".
Není to divné? Tak se pojďme podívat, jak to vlastně všechno funguje.
Database encryption key a k němu farm passphrase
Citlivé obsahy SharePoint konfigurační databáze jsou ve skutečnosti šifrovány nějakým náhodným šifrovacím klíčem zvaným database encryption key. Tento klíč je rovnou v té databázi uložen a zašifrován pomocí passphrase farmy (farm passphrase). Database encryption key nelze změnit, alespoň mi není známo jak.
Pokud znáte farm passphrase a máte přístup do té databáze jako dbo, můžete si vyndat database encryption key a tím si přečíst všechny přihlašovací údaje. Včetně údajů a hesla pro farm account.
Z toho plyne, že:
- správce SQL serveru si přihlašovací údaje nepřečte jen tak. Musel by někde zjistit farm passphrase. Bezpečnost ale stojí na kvalitě farm passphrase, takže si nedávejte žádné jednoduché heslo.
- pokud přijdete o všechny SharePoint webové servery - totální kreš - databáze máte v pořádku a znáte farm passphrase, můžete si nainstalovat nějaký nový SharePoint web server a prostě si ho k farmě připojit. Nepotřebujete na to ani znát farm account.
- pokud vůbec zálohujete databáze :-), je obecně vhodné pamatovat si i farm passphrase.
Webové servery a jejich vlastní passphrase
Co se děje když připojujete nějaký SharePoint web server do farmy? Zadáte prostě farm passphrase. Server se připojí do konfigurační databáze a vyndá si database encryption key a pomocí něho si vyndá farm account. Díky němu může spustit SharePoint Timer Service. A ten už si v databázi může dělat co chce.
Aby ovšem tento farm account (potažmo SharePoint Timer Service) mohl pracovat s managed accounts, měnit jim hesla a přidávat další a konfigurovat podle toho služby, musí mít i nadále uložen alespoň ten database encryption key u sebe.
Potřebujeme mít také možnost změnit farm passphrase kdykoliv později. Například ji zapomenete, nebo ji prostě chcete změnit z bezpečnostních důvodů. Kdykoliv později znamená, že nevím kdy později. Také to znemaná, že nevíme, kolik ze stávajících členů farmy zrovna pojede.
Uvědomte si, že můžete mít více serverů ve farmě. Některé zrovna nemusí běžet, některé mají nějaké problémy. Je také klidně možné, že některé už neexistují, ale prozatím jste je neodebrali úplně korektně :-) A přitom potřebuju měnit farm passphrase pomocí Set-SPPassphrase.
Dále nechceme mít na místním serveru uložen ten database encryption key jen tak. Takže to funguje takto:
Do registrů, do klíče HKLM\Software\Microsoft\Share Tools\Web Server Extensions\14.0\Secure, se uloží database encryption key. Ale neuloží se tam jen tak, je zašifrován zase pomocí passphrase. Passphrase se tam musí uložit taky. Je chráněna pomocí technologie DPAPI - v režimu per-server. Zabezpečení toho registrového klíče umožňuje číst jeho obsah jen účtu farm account a skupině Administrators.
Příkaz Set-SPPassphrase má parametr -LocalServerOnly. Ve výchozím stavu je lokální registrová passphrase (local passphrase) stejná, jako ta prvně použitá farm passphrase. Pokud chcete, můžete si ji klidně změnit na každém web serveru zvlášť právě pomocí parametru -LocalServerOnly.
Z toho plyne pro každý SharePoint web server:
- farm account a kdokoliv ze skupiny místních Administrators, si může přečíst obsah registrového klíče HKLM\Software\Microsoft\Share Tools\Web Server Extensions\14.0\Secure. Tito si tedy z něho mohou vyndat local passphrase pomocí volání DPAPI Unprotect() - formát struktury je ale neznámý. Pomocí této local passphrase si mohou vyndat také database encryption key a mohou přistupovat do konfigurační database SharePointu.
- když znám database encryption key, mohu resetovat farm passphrase.
- žádný jiný účet nemá přístup do těchto registrů na local passphrase. Nemůže tedy použít DPAPI k dešifrování database encryption key. To je také jeden důvod, proč mají všechny SharePoint služby a aplikace běžet pod jiným účtem než farm account.
- Pokud někdo chce přidat další web server do farmy, musí znát farm passphrase. Ta se může lišit od local passphrase na všech web serverech.
- Local passphrase je umístěna v HKLM registrech, vůbec tedy nestojí na profilu uživatele farm account.
Co z toho plyne celkově za rizika
Pokud správce SQL serveru není současně členem místních Administrators na nějakém SharePoint web serveru, nedostane se k loginům ani heslům.
Dokud si pamatuji farm passphrase a mám zálohu konfiguračních databází, můžu vždy připojit nový web server do existující farmy - i kdyby žádné další už neběžely.
Pokud jsem členem místních Administrators na nějakém SharePoint web serveru, mám v ruce jak local passphrase, tak i database encryption key. Nemám možná ale přímý přístup k databázím.
Pokud jsem členem místních Administrators na nějakém SharePoint web serveru, a mám současně DBO přístup do konfigurační databáze, můžu vždy změnit za pomoci Set-SPPassphrase centrální farm passphrase. Pro tuto operaci nemusí běžet SharePoint Timer Service. Nemusím znát farm account a ten ani nemusí být schopen se přihlásit.
Pokud použiju Set-SPPassphrase a nějaké servery jsou offline (nebo něco obnovím později ze zálohy), změní se farm passphrase a také všechny local passphrase na všech živých serverech. Ostatní servery se starším local passphrase budou fungovat i nadále - mají database encryption key, který se nemění. Pokud bych na nich chtěl local passphrase později zaaktualizovat, stačí použít Set-SPPassphrase s parametrem -LocalServerOnly.
Zjednodušeně:
- passphrase odděluje SharePoint citlivá data od správce SQL serveru
- passphrase zamezuje "cizincům" aby si připojili svůj vlastní web server do existující farmy
- lokální Administrators na libovolném SharePoint web serveru mají přístup na local passphrase
- pokud znám local passphrase a jsem současně DBO v konfigurační databázi, můžu vyresetovat farm passphrase.
- local passphrase nestojí na profilu účtu farm account ani na jeho identitě
Lze oddělit místní Administrators od obsahu konfigurační databáze?
Ne. Proč?
Máme SharePoint web server, který funguje správně - tzn. jeho farm account pracuje a běží pod ním služba SharePoint Timer Service. Jsme členové jeho místní Administrators skupiny. Jsem zaručeně schopen resetovat farm passphrase? Ano
K tomu potřebuji local passphrase. Tu mám. Dál potřebuji DBO do konfigurační databáze. To má farm account. Mám heslo farm account účtu?
Ano. Dá se zjistit pomocí hackerského nástroje Cain & Abel ze služby SharePoint Timer Service. Nebo pomocí APPCMD LIST APPPOOL /text:* z nastavení IISka, pokud tu běží Central Administration webová sajtna.