Securing Apache2/PHP7 on Linux/Unix (Basic)

Publicado por Perfil removido em 18/05/2016

[ Hits: 3.253 ]

 


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

Instalando Bashtop no Ubuntu 20.04 Sem Usar Snaps

Como Instalar QGIS no OpenSUSE Leap 15.1 e Tumbleweed

Instalando imagem de fundo no grub 2

PHP orientado a objeto com MySQL e AJAX - Seleção de estado e cidade

Driver NVIDIA no Linux Mint 17

Leitura recomendada

Bloqueando totalmente o MSN com Squid + Iptables

PUCK: Uma distribuição Linux com as melhores ferramentas de teste de intrusão

Wow! My DNS is POOR! Vulnerabilidade do DNS (CVE-2008-1447)

Trancando arquivos criados VIM/VI

Ferramentas e informações para correção do bug do OpenSSL (HeartBleed)

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts