Skip to main content

Configurações básicas no Apache2 - Parte 3

Dando continuidade nesta série dividida em três partes com um artigo escrito por mim para a revista InfraMagazine da DevMedia em maio de 2011.

Segundo a Wikipédia, hardening é um processo de mapeamento das ameaças, mitigação dos riscos e execução das atividades corretivas com foco na infraestrutura com o objetivo principal de torná-la preparada para enfrentar tentativas de ataque.

Se o servidor vai estar aberto na Internet, tem-se obrigação de mantê-lo seguro. Sem entrar em detalhes de configuração de firewall e de sistema, que seria assunto para outro artigo, deve-se atentar para alguns pequenos detalhes e configurações que podem fazer a diferença no servidor.

Por padrão, em diretórios que não possuem nenhum arquivo index, o Apache lista todos os arquivos existentes nos mesmos. Isto em alguns casos não é de interesse do administrador, seja porque o diretório contém arquivos privados, ou apenas para não permitir que os arquivos que ali se encontram sejam vistos. Esta configuração pode ser realizada em diretórios específicos através do htaccess, mas em algumas situações, a intenção pode ser a de bloquear a listagem de arquivos em todos os diretórios. Para isso, é necessário editar o arquivo /etc/apache2/sites-avaliable/default e alterar os seguintes parâmetros:

AllowOverride None

para:
Oder Deny,Allow
Deny from all
Options None
AllowOverride None

Feitas estas alterações, o Apache deve ser reiniciado com o seguinte comando:

/etc/init.d/apache2 reload

Algumas alterações relativas à segurança ainda podem ser feitas no arquivo security que fica no diretório /etc/apache2/conf.d/security.

Não é de interesse que alguma pessoa mal intencionada consiga informações sobre o servidor muito facilmente. Para evitar que isso aconteça, alguns parâmetros podem ser alterados para restringir o nível de informação que é passado para os clientes. São eles: #### ServerTokens OS

Esta diretiva é responsável pelo nível de informação sobre o servidor será retornada no cabeçalho HTTP. Os parâmetros existentes são: Full | OS | Minimal | Minor | Major | Prod. Onde Full retorna muitas informações como Sistema Operacional e módulos instalados e Prod retorna um mínimo de informações. #### ServerSignature On

Adiciona em páginas geradas pelo servidor (páginas de erro, listagem de arquivos, listagem ftp, etc) uma linha contendo a versão do servidor e o nome do Virtual Host. #### TraceEnable On

Este parâmetro é apenas utilizado para testes e diagnóstico do servidor.

Alterá-los para:

ServerTokens Prod
ServerSignature Off
TraceEnable Off

Sempre que alguma configuração é alterada, o Apache precisa ser reiniciado para carregar os novos parâmetros. ### Utilizando Módulos

Na sua instalação padrão, o Apache traz habilitado muitos módulos que, algumas vezes, não são utilizados. Os módulos disponíveis podem ser vistos em /etc/apache2/mods-avaliable. Já os módulos que estão habilitados ficam em /etc/apache2/mods-enabled.

Como esta questão de módulos a serem utilizados é muito particular e varia em cada caso, será explicado apenas como habilitar e desabilitar os módulos no Apache.

Para habilitar um módulo, deve-se executar o comando:

a2enmod modulo

Por exemplo:

Agora, para desabilitar um módulo, pode-se executar:

a2dismod modulo

Para listar todos os módulos do Apache que estão disponíveis nos repositórios do Ubuntu, execute:

apt-cache search apache2-mod

Habilitando o suporte ao PHP

A instalação padrão do Apache não vem com suporte ao PHP ou a qualquer outra linguagem interpretada. Para habilitar o suporte ao PHP, é necessário realizar a instalação do pacote libapache2-mod_php5 para depois configurá-lo no Apache.

O primeiro passo para isso será abrir um console e digitar o comando:

sudo su

Como já informado, o código acima faz com que todos os comandos sejam realizados com os privilégios do usuário root. Com isso é possível chamar o gerenciador de pacotes e instalar o módulo do PHP:

apt-get install libapache2-mod-php5

Para verificar se o módulo foi realmente instalado, é necessário acessar o diretório /etc/apache2/mods-avaliable. Nele, devem ser listados, entre outros, dois arquivos: php5.conf e php5.load.

Agora que o módulo PHP está instalado no sistema, é possível habilitá-lo no servidor Apache. Para isso, o seguinte comando deve ser executado:

a2enmod php5

Depois de habilitado, os dois arquivos anteriormente descritos (php5.conf e php5.load) receberam links simbólicos no diretório /etc/apache2/mods-enabled. Isto significa que o módulo do PHP5 será carregado na próxima inicialização do Apache, que precisa ser reiniciado com o comando:

/etc/init.d/apache2 restart

Dependendo dos serviços que serão disponibilizados no seu servidor, pode ser necessário alterar algum parâmetro de funcionamento do PHP. Estas alterações são feitas no arquivo php.ini que fica localizado no diretório /etc/php5/apache2.

Para exemplificar, vejamos algumas configurações importantes que podem ser realizadas no php.ini:

Desabilitar ou habilitar o safe mode:

