WebToDate/Referenční/Bezpečnost: Porovnání verzí

Z WebToDate
Skočit na navigaciSkočit na vyhledávání
Bajkvl (diskuse | příspěvky)
Založena nová stránka: Category:WebToDate 4.1 Referenční Category:Referenční == Autentifikace == Publikační systém umožňuje v konfiguračním souboru nastavit jeden ze tří způ…
 
 
(Není zobrazeno 8 mezilehlých verzí od 2 dalších uživatelů.)
Řádek 1: Řádek 1:
[[Category:WebToDate 4.1 Referenční]]
[[Category:WebToDate Referenční]]
[[Category:Referenční]]
[[Category:Referenční]]
== Autentifikace ==
== Autentifikace ==
Publikační systém umožňuje v konfiguračním souboru nastavit jeden ze tří způsobů přihlašování uživatelů (a způsob autentifikace) do redakční části systému:
=== Standardní způsob autentifikace ===
Standardní způsob autentifikace uživatelů do redakční části systému je autentifikace formulářem. To znamená, že na URL (daném zejména konfigurační konstantou ADMINPATH) se nachází přihlašovací formulář, kde se zadává jméno a heslo.


* Autentifikace formulářem, hesla se ukládají do databáze v textové podobě
Seznam uživatelů v tomto případě spravuje administrátor WebToDate přes [[../Uživatelé a přístupová práva|standardní funkce aplikace]].
* Autentifikace formulářem, hesla se ukládají do databáze zakódované pomocí MD5
 
* Ukládání hesel ve formátu MD5 se zapíná v konfiguračním souboru global.php pomocí konstanty 'USEMD5PASSWORDS':
Všechna nastavení uživatele jsou uložena v databázi WebToDate. Pro ukládání hesel existuje konfigurační konstanta USEMD5PASSWORDS:


<code>
<code>
Řádek 12: Řádek 13:
</code>
</code>


* http autentifikace
Nastavení na hodnotu ''true'' znamená, že se ukládají pouze hashe hesel pomocí algoritmu MD5, nastavení false znamená ukládání hesel jako čistý text (z bezpečnostních důvodů rozhodně není pro ostrý provoz doporučeno).
 
=== Nastavení síly hesla ===
V případě standardního způsobu autentifikace se při vytváření uživatelů i změně jejich údajů kontroluje délka uživatelského jména a hesla. Minimální délka těchto údajů se nastavuje pomocí konfigurační konstanty MIN_LOGIN_LENGTH, tedy např.:
 
<code>
<nowiki>define( 'MIN_LOGIN_LENGTH', 6 );</nowiki>
</code>
 
