Exécuter Apache en tant qu'utilisateur différent

10

Lorsque j'exécute la ps -efHcommande pour répertorier tous les processus, je peux voir Apache s'exécuter en tant que rootet semble avoir des sous-processus en cours d'exécution www-data. Voici l'extrait:

root     30117     1  0 09:10 ?        00:00:00   /usr/sbin/apache2 -k start
www-data 30119 30117  0 09:10 ?        00:00:00     /usr/sbin/apache2 -k start
www-data 30120 30117  0 09:10 ?        00:00:00     /usr/sbin/apache2 -k start
www-data 30121 30117  0 09:10 ?        00:00:00     /usr/sbin/apache2 -k start

Puis-je faire fonctionner Apache et tous les sous-processus en tant qu'utilisateur différent apache2d:apache2d? Si c'est le cas, comment? J'ai lu quelque part que les paramètres pour cela peuvent être trouvés /etc/apache2/httpd.confmais ce fichier semble être vide? Cela peut-il être accompli en changeant le propriétaire et le groupe du /etc/init.d/apache2script, puis en définissant l'indicateur setuid dessus?

Mridang Agarwalla
la source

Réponses:

21

Apache doit d'abord s'exécuter en tant que root pour se lier au port 80. Si vous ne l'exécutez pas en tant que root au départ, vous ne pouvez pas vous lier au port 80. Si vous souhaitez vous lier à un port supérieur à 1024, oui, vous pouvez. Sinon, ne vous inquiétez pas pour root. Il s'agit du processus Apache parent et ne répond à aucune demande. Il générera des processus enfants et supprimera les privilèges pour le traitement des demandes.

Pour modifier l'utilisateur Apache, définissez les paramètres Useret Groupdans votre configuration Apache.

bahamat
la source
Eh bien, désolé de faire une digression, mais je remarque que haproxy peut fonctionner en tant que haproxy (pas en tant que root) et lier le port tcp 80. Comment est-ce possible? Une illumination?
kiiwii
1
Ce n'est pas le cas. Les processus ne peuvent se lier à des ports inférieurs à 1024 que s'ils disposent de privilèges de superutilisateur. Donc, haproxy démarre soit en tant que root et en supprimant les privilèges (probablement) ou en tant que root setuid (peu probable).
bahamat
Vous n'avez pas besoin de l'exécuter en tant que root, il vous suffit d'autoriser votre utilisateur "apache" à accéder aux ports restreints (c'est-à-dire ceux inférieurs à 1024). Cette réponse explique comment vous pouvez utiliser 'authbind' pour cela: superuser.com/questions/710253/…
Animal451
4

@bahamat l'explique assez bien, mais j'ajouterai un peu plus de détails.

Au cours d'un fonctionnement normal, le processus apache appartenant à la racine n'effectuera aucune opération réelle autre que l'écoute sur le port 80 et la transmission des connexions entrantes à ses www-dataenfants (en toute sécurité non privilégiés, en tant qu'utilisateur).

L'emplacement du fichier de configuration principal dépend des options de compilation et varie selon la distribution, mais /etc/apache2/apache2.confc'est une bonne idée de départ.

De plus, si vous configurez un système d'hébergement Web multi-utilisateurs, vous souhaiterez peut-être examiner SuExec et fcgid afin que le processus apache de chaque utilisateur d'hébergement Web s'exécute en tant qu'utilisateur - de sorte que si un utilisateur néglige sa sécurité, d'autres les utilisateurs ne seront pas affectés.

Shadur
la source
3

Dans Ubuntu au moins, les paramètres pour cela sont là /etc/apache2/envvars. Modifiez-les, puis redémarrez apache et vous êtes prêt à fonctionner.

mlissner
la source
Merci, cela m'a aidé! J'installe une boîte vagabonde ubuntu, et pour une raison quelconque, /etc/apache2/httpd.conf n'était pas utilisé pour charger l'utilisateur et le groupe. envars semble faire l'affaire!
Greg
2

Consultez également Apache2 ITK MPM .

Il bifurque un thread Apache avec le uid/ attribué gid, cela vous permet de continuer à utiliser mod_php. Plus chmod/ chownetc.

Olli
la source
Vote positif pour mpm_itklequel une amélioration significative par rapport à suexec / fcgid
Shadur
0

Mac OS X:

Ce qui a fonctionné pour moi va dans le fichier de configuration apache:

/etc/apache2/httpd.conf

Dans ce fichier, j'ai recherché un utilisateur ou un groupe

et heurté:

User _www
Group _www

Je l'ai changé en n'importe quel utilisateur / groupe dont j'avais besoin (dans mon cas, l'utilisateur / groupe qui est le propriétaire de mes fichiers d'application Web que vous pouvez voir. Et cela, vous pouvez le vérifier en utilisant le simple 'ls -l' commander)

Mercure
la source