Příručka:Autorizace obrázků
Tento článek je určen systémovým administrátorům, kteří chtějí omezit přístup k obrázkům a souborům na základě oprávnění uživatele a/nebo uživatelských skupin.
Nahrané soubory jsou obecně poskytovány přímo webovým serverem, nikoli prostřednictvím MediaWiki. I když existuje minimální úroveň zabezpečení díky nejasnostem s obfuskací cesty (např. /c/c4/...), cestu lze snadno vypočítat z názvu souboru a neposkytuje skutečnou ochranu.
Toto není doporučená konfigurace. MediaWiki není navržena jako CMS (Content management system - redakční systém) ani k ochraně citlivých dat. Naopak byl navržen tak, aby byl co nejotevřenější. Nepodporuje tedy ze své podstaty plně funkční, vzduchotěsnou ochranu soukromého obsahu. Každý administrátor, který chce používat tuto funkci, by si měl pečlivě prostudovat Bezpečnostní problémy s autorizačními rozšířeními .
Přehled
Ve výchozím nastavení jsou všechny nahrané obrázky (a soubory) přístupné přímo webovému serveru. Pokud chcete povolit přístup pouze oprávněným uživatelům v rámci MediaWiki, musí být splněny dvě podmínky:
- Vlastní adresář musí být chráněn před přímým přístupem a;
- Autorizace MediaWiki musí být vyvolána, když dojde k přístupu k obrázku/souboru spuštěním skriptu, když je požadována jakákoli adresa URL obsahující tento adresář.
Základní implementace vyžaduje:
- Adresář obrázků ($wgUploadDirectory ) by měl být v souborovém systému přesunut mimo kořen webu nebo jinak chráněn
- Cesta k nahrávání ($wgUploadPath ) by měla ukazovat na img_auth.php .
Mechanismy pro oba jsou závislé na platformě webového serveru. Tento článek obsahuje podrobné pokyny pro dvě platformy:
- Apache (většina verzí)
- Microsoft Internet Information Server (IIS), verze 6.0 a vyšší
Pro všechny instrukce předpokládejme, že moje MediaWiki je nainstalována v "/path/to".
Například v:
http://wiki.example.org/MyWiki
"/path/to" je "/MyWiki"
Jak funguje "img_auth.php"?
Autorizace obrázků funguje tak, že požadavky na nahrané mediální soubory jsou směrovány pomocí skriptu img_auth.php, namísto toho, aby umožnila webovému serveru odeslat soubor přímo do prohlížeče.
To se provede nastavením $wgUploadPath na umístění skriptu img_auth.php ($wgUploadPath = "$wgScriptPath/img_auth.php";
) namísto adresáře pro nahrávání.
To způsobí, že MediaWiki generuje adresy URL souborů, které vypadají jako http://wiki.example.org/w/img_auth.php/01/01/Example.png
.
Když webový server obdrží požadavek na takovou adresu URL, bude vědět, že má zavolat skript img_auth.php
a předat mu zbytek adresy URL jako PATH_INFO.
Skript poté zkontroluje, zda má uživatel přístup k souboru uvedenému v PATH_INFO, na základě běžného mechanismu používaného pro správu přístupu ke stránkám wiki.
Pokud img_auth.php určí, že uživatel má přístup k požadovanému souboru, přečte obsah souboru a odešle jej zpět uživateli, stejně jako kdyby webový server obsluhoval soubor přímo z disku.
Pokud však uživatel nemá přístup k souboru, img_auth.php vrátí standardní chybu 403 "Access Denied" (přístup odepřen).
Konfigurace nahrávání souborů
Než se pokusíte o tuto konfiguraci, je velmi důležité, abyste pochopili, jak konfigurovat nahrávání souborů. Věnujte prosím chvíli přečtení a pochopení tohoto článku – ušetří vám to spoustu času.
Podpora PHP PATH_INFO
To vyžaduje, aby vaše nastavení PHP podporovalo PATH_INFO (mnoho konfigurací CGI ne) a vy musíte být v režimu $wgWhitelistRead , jinak by to nemělo smysl ... pokud nechcete jen bezpečnější MW instalaci. Viz níže.
Další scénář, motivovaný bezpečností (POUZE Apache/Unix)
I když nechcete omezovat přístup ke svým obrázkům, možná budete chtít využít mechanismus img_auth.php
: Vyhnout se veřejně přístupným adresářům, kde má webový server oprávnění k zápisu.
Přestože zapisovatelný adresář webového serveru není sám o sobě nebezpečný, je to první polovina úspěšného útoku na váš webový server.
Druhá polovina by pak byl nějaký zneužitelný (PHP) skript, který by byl MW nebo s největší pravděpodobností nějaký jiný skript.
Pokud útočník může zneužít poškozený skript k nahrání nebo vygenerování jiného skriptu určeného k tomu, aby mu pomohl s dalšími útoky/spamováním atd., útočník stále potřebuje místo, kam tento skript uložit, zapisovat do něj webový server ... a mít ho k dispozici a dobře známý v adresáři images
standardních instalací MW.
Úplně prvním bezpečnostním opatřením proti tomu bude umístění souboru .htaccess
do adresáře images
s tímto obsahem:
# Žádné spouštění PHP v oblasti nahrávání
php_admin_flag engine off
A že .htaccess
nemusí být zapisovatelný webovým serverem! Škoda, že s tím MW nepřichází standardně (alespoň ne v 1.6.10).
Ještě lepší však bude přesunout zapisovatelný adresář images
webového serveru mimo kořen dokumentu, přejmenovat jej na něco nepředvídatelného (např. MD5 hash <whatever>) a streamovat obrázky přes img_auth.php
, takže že skutečný název adresáře se nikdy nezobrazí.
Chcete-li to provést, postupujte takto:
- přihlaste se do shellu vašeho webového serveru (podobné akce jsou často možné s vaším FTP klientem, pokud ne, požádejte svého poskytovatele, aby vám pomohl)
- vytvořte neodhadnutelný adresář
images/upload
mimo (paralelně s) kořenem vašeho dokumentu (všimněte si/..
na konci cesty):cd </absolutní/cesta/k/vašemu/doc_root>/.. mkdir <dir_name_unguessable>
- aby bylo možné jej číst/zapisovat pro webový server:
chgrp <your_web_server_group> <dir_name_unguessable> chmod 770 <dir_name_unguessable>
- vytvořte soubor .htaccess, jak je uvedeno výše, a udělejte jej čitelný pouze (toto je paranoia, protože webový server se sem nikdy nepodívá, pouze PHP se normálně nestará o soubory
.ht*
, ale pro případ, že by se tento adresář někdy vytvořil dostupné přímo webovému serveru):cd <dir_name_unguessable> echo 'php_admin_flag engine off' > .htaccess chmod 444 .htaccess
- změňte svůj konfigurační soubor LocalSettings.php:
$wgUploadPath = "$wgScriptPath /img_auth.php"; $wgUploadDirectory = '</absolutní/cesta/k/vašemu/doc_root>/../<dir_name_unguessable>'; $wgEnableUploads = true; # Nechceme omezovat přístup, jen zajistit, aby byla naše instalace MW bezpečnější $wgWhitelistRead = false;
který by měl dělat správnou věc bez jakékoli další konfigurace.
To by mělo fungovat pro webové servery s PHP spuštěným jako modul Apache.
Žádné další změny konfiguračního souboru Apache nejsou nutné.
Pak už nikdy neuvidíte cestu ke svým obrázkům, img_auth.php
zachycuje všechny přístupy pro čtení.
Ale budou se zobrazovat všechny vaše obrázky, včetně thumbs.
Pokud používáte CGI pro IIS, vaše vzdálenost se může lišit.
Nastavení Apache
Apache Krok 1. Ochrana adresáře obrázků před přístupem k Internetu
V adresáři [/path/to]/images vytvořte soubor .htaccess obsahující jeden řádek:
Deny from All
<span id="Apache_Step_2._Execute_Script_img_auth.php
_for_all_Accesses">
Apache Krok 2. Spusťte skript img_auth.php
pro všechny přístupy
Apache Step 2.1. Změňte $wgUploadPath v LocalSettings.php
. Toto není potřeba, pokud je proveden krok 2.2 Apache.
$wgUploadPath = "[/path/to]/img_auth.php";
[/path/to]
je cesta URL, nikoli cesta k systému souborů, takže pokud je img_auth.php v /usr/share/mediawiki
, ale přistupuje se k němu jako http://example.org/mediawiki/img_auth.php
, řádek bude znít:
$wgUploadPath = "/mediawiki/img_auth.php";
Nezapomeňte přidat úvodní lomítko /
, pokud je img_auth.php
skutečně ve vašem kořenovém adresáři.
Obrázky se vůbec nezobrazí, pokud na to zapomenete:
$wgUploadPath = "/img_auth.php";
Apache Step 2.2. Vytvořte aliasy pro spuštění img_auth.php
Upravte soubor httpd.conf
a přidejte dva následující aliasy:
Alias [/path/to]/images/ [/path/to]/img_auth.php/
Alias [/path/to]/images [/path/to]/img_auth.php
Druhá [/path/to] na každém řádku by měla být absolutní cesta v systému souborů a může být nutné přidat koncové lomítko k img_auth.php (tj. použijte [/path/to]/img_auth.php/).
Apache Krok 2.3. Restartujte server Apache
Instrukce Apache bez PATH_INFO s mod_rewrite
Apache Krok 1. Stáhněte si skript autorizace obrazu podporující cgi
Není-li PATH_INFO k dispozici, stáhněte si skript autorizace obrazu podporující CGI.
Uložte skript pod názvem cgi_img_auth.php
do adresáře MediaWiki.
Apache Krok 2. Ochrana adresáře obrázků před přístupem k Internetu
V adresáři [/path/to]/images
vytvořte soubor .htaccess
obsahující jeden řádek:
Deny from All
Apache Krok 3. Spusťte skript cgi_img_auth.php pro všechny přístupy
Apache Step 3.1. Změňte $wgUploadPath v LocalSettings.php
$wgUploadPath = "[/path/to]/cgi_img_auth.php";
Apache Step 3.2. Upravte .htaccess
Upravte soubor .htaccess tak, aby vypadal takto
RewriteEngine on
RewriteRule ^/path/to/images(.*)$ /path/to/cgi_img_auth.php/$1 [R]
RewriteRule ^path/to/cgi_img_auth.php/(.*)$ path/to/cgi_img_auth.php?path=/$1
Všimněte si však, že tento krok je u některých instalací nepotřebný.
Apache – Kompatibilita s čistými adresami URL
Pokud váš web přepisuje adresy URL prostřednictvím .htaccess
, budete potřebovat výjimku před vlastním přepsáním:
RewriteCond %{REQUEST_URI} /img_auth\.php/
RewriteRule ^ - [L]
(To znamená: v případě zavolání img_auth zastavit pravidla)
Příklad .htaccess:
RewriteEngine On
# First condition&rule:
RewriteCond %{REQUEST_URI} /img_auth\.php/
RewriteRule ^ - [L]
# Rest of rules:
RewriteCond ...
RewriteRule ...
Apache - Zakázat seznam adresářů
Pokud nechcete, aby uživatel vypisoval vaši složku obrázků, nastavte toto v konfiguraci Apache:
<Directory /var/www/wiki/images>
Options -Indexes
</Directory>
Pokyny IIS
Implementace v IIS je složitější, protože postrádá inherentní 'svislítko' schopnosti Apache nebo Unixu obecně. Pomocí několika triků však lze IIS vytvořit tak, aby spouštěla CGI a dosáhla ochrany.
IIS Krok 1. Ochrana adresáře obrázků před anonymním internetovým přístupem
U služby IIS je důležité, aby uživatelé nemohli přistupovat k obrázkům nebo souborům pomocí alternativních cest URL, aby se obešli přesměrování virtuálního adresáře. Proto musí být vytvořen nový adresář mimo kořen MediaWiki.
IIS Krok 1.1 Vytvoření nového fyzického adresáře
Vytvořte nový fyzický adresář. Tento adresář by neměl být v žádných jiných existujících webových adresářích nebo virtuálních webových adresářích:
Příklad:
c:\inetpub\wwwroot\MyWikiImg
IIS Krok 1.2 Kontrola/nastavení zabezpečení adresáře
Zabezpečení adresáře musí umožňovat čtení, zápis a úpravy pro internetový účet hosta (obvykle IUSR_[název serveru]). Nebojte se, v následujících krocích to upravíte.
IIS Krok 2. Spusťte skript img_auth.php pro všechny přístupy k adresáři obrázků
Ve službě IIS se to provádí vytvořením virtuálního adresáře se stejným názvem jako fyzický adresář (pokud je váš adresář mimo kořenový web).
IIS Krok 2.1 Vytvořte virtuální adresář se stejným názvem jako fyzický adresář
Vytvořte nový virtuální adresář pomocí Start->Nástroje pro správu->Správce internetových informačních služeb (IIS) ve webové službě, kterou používáte pro MediaWiki.
Klikněte pravým tlačítkem na webovou službu->Nový virtuální adresář...
V průvodci vytvořte nový virtuální adresář se stejným názvem jako fyzický adresář a nasměrujte jej na tento adresář.
IIS Krok 2.2 Přesměrování nového virtuálního adresáře na img_auth.php
Stále ve Správci IIS klikněte pravým tlačítkem na nový virtuální adresář->Vlastnosti, vyberte kartu 'Virtuální adresář' a změňte 'Obsah tohoto zdroje by měl pocházet z:' na 'Přesměrování na adresu URL'. Vyplňte 'Přesměrovat na:' s URL na img_auth ve vaší MediaWiki.
Příklad:
http://wiki.example.org/MyWiki/img_auth.php
Nezapomeňte kliknout na Použít!
IIS Krok 3 Zkopírujte starý adresář obrázků do nového
Zkopírujte obsah starého adresáře obrázků ($ip/image) a podadresářů do nového adresáře, který jste vytvořili.
Poznámka: Adresář image
nebude v novém adresáři existovat.
Nový adresář by se neměl zobrazovat jako:
Špatně:
MyWikiImg images 0 1 . . .
Správně:
MyWikiImg 0 1 . . .
IIS Krok 4 Přesměrování Zpracování obrázků MediaWiki
IIS Krok 4.1 Změna $wgUploadPath v LocalSettings.php
$wgUploadPath = "[NewVirtualDirPath]";
Příklad:
$wgUploadPath = "/MyWikiImg";
IIS Krok 4.2 Změna $wgUploadDirectory v LocalSettings.php
$wgUploadDirectory = "[NewVirtualDirImages]";
Příklad:
$wgUploadDirectory = "D:\Inetpub\wwwroot\MyWikiImg";
IIS Krok 4.3 Restartujte webovou službu IIS
IIS Krok 4.4 Odstraňování problémů IIS PATH_INFO
Pokud vaše instalace nefunguje, může to být způsobeno tím, že img_auth.php vyžaduje, aby server vrátil PATH_INFO, aby přesně věděl, ke kterému souboru chcete přistupovat (např. vše v URL za virtuálním adresářem).
Objevilo se několik článků a rad, že některé verze IIS mohou 'z bezpečnostních důvodů' zakázat serverové proměnné PATH_INFO a PATH_TRANSLATE. I když jsme tento problém neměli na aktuální úrovni serveru a opravy (IIS 6.0), jedná se o problém známý pro službu IIS 4.0 (a možná starší), možná budete chtít prozkoumat, zda vám img_auth.php nefunguje.
Úplný článek znalostní databáze lze nalézt na adrese Použití PATH_INFO a PATH_TRANSLATED z CGI aplikací. V článku se dozvíte, jak spustit program napsaný v MS Visual Basic (možná budete muset načíst CScript).