Blog

Soubor na heslo

31. 5. 2007

Když tohle píšu, zbývá nám do dne zaheslovaných blogů jedna jediná hodinka. Až to dopíšu, bude to už pravděpodobně pouhopouhá minutka a právě proto je nejvyšší čas povědět si něco o ochraně stránek heslem. A protože nemáme času na zbyt, uděláme to tím nejjednodušším způsobem – přímo na straně webového serveru v souboru .htaccess. Pokud nemáte na svém serveru soubor .htacces k dispozici, můžete jít spát. Pokud si naopak myslíte, že informace, které se zde dočtete by se mohly být pro někoho užitečné, zkuste mě v komentářích donutit, ať to přepíšu na rozumnější formou na rozumnější místo.

Konec keců, jdeme na to:

Zaheslování celého adresáře

Zaheslování přístupu k celému adresáři se udělá velmi lehce:

Do souboru .htacces v adresáři, který má být na heslo, přidejte řádky

AuthType Basic
AuthName "Zaheslovaná sekce"
AuthUserFile /cesta/k/souboru/.htpasswd
Require valid-user

Text u položky AuthName se bude zobrazovat někde v tom okýnku, co bude chtít po uživateli heslo. Cesta u AuthUserFile musí být zadána absolutně, protože relativní cesta se bude počítat od ServerRoot, který se zpravidla nachází někde v /etc/apache2 a tam si asi soubor nazapíšete. Jinak žádné dramatické nastavování, takže jedeme dál.

Nastavení hesla

Soubor se jmény a příslušnými zašifrovanými hesly vykouzíme zcela jednoduše příkazem

htpasswd -c soubor jmeno

Bude to po nás chtít dvakrát opsat heslo pro příslušného uživatele a hotovo.

Jako soubor zadáme jméno souboru, kde budou hesla uložená. (Přesně ten, co jsme zadávali do AuthUserFile. Nejčastěji se soubor pojmenovává .htpasswd. Pro takto pojmenovaný soubor je totiž většinou už implicitně nastaveno, že nesmí být zobrazen. Když si soubor pojmenujete například hesla, tak si jej pak může kdokoliv, kdo na jeho jméno přijde, zobrazit. Samozřejmě získat ze zašifrovaného hesla heslo původní není taky úplně jednoduché, ale o tom si povíme někdy jindy.

Když chceme do souboru přidat ještě nějaké další jméno a heslo, uděláme to příkazem

htpasswd soubor dalsijmeno

Pokud chceme zaheslovat blog se vším všudy, jsme v této chvíli hotovi. Všechny soubory a adresáře daného adresáře teď máme zaheslované a můžeme si užívat.

Zaheslování jednotlivých souborů

Pokud chceme něco více, nastupuje právě teď ta vyšší dívčí škola úprav .htaccess

Já například nechci mít ani 1.6. na heslo rss kanál, starší články atd… Jak to udělat? Můžeme specifikovat konkrétní soubor, který chceme chránit heslem tak, že obklíčíme v souboru .htaccess sekci věnovanou heslování speciálními značkami <Files> a </Files>.

Takže když si budu chtít zaheslovat jeden jediný článek, udělám to takhle:

<Files 2007-06-01-den-zaheslovanych-blogu>
    AuthType Basic
    AuthName "Den zaheslovanych blogu"
    AuthUserFile /home/zirafka/blog.zirafka.cz/.htpasswd
    Require valid-user
</Files>

za cestou /home/zirafka/blog.zirafka.cz/ nehledejte nic záhadnějšího, než absolutní cestu k adresáři, kde je uložen celý web.

V této chvíli už mnozí tuší, že soubor 2007-06-01-den-zaheslovanych-blogu není skutečným souborem. A to je na tom právě to krásné. Jako parametr Files dáváte cestu, kterou se k dané stránce dostává uživatel, nikoliv adresu realného skriptu, tak jak si ji přeloži mod_rewrite.

Při definování souborů v sekci <Files> můžeme použít i regulární výrazy. Když chci zaheslovat nejen ten jeden clanek, ale třeba i úvodní stránku, udělám to takhle:

<Files ~ "2007-06-01-den-zaheslovanych-blogu|^$">
    AuthType Basic
    AuthName "Den zaheslovanych blogu"
    AuthUserFile /home/zirafka/blog.zirafka.cz/.htpasswd
    Require valid-user
</Files>

Vysvětlení: vlnovka znamená, že se bude porovnávat s regulárním výrazem. Svislou čarou se oddělí jednotlivé podvýrazy, ^$ je výraz, který pasuje na začátak následovaný koncem. To znamená prázdný řetězec. Jediný způsob, jak říct, že chcete, aby pravidlo platilo i v případě, že prostě žádná cesta k souboru zadaná nebude.

Samozřejmě pravidlo, tak, jak je napsané teď, se dá obejít. Kdo vymyslí, jak se dostat k článku bez znalosti heslo, získává uznalé pokývání hlavou.

Největší chyták konfigurace pro vybrané stránky je v tom, že pokud jste zvyklí nastavovat Apache pomocí <Location>, tak to tady nebude fungovat, ani kdybyste se na hlavu stavěli. Maximálně najdete error logu hlášku končící: .htaccess: <Location not allowed here. Dokumentace je totiž v tomhle fakt vtipná. Zatímco v popisu položek <Location> a <Directory> se nic nepíše, u popisu <Files> se konečně dočtete, že Narozdíl od sekcí <Directory> a <Location>, sekce <Files> může být použita v souboru .htaccess. Nalezení této nenápadné větičky do hodině přemýšlění, jak to udělat jinak, je důvod k otevření šampaňského.

Chybová stránka

Tak a máme zaheslováno. Funguje to, je to krásné, ale ještě se podíváme na jednu vychytávku. A tou je chybová stránka, který se objeví, když návštěvník zadá špatně heslo, nebo dá na přihlašovacím formuláři „Cancel“. Implicitně je nastavena napříliš přátelsky psaná stránka v angličtině. I tu si ale můžeme změnit dle svého přání v souboru .htaccess. Možností je hned několik:

ErrorDocument 401 "Dnes je den zaheslovaných stránek. Pokud se chcete dostat dovnitř, musíte zadat jméno a heslo \"ann\""

vám vypíše místo anglické hlášky tu vaši. Protože je celý text uzavřen u uvozovkách, musela jsem napsat zpětná lomítka před uvozovky, které jsou uvnitř něj, abych zrušila jejich speciální význam.

Další možnost je přesměrovat chybu na konktrétní stránku

ErrorDocument 401 /e401

Takhle to mám udělané zde. Zadaná stránka bude znovu pčechroustané přepisovacími pravidly mod_rewrite. Při přesměrování na stránku taky nesmíme zapomenout, že se bude znovu zjišťovat, jestli není stránka chráněna heslem. Takže pokud si zablokujeme na heslo celý web, nepovede se nám zobrazit chyba ani když se rozkrájíme. Pozor na to!

V předchozích příkladech je „401“ kód chyby, který se generuje, když selže přihlášení. Podobně se dají nahrazovat i jiné chyby. Můžete si to vyzkoušet přímo zde: 404 pro neexistující stránky, 403 pro stránky, kam je zakázán přístup.

Na konec ještě pro úplnost: Všechy ostatní chybové stránky se dají přesměrovávat na jiný server, dá se tedy zadat jako druhý parametr ErrorDocument celé URL. Bohužel při tomhle přesměrování se určitým způsobem čachruje i s chybovými kódy. Výsledkem tedy je, že přesměrovat chybu 401 se nám nikdy nepovede na vzdálený server, vždy musí být zadána lokální adresa, tedy musíme si to zařídít tak, abychom se alespoň k jedné stránce lokálně dostali.

Ufff… tak to je vše. Planovaný termín vydání článku jsem sice prošvihla o tři hodiny, ale zato jsem se mezitím dozvěděla spoustu zajímavých informací a tak… Takze hurá do heslování a Enjoy nebo tak něco…

Komentáře k článku:

Pátek 1. 06. 2007 v 05:04

Díky za špičkový návod, bez něj bych se DZB vůbec nemohl zúčastnit. Leda jako čtenář. Znám totiž heslo!

Pátek 1. 06. 2007 v 07:32

Tak díky za vyčerpávající návod, ale mám pocit že ho vůbec nevyužiju :D Krom toho hesla tedy :)

