Příručka:Zabezpečení

From mediawiki.org
This page is a translated version of the page Manual:Security and the translation is 100% complete.
Pokud se domníváte, že jste na MediaWiki nebo na některé z webových stránek Wikimedie našli problém se zabezpečením, využijte Zabezpečení pro kontaktní informace, abychom mohli připravit vydání opravy chyb.
Brian Wolff představuje na EMWCon 2018, jak zabezpečit instalaci MediaWiki

Udržujte systém aktuální

To nejdůležitější co můžete pro bezpečnost udělat, je to, že budete své programové vybavení udržovat aktuální. MediaWiki i software, na kterém závisí, občas vytvoří nové verze opravující nově objevené bezpečnostní chyby, které vás mohou ovlivnit.

Vývojáři MediaWiki důrazně doporučují, aby se kdokoli, kdo provozuje MediaWiki přihlásil k odběru na seznamu adresátů mediawiki-announce. V této poštovní konferenci není nijak velký provoz. Odesílá pouze informace o nových verzích programů.

V souladu s životním cyklem jsou pro každou vydanou verzi k dispozici bezpečnostní aktualizace po dobu jednoho roku Starší verze mohou obsahovat známé, ale již neopravené bezpečnostní chyby.

Rovněž tak nezapomeňte udržovat aktualizovaný Apache, PHP, MySQL/MaritaDB a jakékoli další programy, které běží na vašich serverech, operační systém a další webové aplikace.

Někteří uživatelé MediaWiki 1.3.x byli na podzim roku 2004 napadeni virem, jenž ke svému šíření využíval bezpečnostní chybu v phpBB. K přenosu si vyhledával stránky, jenž neměly nainstalován příslušný opravný patch. Následně v napadeném systému přidal do všech souborů s příponou .php, včetně šablon, které MediaWiki verze 1.3 používala správu ve znění: "you are hacked" (váš systém byl hackunut)

Dávejte si pozor na to, jaká rozšíření používáte

Pro MediaWiki je k dispozici celá řada rozšíření. Naneštěstí, tato rozšíření mají různou úroveň kvality. Použití špatně napsaných rozšíření spolu s MediaWiki je jednou z nejčastějších příčin bezpečnostních problémů.

Než se rozhodnete použít některé rozšíření, měli by jste si jej prověřit. Rozšíření vytvořené prominentními členy vývojářské komunity MediaWiki jsou obvykle docela bezpečná. Stejně tak, kterékoli rozšíření používané na wiki organizace Wikimedia Foundation bylo pravděpodobně pečlivě prozkoumáno a je tedy pravděpodobně bezpečné (Samozřejmě, nic není zaručeno na sto procent). Nicméně, pokud najdete nějaké rozšíření, které se povaluje na githubu, jehož se nikdo nedotkl mnoho let a bylo vyvinuto někým, kdo s vývojem aplikací pro web neměl velké zkušenosti, jedná se pravděpodobně o velké riziko.

Konec konců, při vyhodnocování toho, zda instalace nějakého rozšíření přináší bezpečnostní riziko, by jste měli přistupovat stejně, jako při instalaci jakéhokoli jiného kusu programového vybavení.

Rozšíření je také třeba udržovat aktualizovaná, stejně jako kterýkoli další kus software. Informace o bezpečnostních rizicích týkajících se rozšíření dodávaných spolu s MediaWiki lze najít v poštovní konferenci mediawiki-announce, dalším zdrojem bezpečnostních informací je poštovní konference mediawiki-l mailing list. Ovšem, existuje celá řada rozšíření, která neposkytují bezpečnostní informace ani v jedné z uvedených poštovních konferencí.

Přístupová práva

Další velmi důležitá věc, kterou byste měli udělat pro zabezpečení své instalace MediaWiki: Ujistěte se, že uživatel spouštějící php nemá přístup pro zápis do jakéhokoli souboru nebo adresáře přístupného z webu, na kterém je povoleno spouštět php.

