PHP Security · 4 min read · Oct 25, 2025

Como Endurecer o PHP5 Com Suhosin No CentOS 5.0 - Página 2

4 Instalando Suhosin

Suhosin pode ser baixado daqui: http://www.hardened-php.net/suhosin/download.html

Para instalar o patch Suhosin, precisamos recompilar o PHP5 a partir das fontes, mas usaremos o pacote CentOS 5.0 PHP5.src.rpm para isso (usando o comando rpmbuild), para que possamos obter novos pacotes PHP5.rpm (com Suhosin) que podemos instalar. Assim, não precisamos nos preocupar com as opções de configuração do PHP5, pois o rpmbuild cuidará disso.

Mas primeiro, pegamos uma cópia da chave de assinatura do lançamento do Projeto Hardened-PHP e a importamos para o nosso chaveiro do GNU Privacy Guard:

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

Em seguida, baixamos um pacote PHP5.src.rpm (que se adapta à nossa versão do PHP instalada, 5.1.6 neste exemplo) de um espelho do CentOS 5.0 para /usr/src e o 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 você vê acima, eu baixo o mais novo PHP5.src.rpm do diretório updates/ do meu espelho CentOS; claro, você também pode baixar o original.src.rpm do diretório os/, por exemplo, http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.0/os/SRPMS/php-5.1.6-5.el5.src.rpm. Se você fizer isso, terá que ajustar os nomes dos arquivos no restante deste tutorial.)

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

Se você receber avisos como este:

warning: user mockbuild does not exist - using root

você pode ignorá-lo.

Em seguida, baixamos o patch Suhosin que se adapta à nossa versão do PHP para /usr/src/redhat/SOURCES (você pode encontrar todos os patches disponíveis na página de downloads do Suhosin):

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

Devemos verificar agora se a soma MD5 do patch baixado é idêntica à publicada na página de downloads do Suhosin:

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

Se a soma MD5 estiver ok, podemos verificar a assinatura digital assim:

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

Se você ver esta linha na saída:

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

tudo está ok com o patch baixado, e podemos prosseguir.

Agora descompactamos o patch Suhosin, renomeamos para que se encaixe no esquema de nomenclatura do CentOS e modificamos o arquivo /usr/src/redhat/SPECS/php.spec para que o comando rpmbuild saiba que deve incluir o patch Suhosin ao reconstruir o 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

Adicione Patch0: php-5.1.6-suhosin.patch à estrofe onde todos os patches estão listados e comente a linha Patch14: php-5.1.6-ecalloc.patch na mesma estrofe (o patch ecalloc entra em conflito com o Suhosin), e então adicione %patch0 -p1 -b .suhosin à estrofe %setup -q e comente a linha %patch14 -p1 -b .ecalloc na mesma estrofe:

| [...] 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 [...] |

Agora reconstruímos o PHP5:

rpmbuild -ba php.spec

Dependendo dos módulos PHP5 que você tem instalados, o rpmbuild provavelmente reclamará sobre pacotes ausentes que precisa para construir novos pacotes para os vários módulos 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]#

Se você ver um erro como este, instale os pacotes ausentes, por exemplo, assim:

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

Depois, execute o rpmbuild novamente:

rpmbuild -ba php.spec

Isso deve agora compilar o PHP5 e todos os módulos PHP5 instalados novamente e criar novos pacotes .rpm no diretório /usr/src/redhat/RPMS/i386. Isso pode levar algum tempo, então, por favor, seja paciente.

Depois, podemos instalar os novos pacotes PHP5 assim:

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

É isso para o patch Suhosin.

Agora vamos construir a extensão PHP Suhosin. Primeiro, baixamos suas fontes para o diretório /usr/src (as fontes da extensão Suhosin estão disponíveis na página de downloads do Suhosin):

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

Em seguida, verificamos a soma MD5 e a assinatura novamente:

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

Então descompactamos as fontes e construímos a extensão assim:

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

Para habilitar a extensão Suhosin, criamos o arquivo /etc/php.d/suhosin.ini e colocamos a linha extension=suhosin.so nele:

vi /etc/php.d/suhosin.ini

| extension=suhosin.so |

Tudo o que resta a fazer agora é reiniciar o Apache2:

/etc/init.d/httpd restart

Agora vamos chamar nossa página info.php novamente em um navegador (por exemplo, http://192.168.0.100/info.php). Se tudo correu bem, você deve agora ver o Suhosin mencionado em dois lugares na página:

É isso. Se você quiser, pode configurar o Suhosin (veja http://www.hardened-php.net/suhosin/configuration.html), embora o Suhosin funcione fora da caixa com sua configuração padrão, então tenha certeza de que você sabe o que está fazendo.

5 Links

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.