Mengisolasi virtualhosts Apache dari sisa sistem

11

Saya menyiapkan server web yang akan meng-host sejumlah situs web yang berbeda sebagai Apache VirtualHosts, masing-masing memiliki kemungkinan untuk menjalankan skrip (terutama PHP, kemungkinan yang lain).

Pertanyaan saya adalah bagaimana saya mengisolasi masing-masing VirtualHost ini dari satu sama lain dan dari sisa sistem? Saya tidak ingin misalnya situs web X untuk membaca konfigurasi situs web Y atau file "pribadi" server.

Saat ini saya telah menyiapkan VirtualHosts dengan FastCGI, PHP dan SUExec seperti yang dijelaskan di sini ( http://x10hosting.com/forums/vps-tutorials/148894-debian-apache-2-2-fastcgi-php-5-suexec -easy-way.html ), tetapi SUExec hanya mencegah pengguna mengedit / mengeksekusi file selain milik mereka sendiri - pengguna masih dapat membaca informasi sensitif seperti file konfigurasi.

Saya telah berpikir tentang menghapus izin baca global UNIX untuk semua file di server, karena ini akan memperbaiki masalah di atas, tapi saya tidak yakin apakah saya bisa melakukan ini dengan aman tanpa mengganggu fungsi server.

Saya juga melihat ke dalam menggunakan chroot, tetapi tampaknya ini hanya dapat dilakukan pada basis per-server, dan bukan pada basis per-virtual-host.

Saya mencari saran yang akan mengisolasi VirtualHosts saya dari seluruh sistem.

PS Saya menjalankan server Ubuntu 12.04

JAWABAN Saya: Saya mengakhiri dengan hampir mengikuti konfigurasi saya saat ini, tetapi melakukan jail chroot untuk semua host virtual, mis. Memiliki chroot jail di dalam /var/wwwdan kemudian memiliki semua data pengguna dalam subfolder masing-masing dengan izin grup / orang lain r / w / x cacat. Opsi ini diinginkan terutama karena semuanya dimungkinkan tanpa modifikasi pada kode sumber.

Saya memilih jawaban @Chris, karena ditulis dengan seksama dan juga dianggap FTP dan SELinux

JesperB
sumber

Jawaban:

4

Ini dapat dilakukan dengan mengaktifkan modul mod_users di Apache.

Anda perlu mengatur UserDir di konfigurasi apache Anda. Saya sarankan Anda melakukan ini dalam file konfigurasi terpisah dan sertakan. Bungkus termasuk dalam

<IfModule mod_users.c>
   Include conf/extra/userdir.conf
</IfModule>

Saya dapat memberikan Anda seluruh tutorial tetapi ini harus Anda mulai untuk mengkonfigurasi Apache: http://www.techytalk.info/enable-userdir-apache-module-ubuntu-debian-based-linux-distributions/

Petunjuk jika Anda menjalankan SELinux (dan seharusnya) Anda harus memberikan akses baca Apache ke rumah pengguna. Anda dapat melakukan ini dengan mengatur:

sudo setsebool -P httpd_enable_homedirs=On

Ini juga membutuhkan izin file ke direktori user public_html dan izin rx pada direktori induk hingga root.

Jelas Anda perlu mengatur chroot untuk pengguna misalnya di vsftpd. Install:

apt-get vsftpd

Untuk mengkonfigurasi chroot, buka /etc/vsftpd/vsftpd.conf dengan vi atau nano. Temukan dan batalkan komentar atau tambahkan: chroot_local_user = ya

Anda bisa mendapatkan perilaku yang sama untuk sftp yang saya rekomendasikan melalui FTP, buka / etc / ssh / sshd_config dan tambahkan blok Match dan baris ini:

Subsystem   sftp    internal-sftp

Match Group web_users
    ChrootDirectory %h
    ForceCommand internal-sftp
    AllowTcpForwarding no
Match

Ini akan chroot setiap pengguna di grup web_users . Anda juga perlu menolak akses ke shell dengan mengaturnya ke / sbin / nologin:

useradd -G "web_users" -s /sbin/nologin new_user

Jika ini ingin menjadi server produksi publik, saya juga sangat menyarankan Anda menerapkan pengerasan pada OS, OpenSSH, Apache, PHP, vsftpd dan menerapkan beberapa iptables yang ketat dan pembungkus TCP. Saya sarankan Anda meninggalkan SELinux di tempat juga.

Chris
sumber
3
Saya tidak melihat bagaimana mod_userdirmenawarkan hosting virtual untuk domain terpisah. Selain itu, saya memiliki kekhawatiran tentang keamanan dalam hal isolasi karena saya tidak dapat menemukan apa pun di antara direktori pengguna di dalam Apache. Sepertinya tidak menawarkan fitur itu.
gertvdijk
6

Saya sarankan untuk melihat-lihat suphpatau PHP-FPM .

Ini pada dasarnya akan memungkinkan penerjemah PHP untuk 'su' ke beberapa pengguna tertentu yang dikonfigurasi untuk VirtualHost itu. Itu akan memungkinkan Anda untuk menggunakan izin sistem file umum untuk mengisolasi setiap VirtualHost.

Saya akan merekomendasikan FPM untuk pertimbangan kinerja. Dari beranda inilah yang paling menarik bagi Anda:

Yang juga menarik adalah opsi pengguna per grup dan, yang memungkinkan Anda untuk menjalankan kumpulan fpm tertentu di bawah uid dan gid yang diberikan; selamat tinggal suphp!

gertvdijk
sumber
4

Lihatlah ke dalam chroot.

Beberapa poin awal:

Apache chroot dibuat sederhana

Lingkungan chroot untuk Apache (Debian)

Apache Chroot Jail: Hosting Virtual

tacotuesday
sumber
1
Saya melihat tautan-tautan ini, tetapi sepertinya saya tidak bisa melakukan chroot berdasarkan per-virtual-host. Mungkin saya harus mendefinisikan direktori www global untuk chroot di /var/www, dan semua host berada di subdirektori di sana, masing-masing subdirektori ini telah menghapus izin eksekusi / baca global?
JesperB
Poin utama saya adalah chroot, dan Anda dapat melakukannya per server virtual. Ini sebuah contoh. Dalam hal ini, mereka menggunakan mod_chroot.
tacotuesday