Na systémech založených na Debianu to znamená, že uživatel www-data neměl vlastnit soubory php.

U unixových systémů to můžete zajistit tím, že adresář/soubory Mediawiki vlastní někdo jiný než uživatel vašeho webového serveru (www-data) nebo uživatel serveru mysql. V závislosti na tom, jak jste nainstalovali MediaWiki, to již může být případ, ale pokud ne, lze to provést provedením chown -R <uživatelské jméno zde> /path/to/MediaWiki/, kde uživatelské jméno je jiný uživatel než webový server nebo uživatel mysql (běžně byste použili své vlastní uživatelské jméno poskytnuté mysql a php neběží jako vaše uživatelské jméno). Po provedení tohoto kroku však možná budete muset změnit vlastníka adresáře s obrázky zpět na uživatele php, protože tam musí být nahrané soubory, takže tam MediaWiki musí umět zapisovat (např. chown -R www-data /path/to/MediaWiki/images). Dále spustíte chmod -R go-w /path/to/MediaWiki a odeberete přístup pro zápis všem ostatním uživatelům kromě vlastníků souborů. Po provedení tohoto kroku možná budete muset znovu povolit přístup pro zápis do adresáře obrázků.

Adresáře, ke kterým MediaWiki potřebuje přístup pro zápis (jako je $wgCacheDirectory, pokud je tato funkce povolena), by měly být umístěny mimo webový kořen. Výjimkou je adresář obrázků, který musí být v kořenovém adresáři webu. Je však důležité zakázat php v adresáři images. Podrobnosti o tom, jak to udělat, se liší podle webového serveru, ale na Apache to někdy lze provést pomocí php_flag engine off v souboru .htaccess. Pokud to provedete prostřednictvím konfiguračního souboru v samotném adresáři obrázků, měli byste se ujistit, že do konfiguračního souboru nelze zapisovat webový server. Další podrobnosti naleznete v části o zabezpečení nahrávání níže.

Váš soubor LocalSettings.php musí být čitelný pro uživatele php, neměl by však být čitelný pro celý svět, aby jiné procesy nezjistily vaše heslo k databázi a další citlivé informace. Stejně jako všechny soubory MediaWiki by uživatel php neměl mít možnost zapisovat do LocalSettings.php.

Zabezpečení transportní vrstvy (TLS, HTTPS)

Chcete-li se chránit před útoky ve stylu firesheep a obecnými úniky soukromí, doporučujeme hostovat vaše stránky pomocí TLS (HTTPS). Průvodce nastavením TLS je mimo rozsah tohoto dokumentu, je však třeba poznamenat, že nyní je to mnohem levnější, protože letsencrypt.org poskytuje bezplatné certifikáty.

Pokud nastavujete TLS, je důležité otestovat svůj web pomocí ssllabs.com/ssltest/, abyste se ujistili, že je nastaven správně, protože je snadné náhodně špatně nakonfigurovat TLS.

Pokud povolíte TLS, možná budete chtít nakonfigurovat svůj webový server tak, aby odesílal hlavičku strict-transport-security. To značně zlepší zabezpečení vašeho webu proti odposlechům, ale nevýhodou je, že se nemůžete rozhodnout přestat používat TLS na stanovenou dobu.

Obecná doporučení pro PHP

Podívejte se prosím na OWASP PHP bezpečnostní Cheat Sheet

Tyto rady se hodí téměř pro jakékoli prostředí PHP a nemusí být nutně specifické pro MediaWiki.

