PHP Seguridad · 4 min read · Oct 25, 2025

Cómo endurecer PHP5 con Suhosin en CentOS 5.0 - Página 2

4 Instalando Suhosin

Suhosin se puede descargar desde aquí: http://www.hardened-php.net/suhosin/download.html

Para instalar el parche Suhosin, necesitamos recompilar PHP5 desde las fuentes, pero utilizaremos el paquete CentOS 5.0 PHP5.src.rpm para esto (usando el comando rpmbuild), de modo que obtengamos nuevos paquetes PHP5.rpm (con Suhosin) que podemos instalar. De esa manera, no tenemos que preocuparnos por las opciones de configuración correctas de PHP5 porque rpmbuild se encargará de esto.

Pero primero tomamos una copia de la clave de firma de lanzamiento del Proyecto Hardened-PHP e importamos en nuestro llavero de GNU Privacy Guard:

wget http://www.hardened-php.net/hardened-php-signature-key.asc  
gpg --import < hardened-php-signature-key.asc

Luego descargamos un paquete PHP5.src.rpm (que se ajuste a nuestra versión de PHP instalada actualmente, 5.1.6 en este ejemplo) de un espejo de CentOS 5.0 a /usr/src e instalamos:

cd /usr/src  
wget http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.0/updates/SRPMS/php-5.1.6-12.el5.src.rpm

(Como ves arriba, descargo el PHP5.src.rpm más nuevo del directorio updates/ de mi espejo de CentOS; por supuesto, también puedes descargar el original.src.rpm del directorio os/, por ejemplo http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.0/os/SRPMS/php-5.1.6-5.el5.src.rpm. Si lo haces, tendrás que ajustar los nombres de archivo en el resto de este tutorial.)

rpm -ivh php-5.1.6-12.el5.src.rpm

Si recibes advertencias como esta:

warning: user mockbuild does not exist - using root

puedes ignorarla.

A continuación, descargamos el parche Suhosin que se ajuste a nuestra versión de PHP en /usr/src/redhat/SOURCES (puedes encontrar todos los parches disponibles en la página de descargas de Suhosin):

cd /usr/src/redhat/SOURCES  
wget http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.1.6-0.9.6.patch.gz

Ahora deberíamos comprobar que la suma MD5 del parche descargado es idéntica a la publicada en la página de descargas de Suhosin:

md5sum suhosin-patch-5.1.6-0.9.6.patch.gz

Si la suma MD5 está bien, podemos verificar la firma digital así:

wget http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.1.6-0.9.6.patch.gz.sig  
gpg suhosin-patch-5.1.6-0.9.6.patch.gz.sig

Si ves esta línea en la salida:

gpg: Good signature from "Hardened-PHP Signature Key"

todo está bien con el parche descargado, y podemos continuar.

Ahora descomprimimos el parche Suhosin, lo renombramos para que se ajuste al esquema de nombres de CentOS, y modificamos el archivo /usr/src/redhat/SPECS/php.spec para que el comando rpmbuild sepa que debe incluir el parche Suhosin cuando recompila PHP5:

gunzip suhosin-patch-5.1.6-0.9.6.patch.gz  
mv suhosin-patch-5.1.6-0.9.6.patch php-5.1.6-suhosin.patch  
cd /usr/src/redhat/SPECS/  
vi php.spec

Agrega Patch0: php-5.1.6-suhosin.patch a la estrofa donde se enumeran todos los parches y comenta la línea Patch14: php-5.1.6-ecalloc.patch en la misma estrofa (el parche ecalloc entra en conflicto con Suhosin), y luego agrega %patch0 -p1 -b .suhosin a la estrofa %setup -q y comenta la línea %patch14 -p1 -b .ecalloc en la misma estrofa:

| [...] Source51: php.ini Patch0: php-5.1.6-suhosin.patch Patch1: php-5.1.4-gnusrc.patch Patch2: php-5.1.4-warnings.patch Patch5: php-4.3.3-install.patch Patch6: php-5.0.4-norpath.patch Patch7: php-4.3.2-libtool15.patch Patch13: php-5.0.2-phpize64.patch # Patch14: php-5.1.6-ecalloc.patch [...] %setup -q %patch0 -p1 -b .suhosin %patch1 -p1 -b .gnusrc %patch2 -p1 -b .warnings %patch5 -p1 -b .install %patch6 -p1 -b .norpath %patch7 -p1 -b .libtool15 %patch13 -p1 -b .phpize64 # %patch14 -p1 -b .ecalloc [...] |

