Aislar los hosts virtuales de Apache del resto del sistema

11

Estoy configurando un servidor web que alojará varios sitios web diferentes como Apache VirtualHosts, cada uno de ellos tendrá la posibilidad de ejecutar scripts (principalmente PHP, posiblemente otros).

Mi pregunta es cómo aislar cada uno de estos VirtualHosts entre sí y del resto del sistema. No quiero, por ejemplo, que el sitio web X lea la configuración del sitio web Y o cualquiera de los archivos "privados" del servidor.

Por el momento, he configurado VirtualHosts con FastCGI, PHP y SUExec como se describe aquí ( http://x10hosting.com/forums/vps-tutorials/148894-debian-apache-2-2-fastcgi-php-5-suexec -easy-way.html ), pero SUExec solo impide que los usuarios editen / ejecuten archivos que no sean los suyos; los usuarios aún pueden leer información confidencial como archivos de configuración.

He pensado en eliminar el permiso de lectura global de UNIX para todos los archivos en el servidor, ya que esto solucionaría el problema anterior, pero no estoy seguro de si puedo hacerlo sin interrumpir la función del servidor.

También examiné el uso de chroot, pero parece que esto solo se puede hacer por servidor y no por host virtual.

Estoy buscando sugerencias que aislen mis VirtualHosts del resto del sistema.

PD: estoy ejecutando el servidor Ubuntu 12.04

Mi RESPUESTA: Terminé casi siguiendo mi configuración actual, pero haciendo una cárcel chroot para todos los hosts virtuales, por ejemplo, tener la cárcel chroot /var/wwwy luego tener todos los datos de los usuarios en subcarpetas, cada uno con permisos de grupo / otros r / w / x discapacitado. Esta opción era deseable, especialmente porque todo es posible sin modificaciones en el código fuente.

Seleccioné la respuesta de @Chris porque estaba completamente escrita y también consideraba FTP y SELinux

JesperB
fuente

Respuestas:

4

Esto se puede hacer habilitando el módulo mod_users en Apache.

Deberá configurar UserDir en su configuración de apache. Le sugiero que haga esto en un archivo de configuración separado y lo incluya. Envuelva el incluir en

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

Puedo darle el tutorial completo, pero esto debería ayudarlo a configurar Apache: http://www.techytalk.info/enable-userdir-apache-module-ubuntu-debian-based-linux-distributions/

Sugerencia: si está ejecutando SELinux (y debería hacerlo), debería darle acceso de lectura a Apache a las casas de los usuarios. Puede hacer esto configurando:

sudo setsebool -P httpd_enable_homedirs=On

También necesita permisos de archivo para el directorio public_html de directorios de usuario y permisos de rx en los directorios principales hasta la raíz.

Obviamente, necesita configurar chroot para los usuarios, por ejemplo, en vsftpd. Instalar en pc:

apt-get vsftpd

Para configurar chrooting, abra /etc/vsftpd/vsftpd.conf con vi o nano. Encuentra y descomenta o agrega: chroot_local_user = yes

Puede obtener el mismo comportamiento para sftp que recomiendo a través de FTP, abra / etc / ssh / sshd_config y agregue un bloque Match y esta línea:

Subsystem   sftp    internal-sftp

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

Esto eliminará a cualquier usuario del grupo web_users . También deberá denegar el acceso al shell configurándolo en / sbin / nologin:

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

Si se trata de un servidor de producción público, también le sugiero que aplique un poco de endurecimiento en el sistema operativo, OpenSSH, Apache, PHP, vsftpd y aplique algunos estrictos iptables y envoltorios TCP. Le recomiendo que deje SELinux en su lugar también.

Chris
fuente
3
No veo cómo mod_userdirofrece alojamiento virtual de dominios separados. Además, me preocupa la seguridad en términos de aislamiento, ya que no puedo encontrar nada sobre eso entre los directorios de usuarios dentro de Apache. Parece que no ofrece esa característica.
gertvdijk
6

Sugiero a echar un vistazo a suphpo PHP-FPM .

Básicamente permitirá que el intérprete de PHP 'su' a algún usuario específico configurado para ese VirtualHost. Eso le permitirá utilizar los permisos generales del sistema de archivos para aislar cada VirtualHost.

Recomendaría FPM por consideraciones de rendimiento. Desde la página de inicio, esto es lo que más le interesa:

También son interesantes las opciones de usuario y grupo por grupo, que le permiten ejecutar ese grupo específico de fpm bajo el uid y gid dados; adiós suphp!

gertvdijk
fuente
4

Mira dentro chroot.

Algunos puntos de partida:

Chrooting Apache hecho simple

Entorno Chroot para Apache (Debian)

Apache Chroot Jail: Alojamiento virtual

tacotuesday
fuente
1
Miré estos enlaces, pero no parece que pueda hacer un chroot por host virtual. Tal vez debería definir un directorio www global para hacer un chroot /var/www, y hacer que todos los hosts estén en un subdirectorio allí, cada uno de estos subdirectorios haya eliminado el permiso global de ejecución / lectura.
JesperB
Mi punto principal era chroot, y puedes hacerlo por servidor virtual. Aquí hay un ejemplo. En este caso, están usando mod_chroot.
Tacotuesday