Doporučení pro konfiguraci PHP, pro php.ini nebo jiná nastavení:

  • Pokud to výslovně nevyžadujete, deaktivujte allow_url_fopen.
    • Chyby zabezpečení vzdáleného spuštění kódu PHP mohou záviset na schopnosti vložit adresu URL do include() nebo require(). Pokud nevyžadujete použití vzdáleného načítání souborů, jeho vypnutím můžete zabránit útokům tohoto druhu na zranitelný kód.
    • MediaWiki může vyžadovat, aby bylo toto nastavení zapnuto pro rozšíření vyhledávání Lucene, rozšíření OAI harvester, rozšíření TitleBlacklist a určitá použití Special:Import ve verzi 1.5. V typické instalaci by to však nemělo být vyžadováno.
    • MediaWiki by měla být bezpečná, i když je zapnutá. Vypnutí je preventivní opatření proti možnosti neznámé zranitelnosti.
  • Vypněte session.use_trans_sid.
    • Pokud je toto zapnuto, mohou být k URL někdy přidána ID relace, pokud soubory cookie nedělají svou práci. To může způsobit únik přihlašovacích údajů o relaci na weby třetích stran prostřednictvím údajů o odkazu nebo vyjmutí a vložení odkazů.
    • Pokud je tato funkce zapnutá, měli byste ji vždy vypnout.

Pokud například vidíte tento řádek v php.ini:

allow_url_fopen = On

Změňte to na:

allow_url_fopen = Off

Alternativně můžete přidat tuto direktivu Apache a vypnout allow_url_fopen na základě adresáře:

php_flag allow_url_fopen off

Poté restartujte Apache a znovu načtěte změny pomocí apachectl reload nebo rcapache2 reload (SuSE).

Na víceuživatelském systému s PHP nainstalovaným jako modul Apache poběží skripty všech uživatelů pod stejným uživatelským účtem s omezeným oprávněním. To může poskytnout ostatním uživatelům přístup ke čtení vašich konfiguračních souborů (včetně hesel k databázi), čtení a úpravě vašich přihlašovacích dat relace nebo zápisu souborů do vašeho adresáře pro nahrávání (pokud je povoleno).

Pro víceuživatelské zabezpečení zvažte použití konfigurace CGI/FastCGI, ve které se skripty každého uživatele spouštějí pod vlastním účtem.

Obecná doporučení pro MySQL a MariaDB

Obecně byste měli omezit přístup k databázi MySQL nebo MariaDB na minimum. Pokud bude používán pouze z jediného počítače, na kterém běží, zvažte vypnutí podpory sítě nebo povolení pouze místního síťového přístupu (přes zařízení zpětné smyčky, viz níže), aby server mohl komunikovat pouze s místními klienty přes sokety domény Unix.

Pokud bude používán v síti s omezeným počtem klientských počítačů, zvažte nastavení pravidel IP brány firewall tak, aby přijímala přístup k portu TCP 3306 (port MySQL/MariaDB) pouze z těchto počítačů nebo pouze z vaší místní podsítě a odmítala všechny přístupy. z většího internetu. To může pomoci zabránit náhodnému otevření přístupu k vašemu serveru kvůli nějaké neznámé chybě na databázovém serveru, chybně nastavenému příliš širokému GRANTu nebo úniku hesla.

Pokud vytvoříte nového uživatele MySQL/MariaDB pro MediaWiki prostřednictvím instalačního programu MediaWiki, je mu udělen poněkud liberální přístup, aby bylo zajištěno, že bude fungovat z druhého serveru i z lokálního. Můžete zvážit ruční zúžení nebo vytvoření uživatelského účtu sami s vlastními oprávněními pouze z míst, která potřebujete. Uživatel databáze potřebuje pouze oprávnění SELECT, INSERT, UPDATE a DELETE pro databázi.

Zejména privilegium FILE je častou příčinou bezpečnostních problémů. Měli byste zajistit, aby uživatel MySQL/MariaDB neměl toto oprávnění ani žádné z oprávnění "správy serveru".

Všimněte si, že tabulka user v databázi MediaWiki obsahuje hashovaná uživatelská hesla a může obsahovat uživatelské e-mailové adresy a obecně by měla být považována za soukromá data.

