Configurações básicas no Apache2
Instalação, configurações, desempenho e segurança em Sistemas Linux


O Apache é um software multiplataforma e pode ser instalado nos principais siste-mas operacionais disponíveis no mercado, como Linux, BSDs, Windows, entre outros me-nos populares. Por ser um software robusto, logo se pensa que exige um hardware muito poderoso para funcionar adequadamente. É aí que os inexperientes se enganam.
O Apache é um servidor web open source extremamente confiável e que tem suas funcionalidades expansíveis através de módulos que podem ser adicionados na medida em que se tornam necessários. Seu nome na verdade é Apache HTTP Server (veja seção Links), mas é popularmente conhecido como Apache.
O principal objetivo deste artigo é apresentar um conjunto de operações básicas no Apache, especialmente no que diz respeito à instalação, configuração, desempenho e segurança.
Servidor Web Apache
O Apache é hoje um dos mais respeitados softwares Open Source existentes no mer-cado, sendo um concorrente direto do IIS (veja seção Links), desenvolvido pela Microsoft.
Sua qualidade fica claramente estampada quando analisamos sua utilização a nível global na Internet. Segundo o site Netcraft (veja seção Links), em Janeiro de 2010, 53,84% dos sites existentes na internet rodavam sob o Apache, contra 24,08% do IIS.
Uma vantagem, que é maior que o dobro do segundo colocado, prova a excelência desta aplicação e a qualidade que um software open source pode obter quando possui um desenvolvimento maduro e sério.
O principal fator relacionado à performance é o número de instâncias do servidor httpd. O Apache suporta um grande número de instâncias simultâneas, onde cada uma é relacionada a um cliente acessando o servidor.
Na verdade, o gargalo acaba se localizando na velocidade do link e, dependendo das páginas servidas, no hardware. Códigos PHP mal escritos e scripts CGI podem elevar a carga do processador e, multiplicando pelo número de instâncias simultâneas fazendo essas requisições, tem-se um verdadeiro problema. Por este motivo é possível afirmar que um servidor bem configurado não é sinônimo de desempenho superior.
Como já informado, o Apache oferece suporte a módulos que, quando instalados, a-dicionam funcionalidades ao servidor. Como exemplos, pode-se citar o mod_php, mod_python, mod_ftp, entre outros. A variedade de módulos é muito grande e pode ser consultada diretamente no site do projeto (veja seção Links).
Serão apresentadas duas formas de instalação do Apache no Linux. A primeira delas é compilando o servidor a partir do código fonte, e a segunda é através de um gerenciador de pacotes. Optou-se por utilizar o Ubuntu (veja seção Links) por ser a distribuição Linux mais popular hoje em dia.
Compilando os fontes
Este artigo parte do princípio que o leitor está familiarizado com a compilação de al-gum software ou, ao menos detém as noções básicas, além de possuir os pacotes para rea-lizar tal procedimento.
Em caso de dúvidas, no Ubuntu, é necessário instalar o pacote build-essential para que seja possível compilar os arquivos do Apache. Para isto, execute o comando:
# apt-get install build-essential

Quando este artigo foi escrito, a versão estável era a 2.2.16. No entanto, as configura-ções realizadas são válidas para qualquer versão do Apache2.
É possível baixar o arquivo pelo browser ou pelo terminal. Lembre-se, geralmente servidores não possuem interface gráfica instalada. Dessa forma, seguiremos a segunda opção.
Para realizar o download do pacote, execute o comando:
# wget http://linorg.usp.br/apache/httpd/httpd-2.2.14.tar.gz

Agora é necessário efetuar a transformação em Super Usuário, através do comando:
# sudo su

Assim será possível executar todos os comandos sem nenhum tipo de problema. Po-rém, muito cuidado com os comandos que serão utilizados: como root nada impedirá você de fazer alterações indevidas no sistema.
Neste momento é necessário descompactar o arquivo baixado. Para isso, execute o comando abaixo para armazenar os arquivos no diretório /usr/src:
# tar -zxvf httpd-2.2.14.tar.gz -C /usr/src

Observe que foi utilizado o parâmetro “-C” para especificar o destino dos arquivos que estão sendo extraídos do pacote.
Feito isso, deve-se acessar esse diretório:
# cd /usr/src/httpd-2.2.14/

Seguindo a proposta do artigo, esta instalação será básica, ou seja, não serão instala-dos módulos e/ou adicionadas funções extras ao Apache. Entretanto, caso tenha interesse de habilitar ou desabilitar algumas opções já na instalação, pode fazê-lo com o comando:
# ./configure --help

Agora, devem ser executados os três comandos básicos necessários para a compila-ção:
# ./configure
# make
# make install