Kromě toho je k dispozici i možnost definovat pravidla pro silnější hesla. V konfiguračním souboru existují konstanty, do kterých lze zadat regulární výraz, který musí heslo resp. už. jméno splnit, aby byl formulář pro definici uživatele nebo změnu jeho údajů uložen. V případě, že údaj vyhovuje zadanému výrazu, je formulář uložen, v opačném případě se zobrazí chybové hlášení definované v další konstantě. Regulární výrazy se zadávají v syntaxi PHP funkce [http://cz.php.net/manual/en/function.preg-match.php preg_match()]. Konstanty definující toto chování jsou:
 
* LOGIN_VALIDATION - regulární výraz pro kontrolu uživatelského jména
* LOGIN_VALIDATION_FAILED - chybové hlášení zobrazované v případě, že uživatelské jméno neodpovídá regulárnímu výrazu
* PASSWORD_VALIDATION - regulární výraz pro kontrolu hesla
* PASSWORD_VALIDATION_FAILED - chybové hlášení zobrazované v případě, že heslo neodpovídá regulárnímu výrazu
 
Pokud tedy chceme např. hesla s minimálně 8 znaky, alespoň jedním velkým písmenem a alespoň jednou číslicí, lze definovat tento požadavek např. následovně:
 
<code>
<nowiki>define('PASSWORD_VALIDATION', '/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(.){8,}$/' );</nowiki>
<nowiki>define('PASSWORD_VALIDATION_FAILED', 'Heslo musí mít min. 8 znaků a musí obsahovat alespoň jedno velké a jednu číslici.' );</nowiki>
</code>
 
Při ukládání formuláře uživatele se nejprve kontroluje délka jména a hesla, pak tvary těchto údajů pomocí LOGIN_VALIDATION resp. PASSWORD_VALIDATION. Nejsou-li tyto konstanty vyplněny, tento typ kontroly se neprovádí.
 
=== Zásuvné moduly pro autentizaci ===
Druhou možností je využít tzv. zásuvné moduly pro autentizaci. Jedná se o kódy, které jsou navázány na proces přihlašování a které lze s dodržením zásad pro tvorbu těchto kódů vytvářet.
 
Využití zásuvného modulu pro autentizaci se zapíná pomocí konfigurační konstanty
 
<code>
<nowiki>define('INTEGAUTHENT', true);</nowiki>
</code>
 
Tato konstanta vyřazuje standardní proces přihlašování a nastavuje volání zásuvného autentizačního modulu. Kde je vlastní kód tohoto modulu definuje konstanta AUTH_MODULE:


Třetí možnost znamená, že v databázi se hesla neukládají, vlastní autentifikaci provádí operační systém nebo web server (např. web server Apache pomocí souboru ''.htaccess''). Ve verzi pro Windows je navíc implementována možnost vyhledání uživatele podle loginu v NT doméně/Active Directory – viz následující obrázek.
<code>
<nowiki>define( 'AUTH_MODULE', 'auth/_http_basic.php');</nowiki>
</code>


[[Image:referencniprirucka-bezpecnost-img176.png|center]]
Konstanta obsahuje cestu k autentizačnímu modulu relativní vůči WebToDate adresáři ''classes''.


Tato volba je vhodná zejména pro použití WebToDate na správu intranetového serveru.
Je-li tedy toto zapnuto, autentizační modul musí zjistit přihlašovací údaje a vrací je zpět do WebToDate. Konfigurační konstanta AUTH_AUTO_ADD_NEW_USER v tom případě určuje, zda úspěšně autentizované uživatele pouze vyhledávat v seznamu uživatelů WebToDate nebo automaticky přidat do seznamu uživatelů.


Http autentifikace se zapíná v&nbsp;konfiguračním souboru pomocí konstanty
<code>
<nowiki>define('AUTH_AUTO_ADD_NEW_USER', true);</nowiki>
</code>
 
Pokud je automatické přidávání zapnuto, použijí se údaje vrácené autentizační funkcí k tomu, aby se v případě, že uživatel není v seznamu uživvatelů nalezen, založil nový účet s využitím údajů vrácených autentizačním modulem (uživatelské jméno, jméno a příjmení, e-mail apod.). Je-li nalezen existující uživatel, nic se automaticky v seznamu uživatelů WebToDate nemění a využije se jen uživatelské jméno k přihlášení.
 
Pokud je automaticky přidán nový uživatel, odesílá se volitelně e-mail uživatelům, kteří jsou členové týmu ''Administrátoři'' informující o tom, že byl přidán nový uživatel. Odesílání těchto e-mailů ovlivňuje nastavení


<code>
<code>
  <nowiki> define('INTEGAUTHENT', true);</nowiki>
  <nowiki>define('AUTH_AUTO_ADD_SEND_MAIL', true);</nowiki>
</code>
</code>
V distribuci WebToDate je dodáván výchozí autentizační modul ''_http_basic.php'', který je použitelný v případě, že vlastní autentizaci provádí např. operační systém nebo web server (např. web server Apache pomocí souboru ''.htaccess'', na MS Windows Active Directory). Tato volba je vhodná zejména pro použití WebToDate na správu intranetového serveru.
Další autentizační moduly (např. pro autentizaci vůči LDAP, zvolenému Identity Management serveru apod.) mohou být vytvořeny.


== Interní bezpečnostní funkce ==
== Interní bezpečnostní funkce ==
Řádek 38: Řádek 85:
Jediná možnost je zaznamenávat IP adresy, ze kterých jdou pokusy o přihlášení, a pokud v daném časovém intervalu je dosaženo x pokusů o přihlášení, další požadavky z této adresy ignorovat.
Jediná možnost je zaznamenávat IP adresy, ze kterých jdou pokusy o přihlášení, a pokud v daném časovém intervalu je dosaženo x pokusů o přihlášení, další požadavky z této adresy ignorovat.


V globálních předvolbách v&nbsp;souboru ''global.php '' jsou tři konstanty:
V globálních předvolbách v&nbsp;souboru ''[[../Konfigurace WebToDate#Globální konfigurace WebToDate|global.php]]'' jsou tři konstanty:


* MAX_LOGIN_ATTEMPTS  - počet možných pokusů (výchozí hodnota 5)
* MAX_LOGIN_ATTEMPTS  - počet možných pokusů (výchozí hodnota 5)
* MIN_LOGIN_LENGTH  - časový interval v sekundách, ve kterém se pokusy hledají (výchozí hodnota 120)
* CHECK_LOGIN_INTERVAL - časový interval v sekundách, ve kterém se pokusy hledají (výchozí hodnota 120)
* CHECK_LOGIN_INTERVAL - doba v sekundách po kterou je IP adresa držena v seznamu nežádoucích adres (výchozí hodnota 1800)
* BLACKLIST_EXPIRATION - doba v sekundách po kterou je IP adresa držena v seznamu nežádoucích adres (výchozí hodnota 1800)


Výpis pokusů o přihlášení můžete zobrazit pomocí funkce [ Audit přihlášení].
Výpis pokusů o přihlášení můžete zobrazit pomocí funkce [[../Protokoly a audit přihlášení#Audit přihlášení|Audit přihlášení]].


== Interní kontroly ==
== Interní kontroly ==
Řádek 86: Řádek 133:
Po přechodu do ostrého provozu zvolit vhodnou úroveň chybových hlášení v&nbsp;PHP skriptech (v konfiguračním souboru PHP i v&nbsp;konfiguračním souboru WebToDate), která bude zabraňovat výpisu nežádoucích informací v&nbsp;případě chybových stavů (např. fyzické cesty k&nbsp;adresářům apod.).
Po přechodu do ostrého provozu zvolit vhodnou úroveň chybových hlášení v&nbsp;PHP skriptech (v konfiguračním souboru PHP i v&nbsp;konfiguračním souboru WebToDate), která bude zabraňovat výpisu nežádoucích informací v&nbsp;případě chybových stavů (např. fyzické cesty k&nbsp;adresářům apod.).


Na úrovni konfigurace WebToDate pak v&nbsp;konfiguračním souboru ''global.php'' nastavit dle dokumentace automatickou správu blacklistu přihlašování dle IP adres, což je funkce bránící slovníkovým útokům na přihlašovací stránku (viz [ Interní bezpečnostní funkce]).
Na úrovni konfigurace WebToDate pak v&nbsp;konfiguračním souboru ''[[../Konfigurace WebToDate#Globální konfigurace WebToDate|global.php]]'' nastavit dle dokumentace automatickou správu blacklistu přihlašování dle IP adres, což je funkce bránící slovníkovým útokům na přihlašovací stránku (viz [[../Bezpečnost#Interní bezpečnostní funkce|Interní bezpečnostní funkce]]).

Aktuální verze z 4. 7. 2011, 14:18

Autentifikace

Standardní způsob autentifikace

Standardní způsob autentifikace uživatelů do redakční části systému je autentifikace formulářem. To znamená, že na URL (daném zejména konfigurační konstantou ADMINPATH) se nachází přihlašovací formulář, kde se zadává jméno a heslo.

Seznam uživatelů v tomto případě spravuje administrátor WebToDate přes standardní funkce aplikace.

Všechna nastavení uživatele jsou uložena v databázi WebToDate. Pro ukládání hesel existuje konfigurační konstanta USEMD5PASSWORDS:

define( 'USEMD5PASSWORDS', true );

Nastavení na hodnotu true znamená, že se ukládají pouze hashe hesel pomocí algoritmu MD5, nastavení false znamená ukládání hesel jako čistý text (z bezpečnostních důvodů rozhodně není pro ostrý provoz doporučeno).

Nastavení síly hesla

V případě standardního způsobu autentifikace se při vytváření uživatelů i změně jejich údajů kontroluje délka uživatelského jména a hesla. Minimální délka těchto údajů se nastavuje pomocí konfigurační konstanty MIN_LOGIN_LENGTH, tedy např.:

define( 'MIN_LOGIN_LENGTH', 6 );

Kromě toho je k dispozici i možnost definovat pravidla pro silnější hesla. V konfiguračním souboru existují konstanty, do kterých lze zadat regulární výraz, který musí heslo resp. už. jméno splnit, aby byl formulář pro definici uživatele nebo změnu jeho údajů uložen. V případě, že údaj vyhovuje zadanému výrazu, je formulář uložen, v opačném případě se zobrazí chybové hlášení definované v další konstantě. Regulární výrazy se zadávají v syntaxi PHP funkce preg_match(). Konstanty definující toto chování jsou:

  • LOGIN_VALIDATION - regulární výraz pro kontrolu uživatelského jména
  • LOGIN_VALIDATION_FAILED - chybové hlášení zobrazované v případě, že uživatelské jméno neodpovídá regulárnímu výrazu
  • PASSWORD_VALIDATION - regulární výraz pro kontrolu hesla
  • PASSWORD_VALIDATION_FAILED - chybové hlášení zobrazované v případě, že heslo neodpovídá regulárnímu výrazu

Pokud tedy chceme např. hesla s minimálně 8 znaky, alespoň jedním velkým písmenem a alespoň jednou číslicí, lze definovat tento požadavek např. následovně:

define('PASSWORD_VALIDATION', '/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(.){8,}$/' );
define('PASSWORD_VALIDATION_FAILED', 'Heslo musí mít min. 8 znaků a musí obsahovat alespoň jedno velké a jednu číslici.' );

Při ukládání formuláře uživatele se nejprve kontroluje délka jména a hesla, pak tvary těchto údajů pomocí LOGIN_VALIDATION resp. PASSWORD_VALIDATION. Nejsou-li tyto konstanty vyplněny, tento typ kontroly se neprovádí.

Zásuvné moduly pro autentizaci

Druhou možností je využít tzv. zásuvné moduly pro autentizaci. Jedná se o kódy, které jsou navázány na proces přihlašování a které lze s dodržením zásad pro tvorbu těchto kódů vytvářet.

Využití zásuvného modulu pro autentizaci se zapíná pomocí konfigurační konstanty

define('INTEGAUTHENT', true);

Tato konstanta vyřazuje standardní proces přihlašování a nastavuje volání zásuvného autentizačního modulu. Kde je vlastní kód tohoto modulu definuje konstanta AUTH_MODULE:

define( 'AUTH_MODULE', 'auth/_http_basic.php');

Konstanta obsahuje cestu k autentizačnímu modulu relativní vůči WebToDate adresáři classes.

Je-li tedy toto zapnuto, autentizační modul musí zjistit přihlašovací údaje a vrací je zpět do WebToDate. Konfigurační konstanta AUTH_AUTO_ADD_NEW_USER v tom případě určuje, zda úspěšně autentizované uživatele pouze vyhledávat v seznamu uživatelů WebToDate nebo automaticky přidat do seznamu uživatelů.

define('AUTH_AUTO_ADD_NEW_USER', true);

Pokud je automatické přidávání zapnuto, použijí se údaje vrácené autentizační funkcí k tomu, aby se v případě, že uživatel není v seznamu uživvatelů nalezen, založil nový účet s využitím údajů vrácených autentizačním modulem (uživatelské jméno, jméno a příjmení, e-mail apod.). Je-li nalezen existující uživatel, nic se automaticky v seznamu uživatelů WebToDate nemění a využije se jen uživatelské jméno k přihlášení.

Pokud je automaticky přidán nový uživatel, odesílá se volitelně e-mail uživatelům, kteří jsou členové týmu Administrátoři informující o tom, že byl přidán nový uživatel. Odesílání těchto e-mailů ovlivňuje nastavení

define('AUTH_AUTO_ADD_SEND_MAIL', true);

V distribuci WebToDate je dodáván výchozí autentizační modul _http_basic.php, který je použitelný v případě, že vlastní autentizaci provádí např. operační systém nebo web server (např. web server Apache pomocí souboru .htaccess, na MS Windows Active Directory). Tato volba je vhodná zejména pro použití WebToDate na správu intranetového serveru.

Další autentizační moduly (např. pro autentizaci vůči LDAP, zvolenému Identity Management serveru apod.) mohou být vytvořeny.

Interní bezpečnostní funkce

Pokud je pro redakční rozhraní nastavená integrovaná autentifikace, informace o neúspěšném pokusu o přihlášení se do skriptu vůbec nedostane a tuto variantu je možné ošetřit na úrovni operačního systému (např. zamknout účet ve Windows po x pokusech o přihlášení).

Pokud se jedná o autentifikaci formulářem a redakční rozhraní je přístupné přes Internet, mohou nastat tyto případy:

  • Náhodné manuální pokusy – útočník vyplňuje náhodně přihlašovací formulář a zkouší uhodnout heslo. To lze sledovat v rámci jedné session, ale pouze v případě, že uživatel má povolené cookies.
  • Slovníkový útok – útočník používá jednoduchou aplikaci – robota, která zasílá na přihlašovací skript požadavky obsahující vyplněná data formuláře, přičemž jméno uživatele a heslo se snaží uhodnout tato aplikace, zpravidla podle nějakého slovníku či podobných postupů. Tento útok se vyznačuje tím, že lze generovat mnoho pokusů v krátkém čase a že jej nelze registrovat v session (takové aplikace zpravidla vůbec žádná cookies nepodporují).

Způsob obrany

Jediná možnost je zaznamenávat IP adresy, ze kterých jdou pokusy o přihlášení, a pokud v daném časovém intervalu je dosaženo x pokusů o přihlášení, další požadavky z této adresy ignorovat.

V globálních předvolbách v souboru global.php jsou tři konstanty:

  • MAX_LOGIN_ATTEMPTS - počet možných pokusů (výchozí hodnota 5)
  • CHECK_LOGIN_INTERVAL - časový interval v sekundách, ve kterém se pokusy hledají (výchozí hodnota 120)
  • BLACKLIST_EXPIRATION - doba v sekundách po kterou je IP adresa držena v seznamu nežádoucích adres (výchozí hodnota 1800)

Výpis pokusů o přihlášení můžete zobrazit pomocí funkce Audit přihlášení.

Interní kontroly

Kontrolní mechanismus předchází problémům, které se mohou vyskytnout hlavně při aktualizaci instalací WTD – potenciální nekonzistence mezi strukturou databáze a uloženými daty a PHP skripty, které jsou instalovány.

Teoreticky může dojít např. k následujícím chybovým stavům:

  • Chybí některá tabulka vyžadovaná pro funkci některé části
  • Struktura tabulek neodpovídá instalované verzi skriptů
  • Datové typy některých polí neodpovídají instalované verzi skriptů
  • Data v "pomocných" tabulkách neodpovídají verzi skriptů nebo nejsou kompletní

Mechanismus řešení je následující:

Speciální skript umístěný do administrační části obsahuje kontroly na strukturu databáze a dalších uvedených potenciálních problémů. Kontrola vychází ze souboru dbcheck.xml, který obsahuje ve formátu XML popis struktury databáze WTD a všech aktuálně šířených modulů.

Tento skript se spouští při přihlašování do redakčního rozhraní v případě, že se přihlašuje administrátor WTD.

Pokud skript nalezne nějakou nekonzistenci, před zobrazením redakčního rozhraní se zobrazí údaj o tom, že byla nalezena nekonzistence, to se zároveň zapíše do logu WTD.

Tímto postupem se odhalí

  • Chybějící tabulky
  • Chybějící pole nebo naopak pole, která jsou navíc
  • Chybějící povinné záznamy v tabulkách

V globálních předvolbách global.php je konstanta CHECK_WTD_VERSION, která určuje, zda se tato kontrola spouští při přihlašování, výchozí hodnota je true. Po instalaci a každé změně je doporučeno ponechat tuto hodnotu na true, v provozu, kdy se na serveru mění pouze data, je možné tuto konstantu změnit na false.

Po úspěšném přihlášení administrátora je uživatel přesměrován na kontrolní skript. Ten provádí kontrolu, pokud nenalezne žádnou chybu, přesměruje se dále na redakční rozhraní, pokud chybu nalezne, vypíše hlášení "Byly nalezeny nekonzistence v databázových strukturách, více informací v logu aplikace" a vedle toho odkaz pro vstup do redakčního rozhraní.

Některá doporučení pro zabezpečení

Pro instalaci jsou doporučena následující možná bezpečnostní opatření na úrovni systému (samozřejmě kromě standardní bezpečnostní údržby serveru zahrnující blokování portů nesouvisejících s provozem webu apod.):

  • Nastavit pro přístup do administračního rozhraní (fyzicky application) přístup pouze z vybraných IP adres
  • Nastavit virtuální adresář s administračním rozhraním (fyzicky application) případně na přístup pouze přes protokol https
  • Filtrovat pro protokol https na firewallu provoz pro pouze zvolený rozsah IP adres
  • Zvolit pro tento adresář takové virtuální jméno, které nelze snadno uhodnout (konfiguruje se jednak na úrovni www serveru, jednak v konfiguračním souboru global.php)


Po přechodu do ostrého provozu zvolit vhodnou úroveň chybových hlášení v PHP skriptech (v konfiguračním souboru PHP i v konfiguračním souboru WebToDate), která bude zabraňovat výpisu nežádoucích informací v případě chybových stavů (např. fyzické cesty k adresářům apod.).

Na úrovni konfigurace WebToDate pak v konfiguračním souboru global.php nastavit dle dokumentace automatickou správu blacklistu přihlašování dle IP adres, což je funkce bránící slovníkovým útokům na přihlašovací stránku (viz Interní bezpečnostní funkce).