Salah satu praktik terbaik keamanan paling umum akhir-akhir ini tampaknya memindahkan wp-config.php
satu direktori lebih tinggi daripada root dokumen vhost . Saya tidak pernah benar-benar menemukan penjelasan yang baik untuk itu, tetapi saya berasumsi itu untuk meminimalkan risiko skrip berbahaya atau terinfeksi dalam webroot dari membaca kata sandi basis data.
Tapi, Anda masih harus membiarkan WordPress mengaksesnya, jadi Anda perlu memperluas open_basedir
untuk memasukkan direktori di atas root dokumen. Bukankah itu hanya mengalahkan seluruh tujuan, dan juga berpotensi mengekspos log server, cadangan, dll untuk penyerang?
Atau teknik ini hanya mencoba untuk mencegah situasi di mana wp-config.php
akan ditampilkan sebagai teks biasa kepada siapa pun yang meminta http://example.com/wp-config.php
, alih-alih diurai oleh mesin PHP? Itu tampak seperti kejadian yang sangat langka, dan itu tidak akan melebihi kerugian dari mengekspos log / backup / etc untuk permintaan HTTP.
Mungkin dimungkinkan untuk memindahkannya di luar root dokumen di beberapa pengaturan hosting tanpa mengekspos file lain, tetapi tidak pada pengaturan lainnya?
Kesimpulan: Setelah banyak bolak-balik tentang masalah ini, muncul dua jawaban yang menurut saya harus dianggap sebagai yang berwibawa. Aaron Adams membuat kasus yang baik dalam mendukung wp-config, dan chrisguitarguymakes kasus yang bagus untuk menentangnya . Itulah dua jawaban yang harus Anda baca jika Anda baru di utas dan tidak ingin membaca semuanya. Jawaban lainnya adalah redundan atau tidak akurat.
sumber
Jawaban:
Jawaban singkat: ya
Jawaban untuk pertanyaan ini adalah ya tegas , dan mengatakan sebaliknya sepenuhnya tidak bertanggung jawab .
Jawaban panjang: contoh dunia nyata
Izinkan saya untuk memberikan contoh yang sangat nyata, dari server saya yang sangat nyata, di mana pindah ke
wp-config.php
luar root web secara khusus mencegah kontennya ditangkap .Serangga:
Lihatlah deskripsi bug di Plesk ini (diperbaiki pada 11.0.9 MU # 27):
Kedengarannya tidak berbahaya, bukan?
Nah, inilah yang saya lakukan untuk memicu bug ini:
site.staging.server.com
untuksite-staging.ssl.server.com
).Ketika saya melakukan ini, Plesk mereset subdomain ke default: menyajikan konten
~/httpdocs/
, tanpa penerjemah (mis. PHP) aktif.Dan saya tidak menyadarinya. Selama berminggu-minggu.
Hasil:
wp-config.php
di root web, permintaan untuk/wp-config.php
mengunduh file konfigurasi WordPress.wp-config.php
luar root web, permintaan untuk/wp-config.php
mengunduh file yang sama sekali tidak berbahaya. File asliwp-config.php
tidak dapat diunduh.Jadi, jelas bahwa pindah ke
wp-config.php
luar root web memiliki manfaat keamanan yang bonafid di dunia nyata .Cara pindah
wp-config.php
ke lokasi mana pun di server AndaWordPress akan secara otomatis mencari satu direktori di atas instalasi WordPress Anda untuk
wp-config.php
file Anda , jadi jika Anda memindahkannya, Anda sudah selesai!Tetapi bagaimana jika Anda memindahkannya ke tempat lain? Mudah. Buat yang baru
wp-config.php
di direktori WordPress dengan kode berikut:(Pastikan untuk mengubah jalur di atas ke jalur sebenarnya dari
wp-config.php
file yang Anda pindahkan .)Jika Anda mengalami masalah dengan
open_basedir
, tambahkan saja jalur baru keopen_basedir
arahan dalam konfigurasi PHP Anda:Itu dia!
Memilih argumen yang bertentangan
Setiap argumen yang menentang pindah ke
wp-config.php
luar root web bergantung pada asumsi yang salah.Argumen 1: Jika PHP dinonaktifkan, mereka sudah masuk
FALSE : Skenario yang saya jelaskan di atas adalah hasil dari kesalahan konfigurasi, bukan intrusi.
Argumen 2: Menonaktifkan PHP secara tidak sengaja jarang terjadi, dan karenanya tidak signifikan
SALAH : Skenario yang saya jelaskan di atas adalah hasil dari bug di bagian umum dari perangkat lunak server, yang mempengaruhi konfigurasi server umum. Ini hampir tidak "langka" (dan selain itu, keamanan berarti mengkhawatirkan skenario yang jarang terjadi).
WTF : Mengubah kata sandi setelah intrusi sangat membantu jika informasi sensitif diambil selama intrusi. Sungguh, apakah kita masih berpikir WordPress hanya digunakan untuk blogging biasa, dan bahwa penyerang hanya tertarik pada deflasi? Mari kita khawatirkan melindungi server kita, bukan hanya mengembalikannya setelah seseorang masuk.
Argumen 3: Menolak akses ke
wp-config.php
cukup baikSALAH : Bayangkan default server Anda untuk host virtual adalah: tidak ada PHP, tidak
.htaccess
,allow from all
(hampir tidak biasa dalam lingkungan produksi). Jika konfigurasi Anda entah bagaimana diatur ulang selama operasi rutin - seperti, katakanlah, pembaruan panel - semuanya akan kembali ke keadaan default, dan Anda terbuka.Jika model keamanan Anda gagal ketika pengaturan secara tidak sengaja diatur ulang ke default, Anda memerlukan keamanan lebih.
WTF : Mengapa ada orang yang secara khusus merekomendasikan lebih sedikit lapisan keamanan? Mobil mahal tidak hanya memiliki kunci; mereka juga memiliki alarm, immobilizer, dan pelacak GPS. Jika ada sesuatu yang layak dilindungi, lakukan dengan benar.
Argumen 4: Akses tidak sah ke
wp-config.php
bukan masalah besarSALAH : Kunci dan garam otentikasi dapat digunakan dalam sejumlah potensi serangan pembajakan.
WTF : Sekalipun kredensial basis data adalah satu-satunya yang ada di dalamnya
wp-config.php
, Anda harus takut penyerang akan mendapatkannya.Argumen 5: Bergerak di
wp-config.php
luar root web sebenarnya membuat server kurang amanSALAH : Dengan asumsi
wp-config.php
adahttpdocs/
, cukup pindahkan ke../phpdocs/
, dan setelopen_basedir
untuk menyertakan sajahttpdocs/
danphpdocs/
. Misalnya:(Ingatlah untuk selalu memasukkan
/tmp/
, atautmp/
direktori pengguna Anda , jika Anda memilikinya.)Kesimpulan: file konfigurasi harus selalu selalu selalu berada di luar akar web
Jika Anda peduli dengan keamanan, Anda akan pindah ke
wp-config.php
luar root web Anda.sumber
wp-config.php
tetap aman. Dan itu sangat mustahil - sangat banyak sehingga pada dasarnya tidak mungkin - bahwa bug akan mengakibatkan root web secara sewenang-wenang mengatur ulang ke direktori yang tepat di mana Anda menempatkanwp-config.php
.wp-config.php
ke lokasi yang sewenang-wenang. Saya telah menambahkan arah ke jawaban saya; itu hanya melibatkan membuat bonekawp-config.php
di direktori WordPress referensi lokasi yang asli.Yang terbesar adalah
wp-config.php
berisi beberapa informasi sensitif: nama pengguna / kata sandi database Anda, dll.Jadi idenya: pindahkan di luar root dokumen, dan Anda tidak perlu khawatir tentang apa pun. Penyerang tidak akan pernah dapat mengakses file itu dari sumber eksternal.
Namun, inilah intinya:
wp-config.php
tidak pernah mencetak apa pun di layar. Ini hanya mendefinisikan berbagai konstanta yang digunakan di seluruh instalasi WP Anda. Dengan demikian satu-satunya cara seseorang akan melihat bahwa isi file itu adalah jika mereka menghindari server Anda penerjemah PHP - mereka mendapatkan.php
file untuk di render sebagai hanya teks biasa. Jika itu terjadi, Anda sudah dalam masalah: mereka memiliki akses langsung ke server Anda (dan mungkin izin root) dan dapat melakukan apa pun yang mereka suka.Saya akan melanjutkan dan mengatakan tidak ada manfaatnya untuk pindah ke
wp-config
luar akar dokumen dari perspektif keamanan - karena alasan di atas dan ini:wp-config
untuk mencegah pengguna mana pun tanpa hak istimewa yang memadai untuk membaca file bahkan jika mereka mendapatkan akses (terbatas) ke server Anda melalui SSH.wp-config.php
file tersebut berada. Lebih penting lagi, bahwa pengguna basis data hanya memiliki izin untuk membaca dan menulis ke basis data instalasi WP dan dan tidak ada yang lain - tidak ada akses untuk memberikan izin pengguna lain. Artinya, dengan kata lain, jika penyerang mendapatkan akses ke basis data Anda, itu hanyalah masalah memulihkan dari cadangan (lihat poin 4) dan mengubah pengguna basis data.wp-config
, mereka mungkin mengacaukan sesuatu yang lain.wp-config
, dan karena Anda berhati-hati tentang hal itu (lihat poin 3 dan 4), itu bukan masalah besar. Garam dan semacamnya dapat diubah kapan saja. Satu-satunya hal yang terjadi adalah ia membatalkan cookie pengguna yang masuk.Bagi saya,
wp-config
keluar dari root dokumen berbau keamanan oleh ketidakjelasan - yang sangat banyak.sumber
Saya pikir Max adalah jawaban yang luas, dan itulah satu sisi dari cerita. The WordPress Codex memiliki lebih menyarankan :
Perhatikan bahwa pengaturan 400 atau 440 izin pada wp-config.php dapat mencegah plugin menulis atau memodifikasinya. Contoh asli adalah caching plugins (W3 Total Cache, WP Super Cache, dll.) Dalam hal ini, saya akan menggunakan 600 (izin default untuk file dalam
/home/user
direktori).sumber
public_html
, pindah kewp-config.php
luar direktori berarti bahwa itu akan berada dipublic_html
direktori. Dalam hal ini, Anda harus menggunakan aturan htaccess untuk menolak permintaan HTTP ke wp-config.php. (2) Jika WordPress diinstal langsung di bawahpublic_html
direktori, satu tingkat naik => Anda akan memindahkannya ke/home/user
direktori. Dalam hal ini Anda cukup aman karena file tersebut berada di luar root dokumen. Anda masih dapat mengatur izin file menjadi 600 (atau bahkan lebih ketat 440 atau 400).Seseorang meminta kami untuk bersinar, dan saya akan menjawab di sini.
Ya, ada manfaat keamanan dari mengisolasi wp-config.php Anda dari direktori root situs Anda.
1- Jika handler PHP Anda rusak atau diubah dengan cara tertentu, informasi DB Anda tidak akan diekspos. Dan ya, saya melihat ini terjadi beberapa kali pada host bersama selama pembaruan server. Ya, situs akan rusak selama periode itu, tetapi kata sandi Anda akan tetap utuh.
2- Praktik terbaik selalu merekomendasikan mengisolasi file konfigurasi dari file data. Ya, sulit untuk melakukannya dengan WordPress (atau aplikasi web apa pun), tetapi memindahkannya sedikit terisolasi.
3 - Ingat kerentanan PHP-CGI, di mana siapa pun bisa meneruskan? -S ke file dan melihat sumbernya. http://www.kb.cert.org/vuls/id/520827
Pada akhirnya, itu adalah detail kecil, tetapi mereka memang membantu meminimalkan risiko. Khususnya jika Anda berada di lingkungan bersama, di mana siapa pun dapat mengakses database Anda (yang mereka butuhkan adalah pengguna / pass).
Tapi jangan biarkan gangguan kecil (optimasi prematur) terjadi di depan apa yang benar-benar diperlukan untuk mendapatkan situs dengan benar:
1- Selalu perbarui
2- Gunakan kata sandi yang kuat
3- Batasi akses (melalui izin). Kami punya posting tentang itu di sini:
http://blog.sucuri.net/2012/08/wordpress-security-cutting-through-the-bs.html
Terima kasih,
sumber
Pasti ya.
Ketika Anda memindahkan wp-config.php di luar direktori publik, Anda melindunginya dari membaca menggunakan browser ketika php handler berubah menjadi berbahaya (atau tidak sengaja!).
Membaca login / kata sandi DB Anda dimungkinkan ketika server hampir tidak terinfeksi melalui kesalahan administrator lumpuh. Isi denda administrator dan dapatkan host server yang cenderung lebih baik dan lebih dapat diandalkan. Padahal itu mungkin lebih mahal.
sumber
open_basedir
ruang lingkup diperluas ?-rwx
akses ke direktori yang lebih tinggi dari itupublic_html
sehingga saya tidak pernah terbiasa dengannyaopen_basedir
. Log saya berada di direktori yang terpisah, demikian juga cadangan. Saya pikir itulah yang dimiliki semua host bersama.Saya hanya ingin mengklarifikasi, demi argumen, bahwa memindahkan file wp_config.php Anda tidak selalu berarti Anda harus memindahkannya hanya ke direktori induk. Katakanlah Anda memiliki struktur seperti / root / html, di mana html berisi instalasi WP dan semua konten HTML Anda. Alih-alih memindahkan wp_config.php ke / root, Anda bisa memindahkannya ke sesuatu seperti / root / secure ... yang keduanya di luar direktori html dan juga tidak di direktori root server. Tentu saja, Anda perlu memastikan bahwa php dapat berjalan di folder aman ini juga.
Karena WP tidak dapat dikonfigurasi untuk mencari wp_config.php di folder saudara seperti / root / secure, Anda harus mengambil langkah tambahan. Saya meninggalkan wp_config.php di / root / html, dan memotong bagian sensitif (login database, garam, awalan tabel) dan memindahkannya ke file terpisah yang disebut config.php. Kemudian Anda menambahkan
include
perintah PHP ke wp_config.php Anda, seperti ini:include('/home/content/path/to/root/secure/config.php');
Ini pada dasarnya adalah apa yang telah saya lakukan dalam pengaturan saya. Sekarang, berdasarkan diskusi di atas, saya masih mengevaluasi apakah itu perlu atau bahkan ide yang bagus. Tetapi saya hanya ingin menambahkan bahwa konfigurasi di atas dimungkinkan. Itu tidak mengekspos cadangan Anda dan file root lainnya, dan selama folder aman tidak diatur dengan URL publiknya sendiri, itu tidak dapat dijelajahi.
Selain itu, Anda dapat membatasi akses ke folder aman dengan membuat file .htaccess di sana dengan:
sumber
open_basedir
direktif mengambil seluruh pohon , sehingga untuk mengakses/root/secure
dari/root/html
, Anda harus mengaturopen_basedir
ke/root
./root/httpdocs/config/accessible
, tempathttpdocs
menyimpan log, cadangan, dll;config
memegangwp-config.php
, danaccessible
menyimpan WordPress serta semua konten. Anda harus memodifikasi konfigurasi vhost, dll untuk memetakan kembali root dokumenaccessible
. Saya tidak melihat manfaat apa pun selain hanya menolak permintaan HTTP ke wp-config di pengaturan default.Ada banyak tema dan plugin yang ditulis dengan buruk di luar sana yang memungkinkan atatckers untuk menyuntikkan kode (ingat masalah keamanan dengan Timthumb). Jika saya akan menjadi seorang penyerang, mengapa saya harus mencari wp-config.php? Cukup menyuntikkan kode ini:
Anda dapat mencoba menyembunyikan wp-config.php Anda. Selama WordPress membuat semua informasi sensitif dapat diakses secara global, tidak ada untungnya menyembunyikan wp-config.php.
Bagian buruk di wp-config.php bukanlah ia menyimpan data sensitif. Bagian yang buruk adalah mendefinisikan data sensitif sebagai konstanta yang dapat diakses secara global.
Memperbarui
Saya ingin menjelaskan masalah dengan
define()
dan mengapa itu adalah ide yang buruk untuk mendefinisikan data sensitif sebagai konstanta global.Ada banyak cara untuk menyerang situs web. Injeksi skrip hanya satu cara untuk menyerang situs web.
Dengan asumsi server memiliki kerentanan yang memungkinkan penyerang mengakses dump memori. Penyerang akan menemukan di memori dump semua nilai semua variabel. Jika Anda menetapkan konstanta yang dapat diakses secara global, ia harus tetap dalam memori hingga skrip berakhir. Membuat variabel alih-alih konstanta, ada kemungkinan besar bahwa pemulung akan menimpa (atau membebaskan) memori setelah variabel tidak lagi diperlukan.
Cara yang lebih baik untuk melindungi data sensitif adalah menghapusnya segera setelah menggunakannya:
Setelah menggunakan data sensitif, penugasan
null
akan menimpa data dalam memori. Seorang penyerang harus mendapatkan memori dump tepat pada saat ketika$db_con
berisi data sensitif. Dan itu adalah waktu yang sangat singkat dalam contoh di atas (jika kelas Database_Handler tidak menyimpan salinannya).sumber
Terlepas dari manfaat keamanan, itu juga memungkinkan Anda untuk menyimpan contoh WordPress Anda di bawah kontrol versi sambil menjaga file inti WordPress sebagai submodule / eksternal. Ini adalah bagaimana Mark Jaquith mengatur proyek WordPress-Skeleton-nya. Lihat https://github.com/markjaquith/WordPress-Skeleton#assumptions untuk detailnya.
sumber
wp-config.php
satu direktori di atas root dokumen vhost , bukan hanya satu direktori di atas folder instalasi WordPress. Intinya adalah untuk mendapatkannya di luar folder yang dapat dibaca oleh permintaan HTTP.