Aguarde, dependendo do seu computador, isto pode levar alguns minutos. Concluído este processo, o servidor será instalado no diretório padrão que é /usr/local/apache2.
Para levantar o serviço com as configurações padrão, execute o comando:
# /usr/local/apache2/bin/apachectl start

Após estes passos o Apache deve ter sido compilado com sucesso. Agora, ao acessar o endereço 127.0.0.1 com um navegador será exibida uma mensagem de confirmação, mostrando que o servidor está funcionando.
Instalando através do Gerenciador de Pacotes Synaptics
Este artigo foi escrito utilizando como base de testes a distribuição Linux Ubuntu, porém os mesmos passos podem ser aplicados a outras distribuições derivadas do Debian.
Para realizar a instalação é necessário acessar o menu Sistema > Administração > Ge-renciador de Pacotes Synaptic, pesquisar por “Apache” e depois selecionar o pacote “Apa-che2”. Em seguida é só aplicar e esperar o sistema realizar todo o trabalho.
Caso esteja utilizando o terminal, este processo pode ser feito com o comando:
# apt-get install apache2

A instalação via gerenciador de pacotes é visivelmente mais simples e torna todo ge-renciamento mais fácil, visto que atualizações e patches de segurança são aplicadas e insta-ladas automaticamente. A compilação (apresentada no tópico anterior) só se faz necessá-ria quando o administrador deseja customizar ao máximo o servidor.
Configurações Básicas
Depois da instalação padrão, o Apache já pode ser utilizado normalmente, eliminan-do a necessidade de inúmeras configurações adicionais. Para testá-lo, basta abrir o seu browser e acessar o endereço http://localhost. Neste momento você verá uma mensagem de confirmação do Apache.
O próximo passo será realizar algumas alterações no httpd.conf e demonstrar como habilitar o suporte a módulos, que estendem as possibilidades de utilização do servidor. Como exemplo, será instalado o módulo do PHP5, por este ser um dos recursos mais utilizados no Apache e pelo PHP ser uma das principais linguagens de programação voltadas à internet atualmente.
Quando o Apache é compilado, o arquivo de configuração é um só, o httpd.conf. Na instalação via gerenciador de pacotes no Ubuntu, esse arquivo é fragmentado para facilitar sua utilização. Todas as configurações citadas neste artigo podem ser realizadas em qualquer um dos ambientes, porém, a base será na configuração fragmentada que, de certa forma, acaba sendo um pouco mais complexa.
Os arquivos de configuração encontram-se no diretório /etc/apache2.
ServerName
Nossa primeira alteração no httpd.conf será o parâmetro ServerName. Este parâmetro é utilizado quando o servidor Apache irá responder por um endereço do tipo www.meusite.com.br. Na instalação padrão, o ServerName não é especificado, ficando a crité-rio do administrador utilizá-lo ou não. Este parâmetro pode ser inserido no início do ar-quivo de configuração apache2.conf da seguinte forma:
ServerName "www.meusite.com" (caso seja uma URL) ou
ServerName "111.11.111.11" (caso seja um IP)
Virtual Hosts
Mas o que fazer se o servidor for responder por mais de um site ou possuir subdo-mínios? Neste caso deve-se editar outro arquivo, responsável pelos Virtual Hosts dentro do Apache, que pode ser encontrado no diretório /etc/apache2/sites-available/default.
Na configuração padrão, existe um Virtual Host configurado que é responsável pelo domínio padrão do seu servidor. Um novo Virtual Host pode ser configurado apenas co-piando as configurações de um já existente e alterando o parâmetro Document Root, que indica o diretório onde ficarão armazenados os respectivos arquivos.
Existe também a possibilidade de criar diferentes arquivos ao invés de utilizar o ar-quivo default. Se isso for feito, para que o Apache reconheça este arquivo, precisa-se adi-cioná-lo à lista de sites habilitados com o comando:
# a2ensite nome-do-arquivo

Depois é necessário fazer com que o Apache recarregue as configurações e reconheça o novo arquivo com os novos Virtual Hosts. Isto pode ser feito através do comando:
# /etc/init.d/apache reload

Dentro de cada Virtual Host é possível configurar diversos "subdiretórios" entre os parâmetros . Dessa forma pode-se criar configurações personali-zadas para determinados diretórios ou até apontá-los para outros lugares.
Um exemplo de configuração de um Virtual Host no Apache pode ser visto na Lista-gem 1.

Listagem 1. Exemplo de Configuração de um Virtual Host.

        ServerAdmin seu-email@meusite.com.br

        ServerName www.meusite.com.br
        ServerAlias meusite.com.br www.meusite.com.br
        DocumentRoot /var/www/meusite.com.br

        ExpiresActive On
       
                ExpiresDefault "access plus 1 year"
       

       
                Options -FollowSymLinks +SymLinksIfOwnerMatch
                AllowOverride None
                Deny from all
      

        CustomLog /var/log/apache2/meusite.com.br.log combined


