Securing Apache2/PHP7 on Linux/Unix (Basic)

1. Securing Apache2/PHP7 on Linux/Unix (Basic)

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/04/2016 - 07:44h

E ae pessoal, tudo nice? espero que sim.
Vamos direto ao ponto então;
O objetivo deste texto é compilar e configurar o Apache2 com PHP7 de uma maneira um pouco mais segura do que a default, mais como um pontapé para o administrador iniciante ter uma melhor noção.

Visto que atualmente o Apache faz uma instalação segura por padrão em comparativo a algumas versões anteriores decidi escrever esse texto me baseando na ultima versão stable do Apache/PHP (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 chegou o momento da parte legal :)
Vamos ao Apache2!
Após ler algumas das novas opções, cheguei ao seguinte esquema básico de configuração;

BSD4LIFE# ./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

Detalhando 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 e diretivas antes da compilação que não usarei no servidor. Posteriormente eu irei explicar o porquê de mudar os diretórios padrões.

Compilado e instalado com sucesso, vamos criar um usuário para o bixinho poder rodar sem medo.

BSD4LIFE# 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 ativado:

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 path seguro (explicarei posteriormente):

DocumentRoot "/secure/server"
<Directory "/secure/server">

Adicionei o usuário e grupo (criados no começo) para executar o servidor:

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

Já que vamos usar o Apache com PHP, adicione logo a diretiva FilesMatch para interpretação:

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

Vamos ao PHP7!
Em relação ao php, fiz uma configuração bem básica, apenas com o intuito de demonstrar.
Observe:

BSD4LIFE# ./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 php.ini para o path de configuração especificado:

BSD4LIFE# 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 e configurar as diretivas de acordo com sua necessidade!

Feito esses procedimentos básicos, vamos mudar o dono e as permissões do webserver path/conf:

BSD4LIFE# chown root /secure/ /secure/server/
BSD4LIFE# chmod 441 /secure/server/ /opt/secure/cf/;ls -li /secure/
12058626 dr--r----x 3 root root 4096 Apr 25 01:10 server

e arquivos:

BSD4LIFE# chown root /secure/server/index.php
BSD4LIFE# chmod 444 /secure/server/index.php;ls -li /secure/server/
12058628 -r--r--r-- 1 root root 247 Apr 25 01:20 index.php
BSD4LIFE# chmod 441 /opt/secure/cf/sec.conf /opt/secure/cf/php.ini

Assim você evita que os arquivos do seu servidor possam ser editados/manipulados por outros usuários/atacantes logados no seu sistema.
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 (virtual hosts, file extensions, funções desativadas, server path e etc) do Apache e do PHP (esse é o motivo de mudar diretórios padrões), e agora sem permissões de leitura/escrita no nosso server.

Análise da estrutura:

Apache2 user bin: /etc/sec/ub/
Apache2 system bin: /etc/sec/sb/
Apache2/PHP7 conf dir: /opt/secure/cf
Apache2 ServerRoot: /opt/secure/
Apache2 DocumentRoot: /secure/server/
Apache2 user: secure
Apache2 file permitions/owner files: 441, 444/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:

Altere as permissões de leitura apenas para root de todos os arquivos de configuração para melhor segurança.
Se for habilitar o suporte ao banco de dados existe medidas de segurança diferentes nas configurações.
Você também pode usar o OpenSSL e criar certificados para aumentar a segurança.
Detalhe que neste texto eu desativei apenas algumas funções do php, existem muitas outras funções de risco (HEHE).
Eu até poderia falar sobre módulos vulneráveis do Apache e funções que podem ser exploradas e manipuladas no PHP, mas a ideia deste texto é manter um servidor seguro e não explora-lo, fica pra próxima.

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 que não é o ideal seguir esses passos a "risca".

Imagem: http://i.imgur.com/wfRVIFJ.png


--
Just bring us some beers, and then we can talk about our systems. :)


  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts