Ada beberapa lapisan yang perlu Anda lindungi.
Beberapa penghosting salah mengandalkan "perlindungan" PHP seperti open_basedir, safe_mode (PHP lama), disable_functions dll.
Bahkan PHP TIDAK menganggapnya sebagai fitur keamanan - http://php.net/security- note.php
Ini dapat dinonaktifkan dengan eksploitasi apa pun untuk PHP dan kemudian seluruh sistem akan hancur, jangan lakukan itu.
Bagaimana seharusnya dilakukan
bagian bawah
- Pisahkan pengguna tingkat OS/sistem untuk setiap situs yang dihosting
- izin yang benar (yang satu tidak dapat melihat/mengedit halaman yang lain) - pastikan juga sub-direktori memiliki izin yang benar karena akan serupa
- file sesi terpisah (BANYAK webhosting meletakkan file sesi dari setiap situs yang dihosting PHP ke dalam direktori yang sama, itu buruk buruk buruk!
Apache akhirnya mendapatkan modulnya sendiri untuk ini - Apache MPM-ITK .
Singkat cerita: bayangkan ini seperti Anda akan memberi pengguna shell pada mesin (di bawah uidnya sendiri) - dia tidak dapat melakukan apa pun ke situs lain yang dihosting.
- uid/gid berbeda
- izin sistem
- kerangka kerja seperti SELinux, AppArmor, dan sejenisnya
- grsecurity jika Anda ingin menjadi hardcore.. tetapi sistem akan lebih sulit untuk dipelihara.
naik?
Anda bisa mendapatkan lebih banyak hard-core. Yang terbaik yang pernah saya lihat adalah perpustakaan bersama untuk Apache (atau apa pun yang Anda gunakan) - yang digunakan ketika Apache mulai menggunakan LD_PRELOAD
dan itu mengimplementasikan semua panggilan sistem yang berpotensi berbahaya seperti system()
, execve()
dan pada dasarnya panggilan lain yang menurut Anda buruk.
Saya belum melihat implementasi yang baik dari ini di luar sana (selain yang khusus di suatu tempat) - koreksi saya jika saya salah.
Pastikan untuk menerapkan daftar putih untuk ini sebagai mis. mail() di PHP mengeksekusi sendmail secara default dan itu tidak akan berfungsi lagi.
kesimpulan
Tambahkan disable_functions klasik, open_basedir, dll. ke dalam php.ini global, tambahkan session.save_path ke setiap vhost - masukkan sesi ke direktori pengguna. Pastikan pengguna tidak membagikan apa pun .
Terapkan pemisahan tingkat OS yang mendasari dengan benar.
Dapatkan hardcore dengan grsec dan LD_PRELOAD lib hooking system call.
Pemisahan, pemisahan, pemisahan .. segera sistem seperti Docker akan menyediakan wadah berbasis LXC untuk memisahkan pengguna di tingkat kernel tetapi belum siap produksi (imho).