O mais importante a termos em conta, quando se trata de segurança de qualquer sistema é mantermos tanto quanto possível actualizados todos os pacotes de software que utilizamos.
Posto isto, temos também de ter em conta que existem alguns processos que nos permitem ter os sistemas configurados de forma mais segura, ou que de outra forma dificultam o trabalho daqueles que querem entrar nos nossos sistemas.
Em relação ao Apache convém consultar as Security Tips.
Além do sugerido nas dicas sobre segurança do Apache também costumo fazer o seguinte em servidores em produção:
Em várias situações, o Apache devolve uma string com a identificação do servidor, por exemplo quando gera um erro:
Not Found The requested URL /teste/ was not found on this server. Apache/2.2.3 (Debian) PHP/4.4.4-8+etch4 mod_ssl/2.2.3 OpenSSL/0.9.8c Server at example.com Port 80
A quantidade de informação presente na assinatura do servidor é definida pela variável de configuração ServerTokens. Normalmente defino esta variável como:
ServerTokens Prod
Neste caso a informação devolvida é:
Not Found The requested URL /teste/ was not found on this server. Apache Server at example.com Port 80
Se quisermos desligar completamente esta configuração, podemos usar a variável ServerSignature:
ServerSignature Off
Neste caso a resposta do servidor seria apenas:
Not Found The requested URL /teste/ was not found on this server.
Nos sistemas Debian basta modificar os valores destas variáveis em /etc/apache2/apache2.conf e re-iniciar o servidor com:
# /etc/init.d/apache2 restart
ATENÇÃO: nos sistemas SuSE estas configurações são feitas no ficheiro /etc/sysconfig/apache2 (que não faz parte da distribuição standard do Apache). Temos que neste ficheiro mudar a variável:
APACHE_SERVERTOKENS="Prod"
e/ou:
APACHE_SERVERSIGNATURE="Off"
Depois basta reiniciar o servidor com:
# rcapache2 restart
Ao reiniciar o apache, vão ser gerados os ficheiros de configuração que residem na directoria /etc/apache2/sysconfig.d. Um desses ficheiros, global.conf, vai conter as variáveis que discutimos antes.
Outro procedimento que costumo fazer, é desligar a possibilidade que o Apache tem de listar o conteúdo de directorias que não têm um index.html.
Isto pode-se fazer de duas formas. Podemos em cada directoria que temos configurada usar a directiva de configuração "Options -Indexes". isto faz sentido se quisermos ter uma directoria que usa a funcionalidade do Apache para mostrar o respectivo conteúdo.
Por exemplo, na nossa definição de host virtual podemos ter:
<Directory "/arquivo/www/example.com/htdocs"> Options -Indexes FollowSymLinks Includes # Config do htaccess AllowOverride All # Geral Order allow,deny Allow from all </Directory>
E definir uma outra directoria onde temos esta funcionalidade activada:
Alias /downloads /arquivo/www/example.com/downloads <Directory "/arquivo/www/example.com/downloads"> Options Indexes # Config do htaccess AllowOverride All # Geral Order allow,deny Allow from all </Directory>
A outra forma de desligarmos a listagem de directorias consiste simplesmente em desactivar o módulo responsável por esta funcionalidade. O módulo em causa é o autoindex.
No Debian apenas temos de fazer:
# a2dismod autoindex
E reiniciar o servidor Apache:
# /etc/init.d/apache2 restart
No SuSE temos de editar o ficheiro /etc/sysconfig/apache2 e remover "autoindex" da variável APACHE_MODULES e reiniciar o Apache como se mostrou antes.
Utilizando o comando apache2ctl podemos consultar vários parâmetros da configuração do Apache. A partir da versão 2.2 do Apache, podemos ver quais os módulos que estão carregados:
# apache2ctl -t -D DUMP_MODULES Loaded Modules: core_module (static) log_config_module (static) [snip ...] logio_module (static) ssl_module (shared) status_module (shared) Syntax OK
Todos os módulos que não são utilizados devem ser removidos da configuração, quer por motivos de segurança, quer por motivos de performance. A técnica aplicada para os remover é igual à que se mostrou para o módulo "autoindex".
Um dos módulos que costumo sempre remover é o userdir que permite aos utilizadores terem uma página pessoal por baixo da sua home directory, numa directoria pré-definida (normalmente ~/public_html). Não gosto de ter isto ligado porque os utilizadores têm tendência a colocar nessa directoria documentos sensíveis, quando descobre que podem a eles aceder remotamente...