safe_mode = Off

Nota: Safe Mode, ou Modo Seguro, é uma tentativa de resolver um problema de segurança em servidores compartilhados. Com ele, o PHP faz verificações quando trabalha com manipulação de arquivos, verificando a propriedade do script atual e do arquivo a ser alterado. A partir da versão 5.3.0 do PHP este recurso se tornou obsoleto e seu uso desencorajado no próprio manual, na versão 6.0 será completamente removido.

Para determinar a memória que um script PHP pode alocar, utiliza-se o comando memory_limit, prevenindo que algum script mal escrito ou mal intencionado consuma toda a memória do servidor:

memory_limit = 16M

Caso o servidor não seja de testes, mas sim de produção, talvez seja interessante desabilitar a exibição de erros e alertas nas páginas geradas:

display_errors = Off

Ao fazer isto, pode-se querer registrar estes erros em algum lugar e, para isso, é importante habilitar o log de erros:

log_errors = On

Por medida de segurança, também é interessante desabilitar variáveis globais. Isso evita que alguma pessoa mal intencionada, em alguns casos, consiga alterar valores de variáveis, fazendo com que o sistema se comporte de forma anormal:

Mais informações sobre o parâmetro register_globals podem ser encontradas no endereço www.php.net/manual/pt_BR/security.globals.php.

Em sua configuração padrão, o PHP vem com o suporte a upload de arquivos habilitado. Se esta função não for utilizada, pode-se desabilitá-la e evitar um possível problema gerado por alguma pessoa mal intencionada que consiga se aproveitar desse serviço. Para esse ajuste, altere a configuração para:

file_uploads = Off

Mas, caso seja necessário receber arquivos, e mais, arquivos grandes, é necessário alterar o tamanho máximo dos arquivos que podem ser recebidos, por exemplo:

Caso a aplicação utilize sessões, pode ser interessante aumentar o tamanho máximo do tempo de vida de uma sessão que, por padrão, é de 24 minutos. Esta opção é recomendada para sistemas que possuem uma utilização frequente e contínua, como sistemas de tickets, evitando assim que o usuário tenha que se autenticar a todo momento.

session.gc.maxlifetime = 1440 (em segundos)

Enfim, o php.ini é bastante extenso, sendo recomendada a leitura do arquivo. Os comandos e os comentários que se encontram nele podem ser bastante úteis, além de ser uma excelente forma de estudo das possibilidades que as configurações do PHP oferecem. ### Companheiros para o Apache

Claro que o Apache não é único no mundo dos servidores Web. Existem outros softwares que seguem a mesma proposta. Um bom exemplo é o Lighttpd, que pode ser utilizado individualmente ou em conjunto com o Apache.

O Lighttpd (lighttpd.net) é um servidor desenvolvido para ambientes de alta performance. Seu consumo de memória é muito baixo, além de possuir um bom gerenciamento de carga. Entretanto, seu desempenho não é muito bom quando se trata de páginas dinâmicas, como páginas em PHP. Já quando utilizado para prover conteúdo estático, como arquivos .html, .css, .js e imagens, seu desempenho é consideravelmente superior ao Apache. Uma boa combinação é utilizar o Apache para prover conteúdo dinâmico e o Lighttpd para conteúdo estático.

Outro que não é exatamente um Web Server, mas que merece ser lembrado, é o novíssimo HipHop, desenvolvido pelo Facebook. Ele traduz os códigos PHP para C++ e, depois disso, o compila, aumentando assim a velocidade na execução. Mais informações sobre o HipHop podem ser encontradas no endereço: http://developers.facebook.com/news.php?story=358g=1 http://developers.facebook.com/news.php?story=358g=1. ### Conclusões

Uma boa forma de aprender é através da tentativa e erro, pois assim aprende-se o que pode e o que não pode ser feito. Por isso, não se deve ter medo de arriscar e alterar algum parâmetro de configuração. Caso erre em algum ponto, sempre haverá a possibilidade de voltar atrás e recuperar o estado em que tudo estava funcionando corretamente. No entanto, é importante informar que os testes devem ser realizados em ambientes específicos para tal, nunca em servidores de produção, onde um erro de configuração pode gerar um problema mais sério.

Referências

<Securing Apache: Step-by-Step:< http://www.symantec.com/connect/articles/securing-apache-step-step http://www.symantec.com/connect/articles/securing-apache-step-step

<Otimizando seu web server com Apache2 + Lighttpd:< http://www.vivaolinux.com.br/artigo/Otimizando-seu-web-server-com-Apache2-+-Lighttpd http://www.vivaolinux.com.br/artigo/Otimizando-seu-web-server-com-Apache2-+-Lighttpd

<Documentação do Apache em Português do Brasil:< http://httpd.apache.org/docs/2.2/pt-br/ http://httpd.apache.org/docs/2.2/pt-br/

<Tutorial do Nikto, um scanner de vulnerabilidades para WebServers:< http://blog.alexos.com.br/?p=297&lang=pt-br http://blog.alexos.com.br/?p=297&lang=pt-br

<Framework para auditoria de vulnerabilidades em servidores Web:< http://w3af.sourceforge.net/ http://w3af.sourceforge.net/