Údržbářské skripty

Pro skripty údržby možná budete chtít vytvořit DB-admin-user s více právy. Za tímto účelem nastavte následující proměnné s přihlašovacími údaji k databázi tohoto účtu:

Podrobnosti o potřebných právech MySQL/MariaDB najdete na stránce Příručka:Skripty údržby#Konfigurace.

Aktualizace MediaWiki

Během aktualizace může být zapotřebí více práv MySQL/MariaDB.

Více o MySQL a MariaDB

  • mysql command-line options --skip-networking.
  • Nastavení bind-address=127.0.0.1 ve vašem my.ini (v sekci [mysqld]) způsobí, že MySQL/MariaDB bude naslouchat pouze na rozhraní zpětné smyčky. Toto je výchozí nastavení v instalaci EasyPHP pro Windows. (Pokud používáte MySQL/MariaDB na Unixovém stroji, nastavení může být skip-networking místo v souboru my.cnf.)
  • GRANT a REVOKE syntaxe

Pokud databáze MySQL nebo MariaDB unikla

Pokud databáze unikla na veřejnost, v LocalSettings.php:

  1. Změňte $wgDBpassword , pokud také unikla
  2. Změňte některá písmena v $wgSecretKey
  3. Resetujte sloupec user_token v tabulce uživatelů, aby jej nebylo možné použít k předstírání identity vašich uživatelů

Pokud LocalSettings.php uniklo

Pokud LocalSettings.php uniklo na veřejnost, znovu jej chraňte a:

  1. Změňte $wgDBpassword
  2. Nahraďte $wgSecretKey jiným náhodným řetězcem písmen a číslic
  3. Vytvořte jiný $wgSpamRegex (volitelné)
  4. Obnovte sloupec user_token v tabulce uživatelů, aby jej nebylo možné použít k zosobnění žádného uživatele

Databázová hesla

Některá opatření, která možná budete chtít učinit, abyste snížili riziko zobrazení hesel MySQL/MariaDB na webu, najdete na stránce Manual:Securing database passwords .

Alternativní rozložení souboru

MediaWiki je navržena tak, aby běžela na místě poté, co byla extrahována z distribučního archivu. Tento přístup je pohodlný, ale může mít za následek sníženou bezpečnost nebo zbytečně duplicitní soubory.

Ručním přemístěním nebo konsolidací různých souborů se vyhnete duplicitám při hromadné instalaci nebo uchovávání citlivých souborů mimo webový kořenový adresář.

Přesunutí hlavních souborů inkluzí a vzhledů může vyžadovat pečlivé vybírání a výběr a změnu include_path nastaveného ve vašem LocalSettings.php. Experimentujte s tím podle potřeby.

Pokud pracujete na zlepšení zabezpečení, mějte na paměti, že WebStart.php používá jako základ aktuální adresář. To znamená, že pouze nastavení include_path nemusí pomoci zlepšit zabezpečení vaší instalace.

Přesun citlivých informací

Zvažte přesunutí hesla databáze nebo jiných potenciálně citlivých dat z LocalSettings.php do jiného souboru umístěného mimo kořen webového dokumentu a zahrnutí tohoto souboru z LocalSettings.php (prostřednictvím include()). To může pomoci zajistit, že vaše heslo k databázi nebude ohroženo, pokud chyba konfigurace webového serveru zakáže provádění PHP a odhalí zdrojový text souboru.

Podobně úprava LocalSettings.php pomocí některých textových editorů ponechá záložní soubor ve stejném adresáři se změněnou příponou, což způsobí, že kopie bude poskytnuta jako prostý text, pokud někdo požaduje například LocalSettings.php~. Pokud takový editor používáte, nezapomeňte zakázat generování záloh nebo přesunout citlivá data mimo webový kořen.

Soubor protokolu ladění MediaWiki, jak se používá pro ladění, také obsahuje citlivá data. Ujistěte se, že vždy zakážete přístup neoprávněným osobám a veřejnosti, jak je vysvětleno, smažte zbytky takových souborů protokolu, když nejsou potřeba, a komentujte nebo vymažte řádky souboru protokolu ve vašem LocalSettings.php.

/**
 * The debug log file should never be publicly accessible if it is used, as it may contain private data.
 * But it must be in a directory writable by the PHP script running within your Web server. 
 */
# $wgDebugLogFile  = "c:/Logs/mediawiki/debug.log"; // Windows
$wgDebugLogFile  = "/var/log/mediawiki/{$wgSitename}-debug.log"; // Linux

Nastavení DocumentRoot na /dev/null

Bezpečnější možností pro webový server Apache je nastavit DocumentRoot na prázdný nebo neexistující adresář a poté pomocí direktiv Alias v konfiguraci Apache zpřístupnit pouze skripty a adresáře, které potřebují být přístupný na webu.

Zaváděcí skripty

Jediným řešením PHP, které bude fungovat s jakýmkoli webovým serverem, je napsat sérii skriptů, které explicitně chdir() do konkrétního adresáře, a pak vyžadují jeden nebo více zdrojových souborů. Například:

<?php
chdir('/path/to/wiki');
require('./index.php');

Zabezpečení uživatele

Každý, kdo je schopen upravovat uživatelské rozhraní systémové zprávy v MediaWiki: jmenný prostor, může do výstupu stránky zavést libovolný HTML a JavaScript kód. To zahrnuje uživatele wiki, kteří mají oprávnění editinterface, stejně jako kohokoli s přímým přístupem k zápisu do textové tabulky v databázi.

HTML je zakázáno u mnoha systémových zpráv, zejména těch, které se zobrazují na přihlašovací obrazovce, takže riziko zachycení hesla JavaScriptem by mělo být minimální. Škodlivý kód se však může stále pokoušet zneužít zranitelnosti prohlížeče (instalovat spyware atd.), takže byste se měli ujistit, že systémové zprávy mohou upravovat pouze důvěryhodné osoby.

Zabezpečení nahrávání

Související stránka: Příručka:Konfigurace nahrávání souborů

Hlavním problémem je: Jak zabráníme uživatelům nahrávat škodlivé soubory?

Nahrávání souborů je volitelnou funkcí MediaWiki a je ve výchozím nastavení zakázáno. Pokud je povolíte, musíte také poskytnout adresář v kořenovém adresáři webu, do kterého může uživatel webového serveru zapisovat.

To má několik důsledků pro bezpečnost:

  • Adresář může být celosvětově zapisovatelný, nebo může být vlastněn omezeným uživatelským účtem webového serveru. Na víceuživatelském systému může být možné, aby ostatní místní uživatelé vsunuli škodlivé soubory do vašeho adresáře pro nahrávání (viz víceuživatelské poznámky výše). Pokud je to jen trochu možné, udělejte do adresáře zapisovatelný pouze účet webového serveru, neudělejte do adresáře světový zápis.
  • Zatímco konfigurace PHP nastavuje limit velikosti souboru pro jednotlivá nahrávání, MediaWiki nestanovuje žádný limit pro celkový počet nahrávání. Zlomyslný (nebo příliš horlivý) návštěvník by mohl zaplnit diskový oddíl nahráním velkého množství souborů.
  • Vygenerované miniatury a nahrané soubory zadržené pro potvrzení přepsání mohou být uchovány v obrázcích/thumb a obrázcích/tmp bez viditelného upozornění ve webovém rozhraní MediaWiki. Sledujte také jejich velikosti.