Ahora recompilamos PHP5:

rpmbuild -ba php.spec

Dependiendo de qué módulos de PHP5 tengas instalados, rpmbuild probablemente se quejará de paquetes faltantes que necesita para construir nuevos paquetes para los varios módulos de PHP5:

[root@server1 SPECS]# rpmbuild -ba php.spec  
cat: /usr/include/httpd/.mmn: No such file or directory  
error: Failed build dependencies:  
        aspell-devel >= 0.50.0 is needed by php-5.1.6-12.i386  
        httpd-devel >= 2.0.46-1 is needed by php-5.1.6-12.i386  
        libjpeg-devel is needed by php-5.1.6-12.i386  
        libpng-devel is needed by php-5.1.6-12.i386  
        pcre-devel >= 4.5 is needed by php-5.1.6-12.i386  
        libc-client-devel is needed by php-5.1.6-12.i386  
        mysql-devel >= 4.1.0 is needed by php-5.1.6-12.i386  
        postgresql-devel is needed by php-5.1.6-12.i386  
        unixODBC-devel is needed by php-5.1.6-12.i386  
        net-snmp-devel is needed by php-5.1.6-12.i386  
        gd-devel is needed by php-5.1.6-12.i386  
        freetype-devel is needed by php-5.1.6-12.i386  
[root@server1 SPECS]#

Si ves un error como este, instala los paquetes faltantes, por ejemplo así:

yum install aspell-devel httpd-devel libjpeg-devel libpng-devel pcre-devel libc-client-devel mysql-devel postgresql-devel unixODBC-devel net-snmp-devel gd-devel freetype-devel

Después, ejecuta rpmbuild nuevamente:

rpmbuild -ba php.spec

Esto debería compilar PHP5 y todos los módulos de PHP5 instalados nuevamente y crear nuevos paquetes .rpm en el directorio /usr/src/redhat/RPMS/i386. Esto puede tardar un tiempo, así que por favor ten paciencia.

Después, podemos instalar los nuevos paquetes PHP5 así:

cd /usr/src/redhat/RPMS/i386  
rpm -Uvh --force php-*

Eso es todo para el parche Suhosin.

Ahora vamos a construir la extensión PHP de Suhosin. Primero descargamos sus fuentes al directorio /usr/src (las fuentes de la extensión Suhosin están disponibles en la página de descargas de Suhosin):

cd /usr/src  
wget http://www.hardened-php.net/suhosin/_media/suhosin-0.9.20.tgz

A continuación, comprobamos la suma MD5 y la firma nuevamente:

md5sum suhosin-0.9.20.tgz
wget http://www.hardened-php.net/suhosin/_media/suhosin-0.9.20.tgz.sig  
gpg suhosin-0.9.20.tgz.sig

Luego descomprimimos las fuentes y construimos la extensión así:

tar xvfz suhosin-0.9.20.tgz  
cd suhosin-0.9.20  
phpize  
./configure  
make  
make install

Para habilitar la extensión Suhosin, creamos el archivo /etc/php.d/suhosin.ini y ponemos la línea extension=suhosin.so en él:

vi /etc/php.d/suhosin.ini

| extension=suhosin.so |

Todo lo que queda por hacer ahora es reiniciar Apache2:

/etc/init.d/httpd restart

Ahora llamemos nuevamente a nuestra página info.php en un navegador (por ejemplo, http://192.168.0.100/info.php). Si todo salió bien, deberías ver a Suhosin mencionado en dos lugares en la página:

Eso es todo. Si lo deseas, puedes configurar Suhosin (ver http://www.hardened-php.net/suhosin/configuration.html), aunque Suhosin funcionará directamente con su configuración predeterminada, así que asegúrate de saber lo que estás haciendo.

5 Enlaces

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.