Manual:Security/id
- Jika Anda yakin telah menemukan masalah keamanan di MediaWiki atau di salah satu situs web Wikimedia, lihat Keamanan untuk informasi kontak sehingga kami dapat menyiapkan rilis perbaikan bug.
Tetap terkini
Langkah keamanan terpenting yang dapat Anda lakukan adalah selalu memperbarui perangkat lunak Anda. Baik MediaWiki maupun perangkat lunak yang menjadi dasarnya terkadang akan menghasilkan versi baru yang memperbaiki kerentanan keamanan yang baru ditemukan yang mungkin memengaruhi Anda.
Pengembang MediaWiki sangat menyarankan agar siapa pun yang menjalankan MediaWiki berlangganan milis mediawiki-announce. Ini adalah daftar dengan lalu lintas rendah yang hanya mengirimkan pengumuman versi baru.
Sesuai dengan siklus hidup versi MediaWiki, setiap rilis akan menerima pembaruan keamanan selama satu tahun. Rilisan lama mungkin mengandung celah keamanan yang diketahui tetapi belum ditambal.
Jangan lupa untuk terus mengikuti pembaruan pada Apache, PHP, MySQL/MariaDB, dan perangkat lunak lainnya yang berjalan di server Anda – baik sistem operasi maupun aplikasi web lainnya.
Berhati-hatilah dengan ekstensi yang Anda gunakan
Ada berbagai macam ekstensi yang tersedia untuk MediaWiki. Sayangnya, ekstensi-ekstensi ini juga memiliki berbagai macam tingkat kualitas. Menggunakan ekstensi berkualitas rendah dengan MediaWiki merupakan salah satu penyebab paling umum masalah keamanan untuk MediaWiki.
Sebelum memutuskan untuk menggunakan ekstensi, Anda harus melakukan penelitian dasar tentang ekstensi tersebut. Ekstensi yang dibuat oleh anggota terkemuka komunitas pengembang MediaWiki biasanya cukup aman. Demikian pula setiap ekstensi yang digunakan pada wiki yang dikelola oleh Wikimedia Foundation mungkin telah diteliti secara cermat, dan mungkin aman (Tentu saja tidak ada jaminan). Namun jika Anda menemukan suatu ekstensi beredar di GitHub yang belum tersentuh selama bertahun-tahun dan dikembangkan oleh seseorang dengan sedikit pengalaman dalam pengembangan web, mungkin itu berisiko cukup tinggi.
Pada akhirnya, Anda harus mengevaluasi risiko keamanan dalam menginstal ekstensi dengan cara yang sama seperti Anda mengevaluasi risiko keamanan dalam menginstal perangkat lunak lainnya.
Ekstensi juga perlu terus diperbarui seperti perangkat lunak lainnya. Ekstensi yang dibundel dengan MediaWiki memiliki pengumuman keamanan yang dibuat di milis mediawiki-announce, tetapi ekstensi lainnya tidak. Beberapa, tetapi tentu saja tidak semua ekstensi mengumumkan masalah keamanan di milis mediawiki-l.
Izin berkas
Hal lain yang sangat penting yang harus Anda lakukan untuk mengamankan instalasi MediaWiki Anda: Pastikan pengguna yang menjalankan php tidak memiliki akses tulis ke file atau direktori yang dapat diakses web di mana php diaktifkan untuk dijalankan.
Pada sistem berbasis Debian, ini berarti pengguna www-data
tidak boleh memiliki berkas php.
Pada sistem mirip unix, Anda dapat melakukannya dengan memastikan bahwa direktori/file mediawiki dimiliki oleh orang lain selain pengguna server web Anda (www-data) atau pengguna server mysql.
Bergantung pada bagaimana Anda memasang MediaWiki, hal ini mungkin sudah terjadi, tetapi jika tidak, dapat dilakukan dengan melakukan chown -R <usernamehere> /path/to/MediaWiki/
, di mana nama pengguna adalah pengguna selain pengguna webserver atau mysql (biasanya Anda akan menggunakan nama pengguna Anda sendiri asalkan mysql dan php tidak berjalan sebagai nama pengguna Anda).
Setelah melakukan langkah itu, Anda mungkin perlu mengubah pemilik direktori gambar kembali ke pengguna php, karena file yang diunggah perlu berada di sana, sehingga MediaWiki harus dapat menulis di sana (misalnya chown -R www-data /path/to/MediaWiki/images
).
Selanjutnya Anda menjalankan chmod -R go-w /path/to/MediaWiki
untuk menghapus akses tulis dari semua pengguna lain selain pemilik file. Setelah melakukan langkah tersebut, Anda mungkin perlu mengaktifkan kembali akses tulis ke direktori gambar.
Direktori tempat MediaWiki memerlukan akses penulisan (seperti $wgCacheDirectory
jika fitur tersebut diaktifkan) harus ditempatkan di luar root web.
Pengecualiannya adalah direktori gambar, yang harus berada di root web.
Namun, penting untuk menonaktifkan php di direktori gambar.
Rincian tentang cara melakukan ini bervariasi berdasarkan server web, tetapi pada apache terkadang dapat dilakukan dengan menggunakan php_flag engine off
dalam file .htaccess.
Jika Anda melakukannya melalui berkas konfigurasi dalam direktori gambar itu sendiri, Anda harus memastikan berkas konfigurasi tersebut tidak dapat ditulis oleh server web.
Lihat bagian di bawah tentang keamanan unggahan untuk keterangan lebih rinci.
Berkas LocalSettings.php Anda harus dapat dibaca oleh pengguna php, namun tidak boleh dapat dibaca oleh semua orang, untuk mencegah proses lain menemukan kata sandi basis data Anda dan informasi sensitif lainnya. Seperti semua berkas MediaWiki, pengguna php tidak boleh menulis ke LocalSettings.php.
Setelah mengubah izin, Anda mungkin perlu memulai ulang server web agar perubahan diterapkan.
Keamanan Lapisan Transportasi (TLS, HTTPS)
Untuk melindungi dari serangan gaya firesheep dan kebocoran privasi umum, disarankan untuk menghosting situs Anda menggunakan TLS (HTTPS). Panduan untuk menyiapkan TLS berada di luar cakupan dokumen ini, namun perlu dicatat bahwa ini jauh lebih murah sekarang karena letsencrypt.org menyediakan sertifikat gratis.
Jika Anda melakukan pengaturan TLS, penting untuk menguji situs Anda dengan ssllabs.com/ssltest/ untuk memastikan pengaturannya benar, karena sangat mudah untuk salah mengonfigurasi TLS.
Jika Anda mengaktifkan TLS, Anda mungkin juga ingin mengonfigurasi server web Anda untuk mengirim header strict-transport-security
.
Hal ini akan meningkatkan keamanan situs web Anda terhadap penyadap, tetapi memiliki kekurangan yaitu Anda tidak dapat memutuskan untuk berhenti menggunakan TLS selama jangka waktu tertentu.
Rekomendasi umum PHP
- Silakan merujuk ke OWASP Lembar Cheat Keamanan PHP
Saran ini berlaku untuk semua lingkungan PHP, dan belum tentu khusus untuk MediaWiki.
Rekomendasi konfigurasi PHP, untuk php.ini atau yang ditetapkan sebaliknya:
- Kecuali Anda memerlukannya secara khusus, nonaktifkan
allow_url_fopen
.- Kerentanan eksekusi kode PHP jarak jauh mungkin bergantung pada kemampuan memasukkan URL ke dalam
include()
ataurequire()
. Jika Anda tidak memerlukan penggunaan pemuatan file jarak jauh, menonaktifkannya dapat mencegah serangan semacam ini pada kode yang rentan. - MediaWiki mungkin mengharuskan pengaturan ini untuk ekstensi pencarian Lucene, ekstensi pemanen OAI, ekstensi TitleBlacklist, dan penggunaan tertentu Special:Import dalam 1.5. Namun, pengaturan ini tidak diperlukan dalam instalasi umum.
- MediaWiki seharusnya aman meskipun ini diaktifkan; menonaktifkan ini merupakan tindakan pencegahan terhadap kemungkinan kerentanan yang tidak diketahui.
- Kerentanan eksekusi kode PHP jarak jauh mungkin bergantung pada kemampuan memasukkan URL ke dalam
- Nonaktifkan
session.use_trans_sid
.- Jika ini aktif, ID sesi terkadang dapat ditambahkan ke URL jika kuki tidak berfungsi sebagaimana mestinya. Hal itu dapat membocorkan data sesi login ke situs pihak ketiga melalui data rujukan atau pemotongan dan penempelan tautan.
- Anda harus selalu mematikannya jika sedang menyala.
Misalnya jika Anda melihat baris ini di php.ini:
allow_url_fopen = On
Ubahlah menjadi:
allow_url_fopen = Off
Alternatifnya, Anda dapat menambahkan perintah apache ini untuk menonaktifkan allow_url_fopen
pada tiap direktori:
php_flag allow_url_fopen off
Kemudian mulai ulang Apache untuk memuat ulang perubahan sebesar apachectl reload
atau rcapache2 reload
(SuSE).
Pada sistem multipengguna dengan PHP terinstal sebagai modul Apache, semua skrip pengguna akan berjalan di bawah akun pengguna dengan hak istimewa yang dikurangi yang sama. Ini dapat memberikan pengguna lain akses untuk membaca berkas konfigurasi Anda (termasuk kata sandi basis data), membaca dan mengubah data sesi login Anda, atau menulis berkas ke direktori unggahan Anda (jika diaktifkan).
Untuk keamanan multipengguna, pertimbangkan untuk menggunakan konfigurasi CGI/FastCGI di mana setiap skrip pengguna berjalan di bawah akun mereka sendiri.
Rekomendasi umum MySQL dan MariaDB
Secara umum, Anda harus menjaga akses ke basis data MySQL atau MariaDB seminimal mungkin. Jika hanya akan digunakan dari satu mesin tempat server tersebut berjalan, pertimbangkan untuk menonaktifkan dukungan jaringan, atau mengaktifkan akses jaringan lokal saja (melalui perangkat loopback, lihat di bawah), sehingga server hanya dapat berkomunikasi dengan klien lokal melalui soket domain Unix.
Jika akan digunakan melalui jaringan dengan jumlah mesin klien yang terbatas, pertimbangkan untuk menetapkan aturan firewall IP agar menerima akses ke port TCP 3306 (port MySQL/MariaDB) hanya dari mesin tersebut atau hanya dari subnet lokal, dan menolak semua akses dari internet yang lebih luas. Hal ini dapat membantu mencegah pembukaan akses ke server Anda secara tidak sengaja yang disebabkan oleh beberapa kelemahan yang tidak diketahui di server basis data, GRANT yang salah ditetapkan terlalu luas, atau kata sandi yang bocor.
Jika Anda membuat pengguna MySQL/MariaDB baru untuk MediaWiki melalui penginstal MediaWiki, akses yang cukup bebas diberikan untuk memastikan bahwa ia akan berfungsi dari server kedua maupun server lokal. Anda dapat mempertimbangkan untuk mempersempitnya secara manual atau membuat akun pengguna sendiri dengan izin khusus hanya dari tempat yang Anda perlukan. Pengguna basis data hanya perlu memiliki izin SELECT, INSERT, UPDATE dan DELETE untuk basis data.
Khususnya, hak istimewa FILE merupakan penyebab umum masalah keamanan. Anda harus memastikan bahwa pengguna MySQL/MariaDB tidak memiliki hak istimewa ini atau hak istimewa "administrasi server" lainnya.
Perhatikan bahwa tabel user
dalam basis data MediaWiki berisi kata sandi pengguna yang di-hash dan mungkin berisi alamat surel pengguna, dan secara umum harus dianggap sebagai data pribadi.
Skrip pemeliharaan
Untuk skrip pemeliharaan, Anda mungkin ingin membuat pengguna DB-admin dengan lebih banyak hak. Untuk melakukan ini, tetapkan variabel berikut dengan kredensial basis data akun tersebut:
Lihat Manual:Maintenance scripts#Configuration untuk detail tentang hak MySQL/MariaDB yang diperlukan.
Pemutakhiran MediaWiki
Selama pemutakhiran, hak MySQL/MariaDB lainnya mungkin diperlukan.
Lebih lanjut tentang MySQL dan MariaDB
- mysql command-line options
--skip-networking
. - Menetapkan
bind-address=127.0.0.1
di my.ini Anda (di bawah bagian[mysqld]
) akan menyebabkan MySQL/MariaDB hanya mendengarkan antarmuka loopback. Ini adalah pengaturan default dalam instalasi EasyPHP untuk Windows. (Jika Anda menggunakan MySQL/MariaDB pada komputer Unix, pengaturannya mungkinskip-networking
dalam file my.cnf.) - Sintaks GRANT dan REVOKE
Jika basis data MySQL atau MariaDB bocor
Jika basis data telah bocor ke publik, dalam LocalSettings.php:
- Ubah $wgDBpassword jika itu juga bocor
- Ubah beberapa huruf di $wgSecretKey
- Tetapkan
$wgAuthenticationTokenVersion
ke nilai yang tidak dapat diprediksi untuk memastikan bahwa nilaiuser_token
dalam basis data Anda tidak dapat digunakan untuk meniru pengguna Anda
Jika LocalSettings.php bocor
Jika LocalSettings.php telah bocor ke publik, lindungi kembali dan:
- Ubah $wgDBpassword
- Ganti $wgSecretKey dengan rangkaian huruf dan angka acak yang berbeda
- Buat $wgSpamRegex yang berbeda (opsional)
- Setel ulang kolom
user_token
di tabeluser
Anda sehingga tidak dapat digunakan untuk meniru pengguna mana pun
Kata sandi basis data
Lihat Manual:Securing database passwords untuk beberapa tindakan pencegahan yang mungkin ingin Anda ambil untuk mengurangi risiko kata sandi MySQL/MariaDB ditampilkan di web.
Tata letak berkas alternatif
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 include_path
set in your LocalSettings.php
. Experiment with this as desired.
If working to improve security, keep in mind that WebStart.php
uses the current directory as a base. This means that only setting your include_path
may not help to improve the security of your installation.
Move sensitive information
Consider moving the database password or other potentially sensitive data from LocalSettings.php
to another file located outside of the web document root, and including that file from LocalSettings.php
(through include()
).
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 LocalSettings.php
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, LocalSettings.php~
.
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 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
Set DocumentRoot to /dev/null
A more secure option for the Apache Web Server is to set the DocumentRoot
to an empty or non-existent directory, and then use Alias
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 chdir()
to a specific directory and then require one or more source files. For example:
<?php
chdir('/path/to/wiki');
require('./index.php');
User security
Anyone able to edit the user-interface certain system messages in the MediaWiki: namespace can introduce arbitrary JavaScript and CSS code into page output.
This includes wiki users who have the editsitejs
/editsitecss
permissions, as well as anyone with direct write access to the text
table in the database.
These are mostly disabled 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: Manual:Configuring file uploads/id
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:
- 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).
If at all possible, make the directory writable only by the web server's account, don't make the directory world-writable.
- 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:
- By default, file extensions .png, .gif, .jpg, .jpeg and webp are white listed ($wgFileExtensions ).
- Various executable and script extensions are explicitly prohibited ($wgProhibitedFileExtensions ) even if you allow users to override the allowlist ($wgStrictFileExtensions ).
- Several known image file extensions have their types verified using PHP's getimagesize() 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.
(It has been proposed to remove this check, see T309787).
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, images
).
You should also instruct browsers to not "sniff" files by setting a X-Content-Type-Options: nosniff
header.
For instance, an Apache .conf file fragment to do this if your MediaWiki instance is in /Library/MediaWiki/web might look something like:
<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>
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:
# 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.
Your exact configuration may vary. In particular, the use of open_basedir 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
<?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.
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 $wgUploadPath for configuring a different domain to serve media files.
External programs
/usr/bin/diff3
may be executed for edit conflict merging.- If ImageMagick support for thumbnails or SVG images is enabled,
convert
may be run on uploaded files. - This list is incomplete.
You can use Shellbox to provide a more locked-down running environment for external commands.
Lihat pula
- Umum
- Planning/Requirements gathering
- User authorization
- AuthManager – describes plug-in architecture for determining user identity
- Manual:$wgAuthManagerConfig – configuration variable used by plug-in architecture
- Kategori:Otentikasi dan login – authorization extensions available
- Manual:Resetting passwords – reseting a MediaWiki user's password
- Monitoring user activity
- Assignment of access rights by IP, user identity
- FAQ/Initial user was not created by installer
- FAQ/Anti-spam
- Manual:Hak pengguna – describes configuration of the default MediaWiki rights architecture
- Manual:Mencegah akses – various tips and how-to guides
- Manual:Image authorization – IP/user-based restrictions on access to images
- Security issues with authorization extensions
- Category:User rights extensions – extensions that assist in user rights management
- Extension:Lockdown
- Configuration variables: $wgGroupPermissions , $wgAddGroups , $wgRemoveGroups , $wgImplicitGroups
- Security-enhanced MediaWiki versions/sample installations
- Security alerts
- Keamanan – how to report problems, receive notifications
- Category:Extensions with security vulnerabilities
- ModSecurity
- Technical details
- database schema: Manual:User groups table , Manual:User table , Manual:Revision table , Manual:Recentchanges table
- hooks: UserLoginComplete , UserLogout , UserLogoutComplete , UserEffectiveGroups , UserGetRights
- code: User.php
- Manual:Halaman khusus – instructions for designing access rights-aware special pages.
- Open Web Application Security Project (OWASP)
- Web Application Security - Modsecurity Rules (WAS)
- Security for developers – for developers