Securing Apache2/PHP7 on Linux/Unix (Basic)

Publicado por Cristhoffer em 18/05/2016

[ Hits: 1.576 ]

Blog: http://exp0sed.esy.es

 


Securing Apache2/PHP7 on Linux/Unix (Basic)



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:
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:

LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule headers_module modules/mod_headers.so
LoadModule unixd_module modules/mod_unixd.so


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:

<IfModule unixd_module>
User secure
Group secure
</IfModule>

* 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:

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

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
  • file_uploads = Off
  • allow_url_fopen = Off
  • allow_url_include = Off

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.

Análise da estrutura:

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)

Linux: Securing Apache2/PHP7 on Linux/Unix (Basic)

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.

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Serviços desnecessários rodando no S.O. são um risco

Logoff no terminal por inatividade

Liberar o FTP no IPtables

Filtrando porcarias com Squid IV

KeePassX - Proteção para suas senhas

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor HostGator.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Viva o Android

Tópicos

Top 10 do mês

Scripts