Manual:Security/cs


 * 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 pro kontaktní informace, abychom mohli připravit vydání opravy chyb.



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í: "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  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, 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ř. ). Dále spustíte  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í  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. 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 nebo jiná nastavení:


 * Pokud to výslovně nevyžadujete, deaktivujte.
 * Chyby zabezpečení vzdáleného spuštění kódu PHP mohou záviset na schopnosti vložit adresu URL do nebo . 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.
 * 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 referreru 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í  nebo   (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  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.
 * Nastavení  ve vašem my.ini (v sekci  ) 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   místo v souboru my.cnf.)
 * GRANT and REVOKE syntax

If the MySQL or MariaDB database has leaked
If the database has leaked to the public, in LocalSettings.php:


 * 1) Change  if that leaked too
 * 2) Change some letters in
 * 3) Reset the user_token column in your user table so that it can't be used to impersonate your users

If LocalSettings.php has leaked
If LocalSettings.php has leaked to the public, reprotect it and:


 * 1) Change
 * 2) Replace  with a different random string of letters and numbers
 * 3) Make a different  (optional)
 * 4) Reset the user_token column in your user table so that it can't be used to impersonate any users

Database passwords
See for some precautions you may wish to take to reduce the risk of MySQL/MariaDB passwords being presented to the web.

Alternate file layout
MediaWiki is designed to run in-place after being extracted from the distribution archive. This approach is convenient, but can result in reduced security or unnecessarily duplicated files.

You avoid duplicates in a mass installation or to keep sensitive files out of the web root for safety by manually relocating or consolidating various files.

Moving the main includes and skin files may require carefully picking and choosing and altering the  set in your. Experiment with this as desired.

If working to improve security, keep in mind that  uses the current directory as a base. This means that only setting your  may not help to improve the security of your installation.

Move sensitive information
Consider moving the database password or other potentially sensitive data from  to another file located outside of the web document root, and including that file from   (through  ). This can help to ensure that your database password will not be compromised if a web server configuration error disables PHP execution and reveals the file's source text.

Similarly, editing  with some text editors will leave a backup file in the same directory with an altered file extension, causing the copy to be served as plain text if someone requests, for example,. If you use such an editor, be sure to disable backup generation or move sensitive data outside the web root.

A MediaWiki debug logfile as it is used for debugging also contains sensitive data. Make sure to always disallow access for non authorized persons and the public as explained, delete remains of such logfiles when they are not needed, and comment or clear the logfile lines in your.

Set DocumentRoot to /dev/null
A more secure option for the Apache Web Server is to set the  to an empty or non-existent directory, and then use   directives in the Apache configuration to expose only the scripts and directories that need to be web-accessible.

Loader scripts
A PHP-only solution that will work with any web server is to write a series of scripts that explicitly  to a specific directory and then require one or more source files. For example:

User security
Anyone able to edit the user-interface system messages in the MediaWiki: namespace can introduce arbitrary HTML and JavaScript code into page output. This includes wiki users who have the editinterface permission, as well as anyone with direct write access to the text table in the database.

HTML is disabled on many system messages, particularly those displayed at the login screen, so the risk of password-snarfing JavaScript should be minimal. Malicious code could still attempt to exploit browser vulnerabilities (install spyware, etc.), though, so, you should make sure that only trusted people can modify system messages.

Upload security

 * See also:

The main concern is: How do we prevent users from uploading malicious files?

File uploads are an optional feature of MediaWiki and are disabled by default. If you enable them, you also need to provide a directory in the web root which is writable by the web server user.

This has several implications for security:

If at all possible, make the directory writable only by the web server's account, don't make the directory world-writable.
 * The directory may have to be world-writable, or else owned by the web server's limited user account. On a multiuser system it may be possible for other local users to slip malicious files into your upload directory (see multiuser notes above).
 * While PHP's configuration sets a file size limit on individual uploads, MediaWiki doesn't set any limit on total uploads. A malicious (or overzealous) visitor could fill up a disk partition by uploading a lot of files.
 * Generated thumbnails and uploaded files held for overwrite confirmation may be kept in images/thumb and images/tmp without visible notice in the MediaWiki web interface. Keep an eye on their sizes as well.

The default configuration makes an attempt to limit the types of files which can be uploaded for safety:

(It has been proposed to remove this check, see T309787).
 * By default, file extensions .png, .gif, .jpg, .jpeg and webp are white listed.
 * Various executable and script extensions are explicitly blacklisted even if you allow users to override the whitelist.
 * Several known image file extensions have their types verified using PHP's function.
 * Uploaded files are checked to see if they could trip file type detection bugs in Internet Explorer and Safari which might cause them to display as HTML.

As a precaution, you should explicitly disable server-side execution of PHP scripts (and any other scripting types you may have) in the uploads directory (by default, ). You should also instruct browsers to not "sniff" files by setting a  header.

For instance, an Apache .conf file fragment to do this if your MediaWiki instance is in /Library/MediaWiki/web might look something like:

If you don't have access to apache configuration files, but you can use .htaccess files to override configuration settings on specific directories, you can put an .htaccess file on the upload directory that looks like this:

Your exact configuration may vary. In particular, the use of options may complicate handling of uploads.

If you use any of the above solution, you can check whether it's really working with this simple test.


 * Create a 'test.php' file in the upload directory.
 * Put  in the file.
 * Visit the file path in a web browser. If you see just the text of the file you are good, otherwise something is wrong somewhere.

 Disable PHP solution for Nginx:  http://serverfault.com/a/585559/162909

For best security, you should also consider using a separate domain for uploaded files. For full security it is best to have uploads served from an entirely separate domain, not a subdomain, but even a subdomain will provide additional security. This is especially important if you allow uploading SVG files since that file format is so similar to HTML. MediaWiki checks SVG uploads for security, but it is best to have multiple layers of defense. See for configuring a different domain to serve media files.

External programs

 * may be executed for edit conflict merging.
 * If ImageMagick support for thumbnails or SVG images is enabled,  may be run on uploaded files.
 * If enabled, Math extension will call  executable, which calls ,  , and   (which calls  ).