Configurando suphp

Suphp es un módulo para apache y php que permite ejecutar procesos de php con un usuario diferente del que usa apache para ejecutar las páginas html y php.

Consta de dos partes, una es un modulo para apache que "captura" las peticiones de páginas php, comprueba el usuario del archivo, su grupo, y envía la información a la otra parte, que es un ejecutable suid-root que lanza php4-cgi con el usuario que le ha sido indicado, este devuelve el resultado al módulo del apache.

La idea es minimizar el daño que se provocaría al ser explotado un posible fallo del sistema, de esta manera el usuario entraría en el sistema con una cuenta no habilitada, sin permisos de ejecución y sin posibilidad de acceso a otro código o sitios web.

Suphp se puede descargar de http://www.suphp.org/Home.html, descomprimiendo el paquete en /usr/src y compilando con las siguientes opciones:
#>./configure -prefix=/usr \
-with-apxs=/usr/bin/apxs2 \
-with-apache-user=www-data \
-with-php=/usr/lib/cgi-bin/php4 \
-sbindir=/usr/lib/suphp \
-with-logfile=/var/log/suphp/suphp.log \
-with-setid-mode \
-disable-checkpath

Por supuesto necesitaremos tener compilado php para cgi, esto significa volver a compilar php, pero quitando la configuración para apache2 y añadiendo:

-prefix=/usr -enable-force-cgi-redirect -enable-fastcgi \
-with-config-file-path=/etc/php4/cgi

Para configurarlo en apache haremos igual que para ssl, primero comprobamos si está configurado:

#> if [ -h /etc/apache2/mods-enabled/suphp.load ]; then echo "módulo instalado";else echo "módulo no instalado"; fi

Para activarlo haremos lo siguiente:

#>ln -s /etc/apache2/mods-available/suphp.conf /etc/apache2/mods-enabled/suphp.conf
#>ln -s /etc/apache2/mods-available/suphp.load /etc/apache2/mods-enabled/suphp.load

Esto configurará el módulo en apache2 y se podrá utilizar después de recargar el servidor con:

#>/etc/init.d/apache2 restart

La configuración del sitio seguro con suphp incluido quedaría así:

NameVirtual *:443
<VirtualHost *:443>
ServerName gosa.chaosdimension.org
DocumentRoot /usr/share/gosa/html
alias /gosa /usr/share/gosa/html
CustomLog /var/log/apache/gosa.log combined
ErrorLog /var/log/apache/gosa.log
suPHP_Engine on
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/gosa.cert
SSLCertificateKeyFile /etc/apache2/ssl/gosa.key
SSLCertificateChainFile /etc/apache2/ssl/gosa.cert
SSLCertificateKeyFile /etc/apache2/ssl/gosa.key
SSLCACertificateFile /etc/apache2/ssl/gosa.ca
SSLCACertificatePath /etc/apache2/ssl/
SSLLogLevel error
SSLLog /var/log/apache2/ssl-gosa.log
<Directory /usr/share/gosa >
SSLVerifyClient require
SSLVerifyDepth 1
</Directory>
</VirtualHost>

Debemos decidir que usuario vamos a usar, en este caso voy a crear uno llamado gosa, que me sirva para el fin indicado anteriormente:

#useradd -d /usr/share/gosa/html gosa
#passwd -l gosa
#cd /usr/share/gosa
#find /usr/share/gosa -name "*.php" -exec chown gosa ";"
#find /usr/share/gosa -name "*.php" -exec chmod 600 ";"

aescanero AT gmail.com