avatar
Lot
Pátek 1. 06. 2007 v 11:59

„Kdo vymyslí, jak se dostat k článku bez znalosti heslo, získává uznalé pokývání hlavou.“

Pokud slovy dostat se k článku myslíš dostat se na úvodní stránku, tak jsem na to přišel… Dokonce to šlo hned prvním způsobem který mě napadl :-)

Teda, teď, když chci vložit komentář, opět mě to heslem obtěžuje, ale náhled je zatím v poho i bez hesla… takže jsem na to snad přišel.

Pátek 1. 06. 2007 v 12:03

2Lot> Prisel, gratuluju (-:

avatar
Lot
Pátek 1. 06. 2007 v 12:10

Ten automaticky vkládaný avatar je kouzelný :-)

avatar
rybicka
Pátek 1. 06. 2007 v 12:29

super navod, libi:)

Pátek 1. 06. 2007 v 12:52

Paráda, dík za informace, ještě dneska je využiju, zatím prdím na sessions, zahesluju to takto a do určité doby to bude stačit ..

Pátek 1. 06. 2007 v 14:04

Ha konečně důvod proč nezaplatit hosting a přejít někam jinam. .htaccess totiž upravovat nemůžu :(

Pátek 1. 06. 2007 v 14:08

2007–06–01 15:21 Lokutus

http://lokutus.bloguje.cz Já mám bloguje.cz a jsem v pohodě. :-)

Sobota 2. 06. 2007 v 02:49

2ALL> diky za reakce vsem, komu navod poslouzil. aspon k necemu ten za*** den byl dobrej. (-:

avatar
gaudino
Sobota 14. 07. 2007 v 15:41

Ahoj, udelal jsem si zabezpeceni pomoci .htaccess a .htpasswd. Vsechno mi funguje dobre, ale kompletni fotogalerii mam v adresari admin. tzn. ze se nahledy nezobrazuji…resp. to po me chce vzdy heslo a jmeno.

Chtel jsem se zeptat, jestli existuji v techto souborech taky nejake vyjimky…

Napr. kdyz nahraju do rootu web robots.txt, tak si presne muzu ridit jake adresare aby to neindexovalo, jake roboti maji zakaz indexovat…a co nemaji indexovat…apod.

Existuje prosim vas taky neco tady v te problematice??

Abych nahral do adresare „admin“ soubory .htaccess a .htpasswd. a nekde nastavil, aby se tyto pravidla treba neaplikovala na podadresar fotogalerie??…(ad­min/fotogaleri­e)

proste ne aby jsem urcoval jake soubory/adresare chci zaheslovat, ale abych zahesloval cely obsahly adresar a jen nekde urcil ze treba jeden podadresar bude nadale povoleny pro vsechny

jde to?? diky