Příručka:Autorizace obrázků

This page is a translated version of the page Manual:Image authorization and the translation is 100% complete.

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:

  1. Vlastní adresář musí být chráněn před přímým přístupem a;
  2. 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:

  1. 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
  2. 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:

  1. Apache (většina verzí)
  2. 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:

  1. 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)
  2. 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>
    
  3. aby bylo možné jej číst/zapisovat pro webový server:
    chgrp <your_web_server_group> <dir_name_unguessable>
    chmod 770 <dir_name_unguessable>
    
  4. 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
    
  5. 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
Pokud jste svůj adresář nepřesunuli, nemusíte $wgUploadDirectory měnit

<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

Tento krok je nutný pouze v případě, že chcete nadále používat adresy URL obsahující přímé cesty k vašim obrázkům. MediaWiki by to nikdy neměla vyžadovat, pokud jste úspěšně dokončili předchozí konfigurační změny.

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
Pokud jste svůj adresář nepřesunuli, nemusíte $wgUploadDirectory měnit

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.

  Varování: Přístup img_auth funguje POUZE s režimem PHP ISAPI na platformě WIMP (Windows, IIS, MySQL, PHP). Pokud jste postupovali podle standardních pokynů k instalaci Windows, vaše wiki bude používat CGI (php-cgi.exe) a budete muset převést na ISAPI. Pokyny, jak to udělat, jsou na stránce diskuse. V přístupu php-cgi při analýze PATH_INFO je chyba, která se u některých souborů v omezené cestě zobrazí jako "Chyba CGI: Zadaná aplikace CGI se chovala špatně, protože nevracela kompletní sadu HTTP hlaviček". Toto je problém PHP/IIS, ne problém MediaWiki.

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).