Kézikönyv:Biztonság
- Ha úgy gondolod, hogy a MediaWiki-ben vagy a Wikimédia bármely oldalán biztonsági problémát találtál, vedd fel velünk a kapcsolatot (lásd: Security ) hogy hibajavítást adhassunk ki.
Maradj naprakész
A legfontosabb biztonsági szempont a szoftver naprakészen tartása. Mind a MediaWiki, mind azon szoftverek amelyektől függ, időnként frissülhetnek, amely új kiadások biztonsági foltokat is tartalmaznak.
A MediaWiki fejlesztői erősen ajánlják, hogy a szoftvert használók iratkozzanak fel a mediawiki-announce levelezőlistára. Ez egy alacsony forgalmú lista, ahol az új verziókat jelentik be.
A MediaWiki élettartam-ciklusával összhangban minden kiadáshoz egy éven át érkeznek biztonsági frissítések. A régebbi kiadásokban ismert, de javítatlan biztonsági rések lehetnek.
Ne feledkezz meg az Apache, PHP, MySQL/MariaDB és más, a szervereden futó szoftverek, az operációs rendszer és a webapplikációk frissítéséről sem.
Számos, a MediaWiki 1.3.x kiadását futtató felhasználót érintett a 2004 telén terjedő PHP-féreg, amely más, nem frissített phpBB-oldalakon jutott be a szerverre, ahol az írható PHP-fájlokba, köztük a MediaWiki 1.3 lefordított sablonjaiba is „you are hacked” („oldalad feltörve”) üzenetet helyezett el.
Légy óvatos a használt kiterjesztésekkel
Számos kiterjesztés érhető el a MediaWikihez, azonban ezek változó minőségűek. Az alacsony minőségű kiterjesztések használata a biztonsági hibák egyik leggyakoribb forrása.
Egy kiterjesztés használata előtt járj utána annak. A MediaWiki fejlesztői közösség ismert tagjai által készített eszközök általában biztonságosak. Ugyanez igaz a Wikimédia Alapítvány oldalain telepített kiterjesztésekre is (természetesen erre sincs garancia). Ha egy több éve nem frissített, kevés tapasztalattal rendelkező személy által készített kiterjesztést találsz GitHubon, akkor az magas biztonsági kockázatot rejthet magában.
A nap végén vedd fontolóra a telepítéssel járó biztonsági kockázatot a más szoftvereknél megszokott módon.
A kiterjesztéseket is szükséges naprakészen tartani; a MediaWiki-szoftverrel együtt érkező bővítményekkel kapcsolatos bejelentések a mediawiki-announce levelezőlistán olvashatóak, azonban a többinél ez a lehetőség nem áll fenn. Néhány külső kiterjesztés készítője a biztonsági hibákat közzéteszi a mediawiki-l levelezőlistán.
Fájlengedélyek
Az egyik legfontosabb biztonsági tényező az, hogy a PHP- (Debian esetén gyakran www-data) és a MySQL-futtató felhasználónak ne legyen a PHP engedélyezésekor nyilvánosan hozzáférhető mappákhoz írási joga.
On Debian-based systems this means the www-data
user should not own the php files.
Unix-szerű rendszereken ehhez a MediaWiki-könyvtár tulajdonosa a webszerver- (www-data) vagy a MySQL-felhasználótól eltérő kell, hogy legyen.
A telepítés módjától függően ez lehet alapértelmezés is; ha nem, a $code1 segítségével hajtható végre a művelet, ahol a felhasználónév az előbbiektől eltérő (valószínűleg a mysql és a php nem saját neved alatt fut).
Ezen lépés után szükséges lehet a képek könyvtára jogosultságának visszaállítása a PHP-felhasználóra, mivel a feltöltéshez a MediaWikinek írási jogra van szüksége (például chown -R www-data /path/to/MediaWiki/images
).
Végül futtasd a chmod -R go-w /path/to/MediaWiki
parancsot, így a tulajdonosokon kívül másnak nem lesz írási joga; ezután szükséges lehet a képek mappáján az előzőekben leírtak elvégzésére.
Azon mappák, amelyekhez a szoftvernek írási jogra van szüksége (például $wgCacheDirectory), a gyökérkönyvtáron kívül helyezkedjenek el.
Ez alól a képek könyvtára kivétel, amelynek a gyökérben kell lennie.
Fontos viszont, hogy a képek mappában tiltsd le a PHP-t.
A részletek a szervertől függenek, de Apache alatt általában a .htaccess fájlban elhelyezett php_flag engine off
a kívánt viselkedést hozza.
Ha a beállítást magán a könyvtáron belül végzed el, győződj meg róla, hogy a konfigurációs fájl nem írható a webszerver által.
A feltöltések biztonságáért lásd a vonatkozó szakaszt.
A LocalSettings.php fájl a PHP-felhasználó által olvasható kell, hogy legyen, azonban az adatbázis-jelszó és más érzékeny információk elrejtéséhez ne legyen írható. A többi MediaWiki-fájlhoz hasonlóan a LocalSettings.php-hoz se legyen a PHP-felhasználónak írási joga.
Transport Layer Security (TLS, HTTPS)
A Firesheep-stílusú támadások és az általános adatszivárgások elleni védelemként javasolt a TLS (HTTPS) használata. Ennek beállítása kívül esik ezen útmutató témáján, annyit viszont érdemes megjegyezni, hogy a letsencrypt.org ingyenes tanúsítványokat kínál.
A TLS beállítása esetén fontos az ssllabs.com/ssltest/ oldalon való tesztelés, mivel a rendszer könnyen félrekonfigurálható.
Ha engedélyezed a TLS-t, érdemes beállítani a webszerveren a strict-transport-security
-fejléc küldését, amely erősíti a védelmet az adatlopások ellen, viszont ekkor nem dönthetsz úgy, hogy egy időre kikapcsolod a TLS-t.
This will improve the security of your website against eavesdroppers quite a bit, but at the drawback that it means you cannot decide to stop using TLS for a set period of time.
Általános PHP-javaslatok
- További információkért lásd az OWASP PHP-biztonsági útmutatóját.
Ezek a tanácsok nemcsak a MediaWiki, de bármely PHP-környezet esetén megfontolandóak.
Javasolt beállítások a php.ini fájlban vagy máshol való konfigurációhoz:
- A
allow_url_fopen
letiltása (kivéve ha szükséged van rá).- A távoli PHP-kódok futtatásával kapcsolatos kockázatok attól függenek, hogy a kártékony kódot sikerül-e
include()
vagyrequire()
funkcióba burkolni. Ha nem használod a távoli fájlbetöltést, akkor ennek kikapcsolásával megelőzhetőek az ilyen típusú támadások. - A MediaWiki esetében a Lucene keresési kiterjesztés, az OAI értelmezőbővítmény, a TitleBlacklist, illetve az 1.5 verzióban a Special:Import egyes funkciói igénylik ennek bekapcsolását, azonban tipikus telepítés esetén erre nincs szükség.
- A MediaWiki a beállítás On értéke esetén is biztonságos; a kikapcsolás elővigyázatosság a nem ismert fenyegetések ellen.
- A távoli PHP-kódok futtatásával kapcsolatos kockázatok attól függenek, hogy a kártékony kódot sikerül-e
A session.use_trans_sid
kikapcsolása.
A beállítás bekapcsolásával a sütik helytelen működése esetén a munkamenet-azonosítók megjelenhetnek az URL-ben, ezzel harmadik felek ajánlóadatokkal vagy másolás-beillesztéssel megszerezhetik ezeket.
- Ezt mindig kapcsold ki.
Például ha a következőt látod a php.iniben:
allow_url_fopen = On
változtasd meg a következőre:
allow_url_fopen = Off
Alternatívaként a könyvtáralapú engedélyezéshez használhatod a allow_url_fopen
Apache-direktívát:
php_flag allow_url_fopen off
Ezután indítsd újra az Apache-ot a változtatások újratöltéséhez (apachectl reload
vagy rcapache2 reload
(SUSE)).
Többfelhasználós rendszer esetén, ha a PHP Apache-modulként lett telepítve, minden felhasználói szkript ugyanazon, csökkentett jogosultságú fiókon fut. Ezzel más felhasználók láthatják a konfigurációs állományokat (köztük az adatbázis-jelszavakat is), módosíthatják a bejelentkezési munkamenet adatait és ha engedélyezted, írhatják a feltöltési könyvtárat is. This may give other users access to read your configuration files (including database passwords), read and modify your login session data, or write files into your upload directory (if enabled).
Többfelhasználós rendszerek biztonságához fontold meg CGI/FastCGI-konfiguráció használatát, így minden szkript saját fiókon fog futni.
Általános MySQL- és MariaDB-javaslatok
Általánosságban érdemes az adatbázis elérhetőségét minimalizálni. A használat csak a futtató számítógépről történjen; érdemes letiltani a hálózati elérést, vagy csak helyi hálózatot használni (a loopback eszközön át, lásd alább), így a szerver a Unix domain socketjein keresztül csak a helyi kliensekkel tud kommunikálni.
Az adatbázist csak korlátozott kliensszámú hálózaton használd, és érdemes beállítani a tűzfalon, hogy a TCP 3306-os porton (az adatbázis portja) keresztül csak a megbízható gépekről fogadjon kéréseket, az internet felőlieket pedig utasítsa el. Ez segíthet megakadályozni, hogy egy ismeretlen adatbázis-hiba (rosszul beállított GRANT vagy kiszivárgott jelszó) miatt a szerver széles körben elérhetővé váljon.
Ha a MySQL/MariaDB-felhasználót a MediaWiki telepítőjével hozod létre, egy második szerverről való elérhetőség érdekében lazább szabályok lesznek érvényben. Fontold meg ezek szigorítását, vagy győződj meg róla, hogy a felhasználó csak a szükséges helyekről érhető el. Az adatbázis fióknak csak a SELECT, INSERT, UPDATE és DELETE jogosultságokra van szüksége.
A biztonsági problémák egy oka a FILE privilégium megléte; győződj meg róla, hogy az adatbázis-felhasználó nem rendelkezik sem ezzel, sem más adminisztrációs jogosultságokkal.
Vedd figyelembe, hogy az adatbázis user
táblájában a jelszavak hash-értéke, illetve néha e-mail-címek is megtalálhatóak, így ezeket személyes adatként kell kezelni.
Karbantartószkriptek
A Special:MyLanguage/Manual:Maintenance scripts használatához érdemes egy adatbázis-adminisztrátori fiókot létrehozni. Ehhez a következő változók beállítása szükséges:
A szükséges MySQL/MariaDB-jogosultságokhoz lásd a Kézikönyv:Karbantartószkriptek#Konfiguráció szakaszt.
A MediaWiki frissítése
A frissítés során több MySQL/MariaDB-jogosultságra lehet szükség.
A MySQL-ről és a MariaDB-ről bővebben
- mysql command-line options
--skip-networking
. - A
bind-address=127.0.0.1
my.ini-ben történő beállításával ([mysqld]
szakasz) az adatbázis csak a loopback interfész felől érkező kérésekre reagál; ez a Windows alatti EasyPHP-konfiguráció alapértelmezése. (Ha a MySQL/MariaDB Unix alatt lett telepítve, a beállítás lehet, hogy a $cnf állományban található $skip-net néven.) This is the default in the EasyPHP install for Windows. (If you are using MySQL/MariaDB on a Unix machine, the setting may beskip-networking
instead in the my.cnf file.) - GRANT- és REVOKE-szintaxis
Ha az adatbázis kiszivárgott
Ha az adatbázis kiszivárgott, a LocalSettings.php-ban:
- Változtasd meg a $wgDBpassword -öt annak kiszivárgása esetén
- Változtass meg néhány betűt a $wgSecretKey -ben
- Nullázd a
user_token
oszlopot auser
táblában, így ezekkel nem követhetőek vissza felhasználóid.
Ha a LocalSettings.php kiszivárgott
Ha a LocalSettings.php kiszivárgott, gondoskodj a védelméről és:
- Változtasd meg a $wgDBpassword -öt
- Cseréld le a $wgSecretKey értékét véletlenszerű, betűkből és számokból álló sztringre
- Készíts új $wgSpamRegex -et (opcionális)
- Nullázd a
user_token
oszlopot auser
táblában, így ezekkel nem követhetőek vissza felhasználóid.
Adatbázis-jelszavak
Lásd a Manual:Securing database passwords lapot a fontolóra veendő elővigyázatossági lépésekről, hogy elkerüld a MySQL/MariaDB-jelszavak interneten való megjelenését.
Alternatív fájlelrendezés
A MediaWiki úgy lett tervezve, hogy kicsomagolás után helyben fusson. Ez kényelmes, azonban csökkentett biztonsághoz és fájlduplikációkhoz vezethet.
A fájlduplikációkat az állományok elhelyezésével lehet megszüntetni.
Az includes és skin fájlok átmozgatása különös elővigyázatosságot igényel; a műveletekhez szükséges a LocalSettings.php
-ban található include_path
megváltoztatása. Ez csak tapasztalt felhasználóknak ajánlott.
A biztonság növelésekor vedd figyelembe, hogy a WebStart.php
az aktuális könyvtárat használja, így az include_path
beállítása esetleg nincs hatással a biztonságra.
Érzékeny adatok mozgatása
Vedd fontolóra az adatbázis-jelszó és más érzékeny adat átmozgatását a LocalSettings.php
-ból más, a gyökérkönyvtáron kívüli helyre, majd erre az include()
segítségével hivatkozz a LocalSettings.php
-ban.
Ezzel megbizonyosodhatsz arról, hogy egy esetleges webszerver-hiba miatti PHP-leállás esetén nem jelenik meg az adatbázis jelszava a szövegesen megjelenő állományban.
Ehhez hasonlóan a LocalSettings.php
szerkesztése biztonsági mentést hagy a módosított kiterjesztéssel, így az egyszerű szövegfájlként lesz elérhető (például LocalSettings.php~
).
Ha ilyen szerkesztőt használsz, tiltsd le a biztonsági mentést vagy az érzékeny adatokat ne a gyökérkönyvtárban tárold.
A MediaWiki hibakeresési naplói szintén tartalmazhatnak érzékeny részeket.
Győződj meg róla, hogy illetéktelenek és a nyilvánosság nem férhet hozzá ilyen állományokhoz, valamint töröld a naplófájlokat, ha már nincs rájuk szükséged, a LocalSettings.php
-ban pedig a vonatkozó sorokat tedd megjegyzésbe vagy töröld.
/**
* 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
A DocumentRoot /dev/null-ra állítása
Az Apache-szerver biztonságosabbá tételéhez a DocumentRoot
egy üres vagy nem létező könyvtárra mutasson, majd az Alias
-direktivákkal csak azon szkriptek és mappák látszódjanak amelyeknek kívülről elérhetőnek kell lenniük.
Betöltőszkriptek
A bármely webszerverrel működő PHP-alapú megoldáshoz egy specifikus könyvtárra mutató chdir()
-szkriptsorozatot kell létrehozni, amely egy vagy több forrásfájlt igényel, például:
<?php
chdir('/path/to/wiki');
require('./index.php');
Felhasználói biztonság
Mindenki, aki módosíthatja a MediaWiki rendszerüzeneteit, HTML- és JavaScript-kódot helyezhet el a lapok kimenetén; ezek az editinterface jogosultsággal rendelkezők és bárki, aki írási joggal rendelkezik az adatbázis szövegtáblájához.
This includes wiki users who have the editinterface
permission, as well as anyone with direct write access to the text
table in the database.
A HTML számos rendszerüzenetben tiltva van, főképp a bejelentkezés során megjelenő lapokon, így a JavaScript-alapú jelszólopás valószínűsége minimális. Továbbra is előfordulhat kártékony kód beillesztése a böngészők biztonsági résein át (például kémprogramok telepítésével), így csak megbízható emberek kapjanak interfész-szerkesztői jogot.
Feltöltési biztonság
- Lásd még: Manual:Configuring file uploads
A fő kérdés: Hogyan akadályozhatjuk meg kártékony állományok feltöltését?
A fájlfeltöltés a MediaWiki opcionális eleme, és alapértelmezésben le van tiltva; ha engedélyezed, szükséges a webszerver által írható tárolómappa létrehozása.
Ennek számos biztonsági következménye van:
- A feltöltési könyvtár bárki által-, vagy csak a webszerver felhasználója által írható is lehet. Többfelhasználós rendszereken ez lehetőséget ad kártékony állományok elhelyezésére (lásd a vonatkozó információkat fentebb). Ha lehetséges, a mappa csak a webszerver által legyen írható.
- Míg a PHP-konfiguráció korlátozza a feltölthető méretet, a MediaWikiben nincs ilyen kontroll; egy kártékony célú vagy túlbuzgó felhasználó így egy a teljes partíciót megtelítheti.
- A generált bélyegképek és a felülírás esetére tárolt feltöltött fájlok az images/thumb és az images/tmp könyvtárakban lehetnek, és ennek a MediaWiki felületén nincs látható nyoma. Tartsd szemmel ezek méretét is.
A szoftver alapértelmezésben próbálja a kártékony fájlokat visszaszorítani:
- Alapértelmezésben a .png, .gif, .jpg és .jpeg kiterjesztések találhatóak meg a fehérlistán ($wgFileExtensions ).
- Számos futtatható fájl és szkript eleve feketelistázva van ($FileBlacklist) még akkor is, ha a felhasználók felülírhatják a fehérlistát ($StrictFileExtensions).
- Több ismert képtípus kiterjesztésének ellenőrzése is a PHP $getimagesize funkciójával történik.
- A feltöltött fájloknál ellenőrzésre kerül, hogy előidézik-e az Internet Explorerben és a Safariban jelen lévő típusfelismerési hibát, minek következtében HTML-szövegként jelennek meg. (It has been proposed to remove this check, see T309787).
Elővigyázatosságból érdemes a PHP-szkriptek (és más, általad használt szkripttípus) szerveroldali futását letiltanod a feltöltési könyvtárban (alapértelmezésben $images).
You should also instruct browsers to not "sniff" files by setting a X-Content-Type-Options: nosniff
header.
Például ha a MediaWikit a /Library/MediaWiki/web könyvtárba telepítetted, akkor ez az Apache .conf fájljában a következőképp valósítható meg:
<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>
Ha nincs elérésed az Apache konfigurációs fájljaihoz, de használhatsz .htaccess állományokat a beállítások felülírásához bizonyos könyvtárakban, akkor a feltöltési mappában helyezd el a következő tartalmú .htaccess állományt:
# 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.
A te konfigurációd eltérhet, az open_basedir használata megnehezítheti a feltöltések kezelését.
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
<?php phpinfo();
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.
Megoldás Nginx esetén: http://serverfault.com/a/585559/162909
A legmagasabb fokú biztonsághoz a feltöltött állományokat külön domainen tárold. A teljes biztonsághoz ne külön aldomainen, hanem teljesen elkülönülő címen tárold a feltöltött fájlokat, habár előbbi is elég biztonságot nyújt. Ez akkor különösen fontos, ha engedélyezed az SVG-feltöltést, mivel ezek a HTML-hez hasonló fájlok. Ugyan a MediaWiki ellenőrzi a feltöltött SVG-ket, de sosem árt még egy védelmi réteg. Az eltérő domain beállításához lásd a $UploadPath lapot.
Külső programok
- A
/usr/bin/diff3
futtatható a szerkesztési ütközések eredményének összevonásához. - Ha az ImageMagick bélyegkép- vagy SVG-támogatása engedélyezett, a feltöltött fájlokon futtatható a
convert
. - A Math kiterjesztés engedélyezése esetén meghívja a
texvc
-t, amely ugyanezt teszi alatex
,dvips
ésconvert
funkciókkal (utóbbi ags
-t hívja meg).
Lásd még
- Általánosságban
- Tervezés/Szükségletek begyűjtése
- Felhasználói azonosítás
- AuthManager - – leírja a felhasználók identitását meghatározó plug-in felépítését
- Kézikönyv:$wgAuthManagerConfig - – a plug-in felépítése által használt konfigurációs változó
- Kategória:Hitelesítés és bejelentkezés - – elérhető hitelesítési kiterjesztések
- Manual:Resetting passwords - – MediaWiki-felhasználók jelszavának visszaállítása
- A felhasználói tevékenység figyelése
- Jogosultságok megadása IP- vagy identitás alapján
- meta:Access control
- FAQ/Initial user was not created by installer
- FAQ/Anti-spam
- Manual:User rights - – az alapértelmezett MediaWiki-jogosultsági architektúra konfigurációjának leírása
- Manual:Preventing access - – tippek és útmutatók
- Manual:Image authorization - – IP/felhasználó alapú korlátozások a képekkel kapcsolatban
- Security issues with authorization extensions
- Category:User rights extensions - – a jogosultság-kezelésben segítő kiterjesztések
- Kiterjesztés:Lockdown
- Konfigurációs változók: $wgGroupPermissions , $wgAddGroups , $wgRemoveGroups , $wgImplicitGroups
- Fokozott biztonságú MediaWiki-verziók/mintakonfigurációk
- Biztonsági figyelmeztetések
- Security - – hibajelentések módja, értesítések kérése
- Template:Security alert
- Sablon:XSS figyelmeztetés
- Category:Extensions with XSS vulnerabilities
- ModSecurity
- Technikai részletek
- database schema: Manual:User groups table , Manual:User table , Manual:Revision table , Manual:Recentchanges table
- hooks: UserLoginComplete , UserLogout , UserLogoutComplete , UserEffectiveGroups , UserGetRights
- code: User.php
- Kézikönyv:Speciális lapok - – jogosultságfüggő speciális lapok létrehozása.
- Nyílt Webes Applikációk Biztonsági Projektje (OWASP)
- Webapplikációk biztonsága – Szabályok (WAS)
- Security for developers - fejlesztőknek