Isoler les hôtes virtuels Apache du reste du système

11

J'installe un serveur Web qui hébergera un certain nombre de sites Web différents en tant qu'Apache VirtualHosts, chacun d'eux aura la possibilité d'exécuter des scripts (principalement PHP, d'autres possiblu).

Ma question est de savoir comment isoler chacun de ces VirtualHosts les uns des autres et du reste du système? Je ne veux pas, par exemple, que le site Web X lise la configuration du site Web Y ou l'un des fichiers "privés" du serveur.

Pour le moment, j'ai configuré les VirtualHosts avec FastCGI, PHP et SUExec comme décrit ici ( http://x10hosting.com/forums/vps-tutorials/148894-debian-apache-2-2-fastcgi-php-5-suexec -easy-way.html ), mais SUExec empêche uniquement les utilisateurs de modifier / exécuter des fichiers autres que les leurs - les utilisateurs peuvent toujours lire des informations sensibles telles que les fichiers de configuration.

J'ai pensé à supprimer l'autorisation de lecture globale UNIX pour tous les fichiers sur le serveur, car cela résoudrait le problème ci-dessus, mais je ne sais pas si je peux le faire en toute sécurité sans perturber la fonction du serveur.

J'ai également étudié l'utilisation de chroot, mais il semble que cela ne peut être fait que par serveur et non par hôte virtuel.

Je recherche des suggestions qui isoleront mes VirtualHosts du reste du système.

PS J'utilise le serveur Ubuntu 12.04

Ma RÉPONSE: J'ai fini par presque suivre ma configuration actuelle, mais en faisant une prison chroot pour tous les hôtes virtuels, par exemple en ayant la prison chroot dedans /var/wwwpuis en ayant toutes les données des utilisateurs dans des sous-dossiers avec chacun des permissions group / others r / w / x désactivée. Cette option était souhaitable surtout parce qu'elle est possible sans aucune modification du code source.

J'ai sélectionné la réponse de @Chris, car elle a été entièrement écrite et également considérée comme FTP et SELinux

JesperB
la source

Réponses:

4

Cela peut être fait en activant le module mod_users dans Apache.

Vous devrez configurer UserDir dans votre configuration apache. Je vous suggère de le faire dans un fichier de configuration séparé et de l'inclure. Envelopper l'inclusion dans

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

Je peux vous donner l'intégralité du tutoriel, mais cela devrait vous aider à configurer Apache: http://www.techytalk.info/enable-userdir-apache-module-ubuntu-debian-based-linux-distributions/

Conseil: si vous exécutez SELinux (et vous devriez), vous devez donner à Apache un accès en lecture aux foyers utilisateur. Vous pouvez le faire en définissant:

sudo setsebool -P httpd_enable_homedirs=On

Il a également besoin des autorisations de fichier sur le répertoire public_html des répertoires utilisateur et des autorisations rx sur les répertoires parents jusqu'à la racine.

Évidemment, vous devez configurer chroot pour les utilisateurs, par exemple dans vsftpd. Installer:

apt-get vsftpd

Pour configurer le chrootage, ouvrez /etc/vsftpd/vsftpd.conf avec vi ou nano. Recherchez et décommentez ou ajoutez: chroot_local_user = yes

Vous pouvez obtenir le même comportement pour sftp que je recommande sur FTP, ouvrez / etc / ssh / sshd_config et ajoutez un bloc Match et cette ligne:

Subsystem   sftp    internal-sftp

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

Cela chrootera n'importe quel utilisateur du groupe web_users . Vous devez également refuser l'accès au shell en le définissant sur / sbin / nologin:

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

Si cela doit être un serveur de production public, je vous suggère également fortement d'appliquer un durcissement sur le système d'exploitation, OpenSSH, Apache, PHP, vsftpd et d'appliquer des iptables et des wrappers TCP stricts. Je vous recommande également de laisser SELinux en place.

Chris
la source
3
Je ne vois pas comment mod_userdiroffre l'hébergement virtuel de domaines distincts. De plus, je suis préoccupé par la sécurité en termes d'isolement, car je ne trouve rien à ce sujet entre les répertoires utilisateur d'Apache. Il ne semble tout simplement pas offrir cette fonctionnalité.
gertvdijk
6

Je suggère de jeter un œil à suphpou PHP-FPM .

Il permettra essentiellement à l'interpréteur PHP de «su» à un utilisateur spécifique configuré pour ce VirtualHost. Cela vous permettra d'utiliser les autorisations générales du système de fichiers pour isoler chaque VirtualHost.

Je recommanderais FPM pour des considérations de performances. Depuis la page d'accueil, voici ce qui vous intéresse le plus:

Les options d'utilisateur et de groupe par pool sont également intéressantes, ce qui vous permet d'exécuter ce pool fpm spécifique sous l'uid et le gid donnés; au revoir suphp!

gertvdijk
la source
4

Regardez chroot.

Quelques points de départ:

Apache chrooting en toute simplicité

Environnement chroot pour Apache (Debian)

Apache Chroot Jail: hébergement virtuel

mardi
la source
1
J'ai regardé ces liens, mais il ne semble pas que je puisse chrooter par hôte virtuel. Peut-être que je devrais définir un répertoire www global à chrooter comme /var/www, et avoir tous les hôtes dans un sous-répertoire là-dedans, chacun de ces sous-répertoires ayant supprimé l'autorisation globale d'exécution / lecture?
JesperB
Mon point principal était chroot, et vous pouvez le faire par serveur virtuel. Voici un exemple. Dans ce cas, ils utilisent mod_chroot.
mardi