Securing Apache2/PHP7 on Linux/Unix (Basic) [Dica]
Publicado por Cristhoffer em 18/05/2016
[ Hits: 2.112 ]
E aí pessoal, tudo nice? Espero que sim. Vamos direto ao ponto então.
O objetivo desta dica é compilar e configurar o Apache2 com PHP7 de uma maneira um pouco mais segura do que a padrão, com foco para iniciantes.
Visto que, atualmente, o Apache faz uma instalação segura por padrão em comparativo a algumas versões anteriores, decidi escrever essa dica me baseando no Apache/PHP stable recente (why not?).
Vamos baixar logo os dois de uma vez:
http://mirror.nbtelecom.com.br/apache/httpd/httpd-2.4.20.tar.gz (Apache2)
https://httpd.apache.org/docs/current/programs/configure.html
http://php.net/get/php-7.0.5.tar.gz/from/a/mirror (PHP7)
http://php.net/manual/pt_BR/configure.about.php
Baixados e extraídos, vamos partir para a parte legal. :)
Após ler algumas das novas opções, cheguei ao seguinte esquema de configuração:
# ./configure --prefix=/opt/secure --bindir=/etc/sec/ub --sbindir=/etc/sec/sb --sysconfdir=/opt/secure/cf --with-program-name=sec --disable-env --disable-setenivf --disable-autoindex --disable-cgi --disable-alias --disable-status;make;make install
Vamos detalhar um pouco:
Mudei o diretório padrão do Apache para /opt/secure/, mudei os binários para as respectivas pastas em /etc/sec/* e a pasta de configuração passou a ser /opt/secure/cf, binário principal de execução do servidor compilado como "sec", desativado alguns módulos antes da compilação que não usarei no servidor. Posteriormente, eu irei explicar o por quê de mudar os diretórios padrões.
Compilado e instalado com sucesso, vamos criar um usuário para o 'bichinho' poder rodar sem medo.
# useradd secure -p secure -C "Secure Server" -U -d /dev/null -s /bin/nologin
Feito isso, vamos ao nosso "httpd.conf" (no meu caso: /opt/secure/cf/sec.conf) verificar alguns detalhes por ordem.
Módulos ativados:
Recomendo pesquisar nos docs do Apache todos os módulos e saber o que é realmente necessário para o seu servidor, antes de sair desativando tudo.
Alterado diretiva DocumentRoot para o meu caminho seguro (explicarei posteriormente):
DocumentRoot "/secure/server"
<Directory "/secure/server">
Adicionei o usuário e grupo (criados no começo) para executar o secure server:
* Detalhe: se você desativar o "módulo mod_unixd", essa diretiva não funciona.
Já que vamos usar o Apache com PHP, adicione logo a diretiva FilesMatch para interpretação:
Feito esses procedimentos básicos, vamos mudar as permissões da pasta onde ficarão os arquivos acessíveis do servidor:
# chmod 441 /secure/server;ls -li /secure/
12058626 dr--r----x 3 root root 4096 Abr 25 01:10 server
Altere o dono dos arquivos do DocumentRoot para root, assim você evita que seus arquivos do seu servidor possam ser editados/manipulados por outros usuários logados no seu sistema, ou atacantes.
Bom, com essa configuração simples, já conseguiremos confundir a mente de um script kiddie no nosso servidor, sendo que ele não vai saber onde estão os arquivos de conf e de execução (virtual hosts, file extensions, path root, binários etc) do Apache (esse é o motivo de mudar diretórios padrões), e sem permissões de escrita no nosso server.
Vamos ao PHP7
Em relação ao PHP7, não sei quais opções estão depreciadas, mas essa é minha compilação segura padrão para o PHP:
# ./configure --prefix=/opt/secure/php --with-apxs2=/etc/sec/ub/apxs --with-config-file-path=/opt/secure/cf --disable-cgi --disable-fileinfo --disable-cli --disable-short-tags;make;make install
Compilado e instalado com sucesso!
Atualmente, o PHP em conjunto com o apxs copia e adiciona o módulo automaticamente ao *.conf do Apache, facilitando a vida do iniciante que antes tinha que descobrir se o módulo realmente vinha com o PHP, copia-lo ou baixa-lo e adiciona-lo. Agora o PHP faz isso pra você.
Tendo isso em mente e já tendo o PHP instalado e funcionando com o Apache, vamos configura-lo (certifique-se de estar funcionando).
Copiando arquivo de configuração do php para o local correto:
# cp /opt/php-7.0.5/php.ini-development /opt/secure/cf/php.ini
No PHP existem diretivas que merecem alguma atenção:
disable_functions = phpinfo,passthru,exec,shell_exec,system,opendir,dir,opendir,readdir,curl_exec,proc_open,popen,show_source
Existem várias outras que podem ser alteradas para melhor segurança. Lembrando que fica a seu critério desativar/ativar as funções que você não for usar. Configurar as diretivas de acordo com sua necessidade.
Apache2 user bin: /etc/sec/ub/
Apache2 system bin: /etc/sec/sb/
Apache2/PHP7 conf dir: /op/secure/cf
Apache2 ServerRoot: /opt/secure/
Apache2 DocumentRoot: /secure/server/
Apache2 user: secure
Apache2 file permitions/owner files: 441/root
PHP7 root: /opt/secure/php
PHP7 disable_functions: phpinfo,passthru,exec,shell_exec,system,opendir,dir,readdir,curl_exec,proc_open,popen,show_source
Detalhes diretiva Apache2:
--disable-autoindex (desativa listagem de diretórios)
Detalhes diretiva PHP7:
--disable-short-tags (desativa tag "<?" sendo obrigatório o uso de "<?php").
--with-apxs2 (Apache extension tool 2)
Conclusão e observação
Para habilitar o suporte a banco de dados, existem medidas de segurança diferentes nas configurações do Apache (httpd.conf) e do PHP (php.ini), porém, nada melhor como um script escrito corretamente.
Você também pode usar o OpenSSL e criar certificados para aumentar a segurança.
Depois de compilado, você também pode alterar a configuração de ambos. Disponibilizei aqui apenas um método prático e rápido, todavia, não é o ideal seguir esses passos à risca.