Saya bekerja dengan administrasi sistem di sebuah universitas dan hanya menemukan sesuatu yang mungkin biasa, tetapi cukup mengejutkan bagi saya.
Semua direktori public_html dan area web disimpan di afs, dengan izin baca untuk server web. Karena pengguna diizinkan memiliki skrip php di public_html mereka, ini berarti mereka dapat mengakses file satu sama lain dari dalam php (dan file web utama!).
Ini tidak hanya membuat perlindungan kata sandi .htaccess sama sekali tidak berguna, itu juga memungkinkan pengguna untuk membaca file sumber php yang berisi kata sandi database mysql dan informasi sensitif serupa. Atau jika mereka menemukan bahwa orang lain memiliki direktori di mana server web memiliki akses tulis (misalnya untuk log pribadi atau untuk menyimpan data formulir yang dikirimkan), mereka dapat menyimpan file di akun tersebut.
Contoh sederhana:
<?
header("Content-type: text/plain");
print file_get_contents("/afs/example.com/home/smith/public_html/.htpasswd");
?>
Apakah ini masalah umum? Dan bagaimana Anda biasanya menyelesaikannya?
MEMPERBARUI:
Terima kasih atas masukannya. Sayangnya, sepertinya tidak ada jawaban sederhana. Dalam lingkungan bersama yang besar seperti ini, pengguna mungkin tidak boleh diberikan pilihan sebanyak ini. Pendekatan terbaik yang dapat saya pikirkan adalah dengan menetapkan "open_basedir" dalam konfigurasi utama untuk semua direktori "public_html", jalankan suphp dan hanya izinkan php bersih (tanpa skrip cgi, menjalankan perintah eksternal dengan backticks dll).
Mengubah kebijakan seperti ini akan menghancurkan banyak hal, dan sangat mungkin membuat pengguna mengambil garpu rumput mereka dan mengejar kami ... Saya akan membahasnya dengan rekan-rekan saya dan memperbarui di sini jika kami membuat keputusan tentang bagaimana mengubah pengaturan.
sumber
open_basedir
solusi di bawah ini pada sistem shared hosting produksi, tapi kami membagi semua orang menjadi vhost mereka sendiri - Tidak yakin apakah itu berfungsi untuk direktori tunggal ...Jawaban:
Satu dapat menggunakan suphp yang menjalankan skrip php dengan uid dari pemiliknya.
http://www.suphp.org
sumber
check_vhost_docroot
, tetapi AFAIK yang hanya berlaku untuk skrip dieksekusi (? Saya bisa salah tentang itu)Saran saya adalah membatasi akses PHP ke file (melalui
open_basedir
& arahan serupa, berdasarkan per-vhost): Anda ingin pengguna dapat membuka / membaca / menulis file di webroot mereka, dan mungkin satu tingkat di atasnya (untuk awal space), tetapi bukan direktori tempat mereka menyimpan misalnyahtpasswd
file.Struktur direktori seperti:
Akan memenuhi persyaratan ini:
open_basedir
dapat diarahkan dengan/Client/site
aman, danhtpasswd
file disimpan dalam/Client/auth
(dengan.htaccess
file atauhttpd.conf
dimodifikasi untuk menunjuk pada lokasi yang sesuai sebagai gantinya).Ini mencegah klien Anda membuka file orang lain, DAN sebagai manfaat, pengguna jahat tidak dapat membaca hal-hal itu
/Client/auth
(atau apa pun di sistem Anda, seperti/etc/passwd
:-)Lihat http://php.net/manual/en/ini.core.php untuk detail lebih lanjut tentang implementasi open_basedir & per-vhost.
sumber
suphp
seperti dicatat oleh cstamas juga merupakan ide yang sangat bagus di lingkungan shared hosting - Ada sedikit overhead yang mengaturnya, tapi saya akan mengatakan bahwa keuntungan keamanan benar-benar layak. Singkat sandboxing semua situs PHP Anda dalam sesuatu seperti FreeBSD Jail atau mesin virtual khusus yang merupakan salah satu yang menang keamanan terbesar.open_basedir
di dalam direktif <Directory>, tapi saya pikir itu harus diijinkan ("coba dan lihat" - yang terburuk tidak dapat dilakukan :)Tidak, ini bukan masalah umum karena kebanyakan host bersama akan mendefinisikan konfigurasi open_basedir dalam file htaccess di direktori public_html setiap pengguna (atau di vhost jika setiap pengguna memiliki vhost sendiri).
misalnya dari file .htaccess:
Tetapi pastikan Anda menetapkan izin yang tepat pada file .htaccess untuk mencegah pengguna mengubah open_basedir (jika mereka mencoba menimpanya di subdir / .htaccess, itu tidak akan berfungsi - tetapi Anda mungkin harus menguji ini untuk memastikan) .
HTH
C.
sumber
AFS mengabaikan izin pengguna unix sederhana. suPHP mengeksekusi setuid sebelum menjalankan program php, tetapi itu tidak memberikan proses token kerberos yang diperlukan untuk mengakses AFS dan dibatasi untuk izinnya. suPHP harus dimodifikasi dengan cara tertentu untuk memperoleh token tersebut sebelum dapat muncul dengan sendirinya ke sistem AFS sebagai pengguna itu. Sejauh yang saya tahu, itu belum dilakukan. (Sebenarnya, saya menemukan pertanyaan ini ketika mencari untuk melihat apakah ada orang lain yang melakukannya.)
sumber