Apache et SuExec, execution de php en tant que script CGI
Ou comment securiser quelque peu apache et les scripts qu’il fait fonctionner.
Execution de scripts CGI avec SuEXEC
Qu’est-ce que SuExec ?
SuExec est la fonctionnalité apache permettant d’executer les processus fils avec d’autres droits d’utilisateur/de groupe.
Comment savoir si mon installation apache dispose du mécanisme SuExec ?
Par défaut, sous gentoo, du tant que vous n’avez pas compilé apache avec le use flag no-suexec, cette fonctionnalité est disponible.
Il est important de spécifier dans le fichier de configuration de démarrage d’apache /etc/conf.d/apache2 l’option -D SUEXEC ce qui peut être par exemple : APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D LANGUAGE -D MANUAL -D SUEXEC -D PHP5".
Pour vérifier si le mécanisme est actif lors du démarrage d’apache, vous trouverez dans le fichier /var/log/apache2/error.log quelque chose de similaire à suEXEC mechanism enabled (wrapper: /usr/sbin/suexec).
Spécifier les droits corrects sur le logiciel établissant le mécanisme
Il est important de changer les droits sur le wrapper suexec :
chown root:apache /usr/bin/suexec
chmod 4750 /usr/bin/suexec
Mise en place du mécanisme SuExec pour un vhost
Commençons par créer un groupe auxquels appartiendront tous les utilisateurs suexec et également un utilisateur avec les droits restreints :
groupadd webusers
useradd -c "Suexec user 1" -g webusers -s /sbin/nologin webuser1
Pour changer l’utilisateur utilisé pour faire fonctionner les scripts cgi, il faut spécifier dans la configuration du vhost la directive SuexecUserGroup [1 ] suivie du nom d’utilisateur et du nom du groupe à utiliser.
Vous obtiendrez une configuration pour votre vhost similaire à ceci :
<VirtualHost *:80>
ServerName domain.tld
ServerAlias *.domain.tld
DocumentRoot /var/www/geekz.fr/htdocs/
ErrorLog /var/www/domain.tld/logs/error.log
CustomLog /var/www/domain.tld/logs/access.log combined
SuexecUserGroup webuser1 webusers
<Directory "/var/www/domain.tld/htdocs">
AllowOverride All
Order deny,allow
Allow from all
Options FollowSymLinks
</Directory>
<IfModule alias_module>
ScriptAlias /cgi-bin/ /var/www/domain.tld/cgi-bin/
</IfModule>
<Directory "/var/www/domain.tld/cgi-bin">
AllowOverride None
Order deny,allow
Allow from all
Options +ExecCGI
</Directory>
</VirtualHost>
Il est bien sur nécessaire de modifier les droits des propriétaires des fichiers dans le répertoire cgi-bin :
chown -R webuser1:webusers /var/www/domain.tld/cgi-bin
Relancez apache (après avoir validé la configuration ;)) et hop, vos scripts cgi fonctionnent avec des droits différents.
Voici un exemple de ce que l’on peut voir niveau processus lors de l’execution d’un script cgi :
root 2082 0.0 4.5 185748 11564 ? Ss 20:49 0:00 /usr/sbin/apache2 -D DEFAULT_VHOST -D INFO -D LANGUAGE -D MANUAL -D SUEX
apache 2945 0.0 2.5 185748 6436 ? S 21:01 0:00 \_ /usr/sbin/apache2 -D DEFAULT_VHOST -D INFO -D LANGUAGE -D MANUAL -D
1003 4048 4.0 0.5 17580 1416 ? S 21:39 0:00 | \_ bash dig-short.cgi google.com,TXT,80.92.65.30
1003 4061 0.0 0.2 17580 536 ? S 21:39 0:00 | \_ bash dig-short.cgi google.com,TXT,80.92.65.30
1003 4062 0.0 0.7 13108 1888 ? S 21:39 0:00 | \_ /usr/bin/dig +time=2 +short TXT google.com @80.92.65.30
1003 4063 0.0 0.2 3828 552 ? S 21:39 0:00 | \_ /bin/sed s/$/<br \/>/g
Nous voyons bien que le script cgi fonctionne avec l’uid 1003.
[1 ] http://httpd.apache.org/docs/2.2/mod/mod_suexec.html#suexecusergroup