Na Listagem 1 é possível observar a configuração para o domínio www.meusite.com.br. Nele foram adicionados alguns parâmetros para melhorar o acesso ao site, são eles:
•    ServerAlias: Parâmetro que permite que o site responda em mais de um endereço. Configura-se esse parâmetro para que o site responda também sem o www na frente do endereço. Muitos administradores se esquecem de fazer isto e quando o usuário tenta acessar o site sem utilizar o www o Apache retorna um erro;
•    ExpiresActive: Esta funcionalidade do Apache é um recurso muito interessante e pouco utilizado. Com ele, pode-se determinar o tempo que o browser do cliente fa-rá cache de determinados tipos de arquivo, reduzindo assim a quantidade de requisições feitas ao servidor, sem falar na velocidade de carregamento do site, que será visivelmente incrementada. Pode não parecer, mas pequenas configurações como esta muitas vezes não são feitas pelos administradores e acabam gerando um elevado número de requisições repetidas e desnecessárias ao servidor Web.
Hardening
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 ad-ministrador, 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 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-available/default e alterar os seguintes parâmetros:
Options FollowSymLinks
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, localizado no diretório /etc/apache2/conf.d/security.
Não é interessante que alguma pessoa mal intencionada consiga informações sobre o servidor facilmente. Para evitar que isso aconteça, alguns parâmetros podem ser alte-rados 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 que será retornado no cabeçalho HTTP. Os parâmetros existentes são: Full, OS, Minimal, Minor, Major e Prod. Onde Full retorna muitas informações como o Sistema Operacional e os módulos instalados e Prod retorna o mínimo de informações;
•    ServerSignature On: Adiciona em páginas geradas pelo servidor (páginas de erro, listagem de arquivos, 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.

Altere estes três parâmetros para:
ServerTokens Prod
ServerSignature Off
TraceEnable Off

Como de costume, sempre que alguma configuração é alterada o Apache precisa ser reiniciado para carregar os novos parâmetros.

Veja na vídeo aula deste artigo algumas dicas sobre como aumentar a segurança do seu servidor web.
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-available. 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:
# a2enmod php5

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-available. 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 reinici-ado com o comando:
# /etc/init.d/apache2 restart

Dependendo dos serviços que serão disponibilizados no seu servidor, pode ser ne-cessá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 reali-zadas no php.ini.
Desabilitar ou habilitar o safe mode:
safe_mode = Off

Safe Mode: Safe Mode, ou Modo Seguro, é uma tentativa de resolver um problema de segurança em servi-dores 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 de-sabilitar 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, é im-portante 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:
register_globals = Off

Mais informações sobre o parâmetro register_globals podem ser encontradas no ende-reço (veja seção Links).
Em sua configuração padrão, o PHP vem com o suporte a upload de arquivos habili-tado. 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 al-terar o tamanho máximo dos arquivos que podem ser recebidos, por exemplo:
upload_max_filesize = 5M

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 é recomen-dada para sistemas que possuem uma utilização frequente e contínua, evitando assim que o usuário tenha que se autenticar a todo o momento:
session.gc.maxlifetime = 1440 (em segundos)

Enfim, o php.ini é bastante extenso, sendo recomendada a leitura do arquivo. Os co-mandos 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 soft-wares que seguem a mesma proposta. Um bom exemplo é o Lighttpd, que pode ser utili-zado individualmente ou em conjunto com o Apache.
O Lighttpd (veja seção Links) é um servidor desenvolvido para ambientes de alta performance. Seu consumo de memória é muito baixo, além de possuir um bom gerenci-amento de carga. Entretanto, seu desempenho não é muito bom quando se trata de pági-nas 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 no-víssimo HipHop (veja seção Links), desenvolvido pelo Facebook. Ele traduz os códigos PHP para C++ e, depois disso, o compila, aumentando assim a velocidade na execução.
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 possibili-dade 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 espe-cíficos para tal, nunca em servidores de produção, onde um erro de configuração pode gerar um problema mais sério.


Links
Apache HTTP Server:
http://httpd.apache.org
Módulos Apache:
modules.apache.org
IIS:
www.iis.net
Netcraft:
www.netcraft.com
Ubuntu:
www.ubuntu.com
Parâmetro register_globals do PHP:
www.php.net/manual/pt_BR/security.globals.php
Lighttpd:
www.lighttpd.net
HipHop:
http://developers.facebook.com/news.php?story=358&blog=1

Referências
Securing Apache: Step-by-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
Documentação do Apache em Português do Brasil:
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〈=pt-br
Framework para auditoria de vulnerabilidades em servidores Web:
http://w3af.sourceforge.net/