Isolamento degli host virtuali di Apache dal resto del sistema


11

Sto installando un web server che ospiterà un numero di siti web diversi come Apache VirtualHosts, ognuno di questi avrà la possibilità di eseguire script (principalmente PHP, possibilmente altri).

La mia domanda è: come isolare ciascuno di questi VirtualHosts l'uno dall'altro e dal resto del sistema? Ad esempio, non voglio che il sito Web X legga la configurazione del sito Web Y o dei file "privati" del server.

Al momento ho configurato VirtualHosts con FastCGI, PHP e SUExec come descritto qui ( http://x10hosting.com/forums/vps-tutorials/148894-debian-apache-2-2-fastcgi-php-5-suexec -easy-way.html ), ma SUExec impedisce solo agli utenti di modificare / eseguire file diversi dai propri - gli utenti possono comunque leggere informazioni riservate come i file di configurazione.

Ho pensato di rimuovere l'autorizzazione di lettura globale UNIX per tutti i file sul server, poiché ciò risolverebbe il problema precedente, ma non sono sicuro di poterlo fare in modo sicuro senza interrompere la funzione del server.

Ho anche esaminato l'uso di chroot, ma sembra che ciò possa essere fatto solo per server e non per host virtuale.

Sto cercando eventuali suggerimenti che isoleranno i miei VirtualHosts dal resto del sistema.

PS Sto eseguendo il server Ubuntu 12.04

La mia RISPOSTA: ho terminato quasi seguendo la mia configurazione attuale, ma facendo una prigione chroot per tutti gli host virtuali, ad esempio avendo la prigione chroot dentro /var/wwwe quindi avere tutti i dati degli utenti nelle sottocartelle ciascuna con autorizzazioni di gruppo / altri r / w / x Disabilitato. Questa opzione era auspicabile soprattutto perché è possibile senza modifiche al codice sorgente.

Ho scelto la risposta di @Chris, perché è stata scritta a fondo e ha considerato anche FTP e SELinux

Risposte:


4

Questo può essere fatto abilitando il modulo mod_users in Apache.

Sarà necessario impostare UserDir nella configurazione di apache. Ti suggerisco di farlo in un file di configurazione separato e includerlo. Avvolgi l'inclusione

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

Posso darti l'intero tutorial ma questo dovrebbe farti iniziare a configurare Apache: http://www.techytalk.info/enable-userdir-apache-module-ubuntu-debian-based-linux-distributions/

Suggerimento: se stai eseguendo SELinux (e dovresti) dovresti dare ad Apache l'accesso in lettura alle home dell'utente. Puoi farlo impostando:

sudo setsebool -P httpd_enable_homedirs=On

Ha anche bisogno dei permessi dei file per l'utente dirs directory public_html e delle autorizzazioni rx nelle directory principali fino alla radice.

Ovviamente devi configurare chroot per gli utenti, ad esempio in vsftpd. Installare:

apt-get vsftpd

Per configurare il chrooting aprire /etc/vsftpd/vsftpd.conf con vi o nano. Trova e decommenta o aggiungi: chroot_local_user = yes

È possibile ottenere lo stesso comportamento per sftp che consiglio su FTP, aprire / etc / ssh / sshd_config e aggiungere un blocco Match e questa riga:

Subsystem   sftp    internal-sftp

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

In questo modo chroot qualsiasi utente nel gruppo web_users . Inoltre dovresti negare l'accesso alla shell impostandola su / sbin / nologin:

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

Se questo deve essere un server di produzione pubblico, suggerisco anche vivamente di applicare un po 'di hardening su OS, OpenSSH, Apache, PHP, vsftpd e applicare alcuni iptables e wrapper TCP rigorosi. Ti consiglio di lasciare SELinux al suo posto.


3
Non vedo come mod_userdiroffre l'hosting virtuale di domini separati. Inoltre, ho delle preoccupazioni in merito alla sicurezza in termini di isolamento poiché non riesco a trovare nulla tra le directory degli utenti all'interno di Apache. Sembra proprio che non offra questa funzionalità.
gertvdijk,

6

Vi suggerisco di dare un'occhiata a suphpo PHP-FPM .

Fondamentalmente consentirà all'interprete PHP di "eseguire" su un utente specifico configurato per quel VirtualHost. Ciò ti consentirà di utilizzare le autorizzazioni generali del file system per isolare ogni singolo VirtualHost.

Consiglierei FPM per considerazioni sulle prestazioni. Dalla homepage questo è ciò che ti interessa di più:

Interessanti sono anche le opzioni utente e gruppo per pool, che consentono di eseguire quel pool fpm specifico sotto il nome utente e gid; arrivederci suphp!


4

1
Ho esaminato questi collegamenti, ma non mi sembra di poter eseguire il chroot su base per host virtuale. Forse dovrei definire una directory www globale per chroot in like /var/wwwe avere tutti gli host in una sottodirectory lì dentro, ognuna di queste sottodirectory dopo aver rimosso l'autorizzazione globale di esecuzione / lettura?
JesperB,

Il mio punto principale era chroote puoi farlo per server virtuale. Ecco un esempio In questo caso, stanno usando mod_chroot.
martedì
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.