Výchozí konfigurace se pokouší omezit typy souborů, které lze pro bezpečnost nahrávat:

  • Ve výchozím nastavení jsou přípony souborů .png, .gif, .jpg, .jpeg a webp na bílé listině ($wgFileExtensions ).
  • Různá rozšíření spustitelných souborů a skriptů jsou výslovně zakázána ($wgProhibitedFileExtensions ), i když uživatelům umožníte přepsat seznam povolených ($wgStrictFileExtensions ).
  • Několik známých přípon souborů obrázků má svůj typ ověřený pomocí funkce getimagesize() PHP.
  • Nahrané soubory jsou kontrolovány, aby se zjistilo, zda by mohly způsobit chyby zjišťování typů souborů v Internet Exploreru a Safari, které by mohly způsobit jejich zobrazení jako HTML. (Bylo navrženo odstranit tento check, viz T309787).

Jako preventivní opatření byste měli explicitně zakázat spouštění skriptů PHP (a všech dalších typů skriptů, které můžete mít) na straně serveru v adresáři uploads (ve výchozím nastavení images). Měli byste také instruovat prohlížeče, aby "nečmuchaly" soubory nastavením hlavičky X-Content-Type-Options: nosniff.

Například fragment souboru Apache .conf, který to provede, pokud je vaše instance MediaWiki v /Library/MediaWiki/web, může vypadat nějak takto:

<Directory "/Library/MediaWiki/web/images">
   # Ignore .htaccess files
   AllowOverride None
   
   # Serve HTML as plaintext, don't execute SHTML
   AddType text/plain .html .htm .shtml .phtml
   
   # Don't run arbitrary PHP code.
   php_admin_flag engine off

   # Tell browsers to not sniff files
   Header set X-Content-Type-Options nosniff
   
   # If you've other scripting languages, disable them too.
</Directory>

Pokud nemáte přístup ke konfiguračním souborům Apache, ale můžete použít soubory .htaccess k přepsání konfiguračních nastavení v konkrétních adresářích, můžete do adresáře pro nahrávání umístit soubor .htaccess, který vypadá takto:

# Serve HTML as plaintext, don't execute SHTML
AddType text/plain .html .htm .shtml .phtml .php .php3 .php4 .php5 .php7

# Old way of registering php with AddHandler
RemoveHandler .php

# Recent way of registering php with SetHandler
<FilesMatch "\.ph(p[3457]?s?|tml)$">
   SetHandler None
</FilesMatch>

# If you've other scripting languages, disable them too.

Vaše přesná konfigurace se může lišit. Zejména použití voleb open_basedir může komplikovat manipulaci s nahráváním.

Pokud použijete některé z výše uvedených řešení, můžete si ověřit, zda skutečně funguje, pomocí tohoto jednoduchého testu.

  • Vytvořte soubor 'test.php' v adresáři pro nahrávání.
  • Vložte <?php phpinfo(); do souboru.
  • Navštivte cestu k souboru ve webovém prohlížeči. Pokud vidíte jen text souboru, jste v pořádku, jinak je někde něco špatně.

Zákaz řešení PHP pro Nginx: http://serverfault.com/a/585559/162909

Pro nejlepší zabezpečení byste také měli zvážit použití samostatné domény pro nahrané soubory. Pro úplné zabezpečení je nejlepší, aby nahrávání probíhalo ze zcela samostatné domény, nikoli ze subdomény, ale dokonce i subdoména poskytne dodatečné zabezpečení. To je zvláště důležité, pokud povolíte nahrávání souborů SVG, protože tento formát souboru je velmi podobný HTML. MediaWiki kontroluje bezpečnost nahrávání SVG, ale nejlepší je mít více vrstev obrany. Informace o konfiguraci jiné domény pro poskytování mediálních souborů naleznete v části $wgUploadPath .

Externí programy

  • Pro sloučení konfliktu úprav lze spustit /usr/bin/diff3.
  • Pokud je povolena podpora ImageMagick pro miniatury nebo obrázky SVG, lze na nahraných souborech spustit convert.
  • Pokud je povoleno, rozšíření Math zavolá spustitelný soubor texvc, který volá latex, dvips a convert (který volá gs).

Související odkazy