Total Security - totalsecurity.com.br
Gerais
Segunda - 15 de Dezembro de 2003 às 03:07
Por: Informante

    Imprimir


Este artigo mostra passo-a-passo como instalar e configurar com segurança o servidor web Apache 1.3.x, migrando ou corrigindo quando se achar novas vulnerabilidades. Essa é uma série de três publicações de instalação segura: Apache, PHP e MySQL.Funcionalidade:

Antes de começar, devemos especificar que tipo funcionalidades esperamos do servidor. A variedade do uso do Apache dificulta a escrita de um procedimento universal para segurança, então neste artigo teremos as seguintes funcionalidades:

O servidor será acessível na web, suportando mecanismos de virtual hosting e somente páginas estáticas HTML serão servidas, através de IP/usuários selecionados. Também serão logados qualquer tipo de requisição web, incluindo informações sobre web browsers.

Vale a pena lembrar que o modelo proposto não oferece suporte à PHP, JSP, CGI ou qualquer outra tecnologia capaz de interagir com serviços web. O uso de tais tecnologias pode acarregar numa grande ameaça da segurança, de modo que um script, mesmo pequeno, pode diminuir radicalmente o nível de segurança de usuários. Por que? Primeiramente, aplicações ASP/CGI podem conter vulnerabilidades como SQL Injection, cross-site scripting, etc. Em segundo lugar, a própria tecnologia pode ser perigosa (falhas nos módulos PHP, Perl, etc), por isso é recomendado o uso dessas tecnologia somente quando for absolutamente necessária a interação com site da web.


Metas de Segurança:

Um dos elementos mais importantes de cada projeto é a especificação de segurança. As suposições tratadas em nosso servidor web serão as seguintes:

- O sistema operacional deve ser o mais confiável possível, tanto para falhas locais quanto para remotas;
- O único serviço oferecido será HTTP (porta 80);
- Acesso remoto ao servidor deve ser controlado por algum firewall;
- O servidor Apache deve ser o único serviço disponível no sistema;
- Somente módulos necessários devem ser habilitados;
- O usuário deve divulgar a menor quantidade de informação possível sobre o servidor (segurança pela obscuridade);
- O servidor deve rodar sob apenas um único UID/GID;
- Deve ser limitado o acesso ao sistema de arquivos (chroot);
- Nenhum programa shell deve estar presente no ambiente do Apache.


Instalando o Sistema Operacional:

Antes de instalar o Apache, devemos escolher um sistema operacional em que o servidor irá rodar. Nós temos uma grande variedade de escolha, já que o Apache pode ser compilado e instalado na maioria dos sistemas operacionais. No decorrer do artigo é instruído como deixar seguro o servidor Apache em um FreeBSD, porém os métodos descritos são possivelmente aplicados em qualquer sistema Unix/Linux. Há um único sistema que não recomendo a instalação do Apache: MS Windows, por sua potencialidade limitada em deixá-lo seguro.

O primeiro passo em deixar o servidor web seguro é fazer com que o sistema operacional fique seguro. Uma discusão sobre isso está além do escopo desse artigo, entretando há muitos artigos difundidos pela Internet a respeito.

Depois que o sistema tenha sido instalado e sua segurança implementada, devemos criar um novo grupo e um usuário regular chamado apache, da seguinte forma:


pw groupadd apache
pw useradd apache -c Apache Server -d /dev/null -g apache -s /sbin/nologin



Por default, os processos do Apache rodam com privilégios do usuário nobody (exceto o processo principal, que roda como root) e GID do grupo nogroup. Isto acarreta numa significativa ameaça, e no caso de uma quebra na segurança, o invasor pode obter acesso a todos os processos que rodam sob o mesmo UID/GID. Portanto, a melhor solução é rodar o Apache sob o mesmo UID/GID de um usuário/grupo regular, dedicado à este software.


Preparando o Software:

O próximo passo é fazer download da última versão do servidor web Apache clicando aqui. Algumas opções do Apache são ativadas em sua compilação, assim é recomendado fazer o download do código fonte ao invés da versão binária.

Depois de baixar e extrair seus fontes, devemos escolher que módulos serão habilitados. Uma pequena descrição de todos os módulos pode ser encontrada clicando aqui.


Módulos do Apache:

A escolha dos módulos é a etapa mais importante para deixar o servidor seguro. Nós devemos seguir uma regra: quanto menos, melhor. Para equilibrar funcionalidade com segurança, os seguintes módulos devem permanecer ativados:

httpd_core - O núcleo do Apache (requerido em qualquer instalação);
mod_access - Provê controle de acesso baseado no hostname do cliente, endereço IP, ou outras características de requisição do cliente. Este módulo é necessário para usar as diretivas order, allow e deny, assim deve permanecer habilitado;
mod_auth - Executar a autenticação do usuário (Autenticação Básica do HTTP);
mod_dir - Necessário para encontrar o diretório dos arquivos index: index.html, default.htm, etc;
mod_log_config - Implementar log de requisições;
mod_mime - Necessário para setar content-encoding, handler, content-language, e MIME de documentos.

Todos os outros módulos do Apache devem ser desabilitados. Nós também podemos, por segurança, desligar alguns módulos que não estejam em uso, evitando potenciais tentativas de quebra de segurança quando novas falhas forem sendo descobertas.

Deve-se ficar sabendo que existem dois módulos que são mais perigosos que os outros: mod_autoindex e mod_info. O primeiro módulo provê uma indexação automática de diretório, ativado por default. É muito fácil visualizar a estrutura de diretórios quando nenhum arquivo index for encontrado (ex.: http://server/icons/). O segundo, mod_info, nunca deve ser habilitado, por ser capaz de revelar informações de configuração do servidor web.

A próxima questão está em como compilar os módulos.


Compilando o Software:

Antes de tudo, caso exista, deve ser aplicado patchs de correções. Depois o servidor pode ser compilado e instalado da seguinte forma:


./configure --prefix=/usr/local/apache --disable-module=all --server-
uid=apache --server-gid=apache --enable-module=access --enable-
module=log_config --enable-module=dir --enable-module=mime
--enable-module=auth


make
su
umask 022
make install
chown -R root:sys /usr/local/apache



Apache Chroot:

O próximo passo é limitar o acesso dos processos do Apache no sistema de arquivos. Geralmente, a técnica de chroot significa criar um novo diretório raiz para a estrutura, movendo todos os daemons apropriados para ele, executando-os em seu novo ambiente.

Nós iremos iniciar este processo criando um novo diretório raiz estruturado sobre /chroot/httpd:



mkdir -p /chroot/httpd/dev
mkdir -p /chroot/httpd/etc
mkdir -p /chroot/httpd/var/run
mkdir -p /chroot/httpd/usr/lib
mkdir -p /chroot/httpd/usr/libexec
mkdir -p /chroot/httpd/usr/local/apache/bin
mkdir -p /chroot/httpd/usr/local/apache/logs
mkdir -p /chroot/httpd/usr/local/apache/conf
mkdir -p /chroot/httpd/www


O proprietário dos diretórios acima deve ser root, e o acesso deve ser setado como 0755. Após isso, devemos criar um arquivo de dispositivo especial /dev/null:


ls -al /dev/null
crw-rw-rw- 1 root wheel 2, 2 Mar 14 12:53 /dev/null
mknod /chroot/httpd/dev/null c 2 2
chown root:sys /chroot/httpd/dev/null
chmod 666 /chroot/httpd/dev/null



Um método diferente deve ser usado para criar o dispositivo /chroot/httpd/dev/log, que é requerido para o correto funcionamento. No caso do sistema FreeBSD, a seguinte linha deve ser adicionada no arquivo /etc/rc.conf:


syslogd_flags=-l /chroot/httpd/dev/log


Nós devemos restartar o sistema ou o syslogd para que as mudanças possam ser efetivadas.

O próximo passo é copiar o programa principal do httpd para a nova estrutura de diretórios, junto com as libs e binários necessário. Depois devemos fazer uma lista dos arquivos necessários através do comando ldd e truss:


localhost# ldd /usr/local/apache/bin/httpd
/usr/local/apache/bin/httpd:
libcrypt.so.2 => /usr/lib/libcrypt.so.2 (0x280bd000)
libc.so.4 => /usr/lib/libc.so.4 (0x280d6000)


localhost# truss /usr/local/apache/bin/httpd | grep open
(...)
open(/var/run/ld-elf.so.hints,0,00) = 3 (0x3)
open(/usr/lib/libcrypt.so.2,0,027757775370) = 3 (0x3)
open(/usr/lib/libc.so.4,0,027757775370) = 3 (0x3)
open(/etc/spwd.db,0,00) = 3 (0x3)
open(/etc/group,0,0666) = 3 (0x3)
open(/usr/local/apache/conf/httpd.conf,0,0666) = 3 (0x3)
(...)



Os comandos acima não devem ser aplicados somente ao programa httpd mas também em todos os arquivos necessários (bibliotecas frequentemente necessitam de outras bibliotecas). No caso do FreeBSD, os seguintes arquivos devem ser copiados para a nova estrutura de diretórios raiz:


cp /usr/local/apache/bin/httpd /chroot/httpd/usr/local/apache/bin/
cp /var/run/ld-elf.so.hints /chroot/httpd/var/run/
cp /usr/lib/libcrypt.so.2 /chroot/httpd/usr/lib/
cp /usr/lib/libc.so.4 /chroot/httpd/usr/lib/
cp /usr/libexec/ld-elf.so.1 /chroot/httpd/usr/libexec/



Usando o comando truss podemos de descobrir quais dos seguintes arquivos de configuração devem estar presentes no ambiente chroot:


cp /etc/hosts /chroot/httpd/etc/
cp /etc/host.conf /chroot/httpd/etc/
cp /etc/resolv.conf /chroot/httpd/etc/
cp /etc/group /chroot/httpd/etc/
cp /etc/master.passwd /chroot/httpd/etc/passwords
cp /usr/local/apache/conf/mime.types /chroot/httpd/usr/local/apache/conf/



Lembre-se que devemos remover todas as linhas de /chroot/httpd/etc/passwords e /chroot/httpd/etc/group, exceto apache e nobody. Depois devemos construir a base de dados se senhas como se segue:


cd /chroot/httpd/etc
pwd_mkdb -d /chroot/httpd/etc passwords


O próximo passo é testar para ver se o servidor httpd está funcionando corretamente no ambiente chroot, copiando, logo em seguida, o arquivo de configuração do Apache e a index.html:


cp /usr/local/apache/conf/httpd.conf /chroot/httpd/usr/local/apache/conf/
cp /usr/local/apache/htdocs/index.html.en /chroot/httpd/www/index.html
rm -rf /chroot/httpd/etc/master.passwd


Após ter copiado os arquivos mencioados, devemos mudar a diretriz DocumentRoot presente no arquivo /chroot/httpd/usr/local/apache/conf/httpd.conf:


DocumentRoot /www


Agora podemos tentar rodar o servidor:


chroot /chroot/httpd /usr/local/apache/bin/httpd


Se algum problema ocorrer, recomendo analizar os arquivos de log do Apache (/chroot/httpd/usr/local/apache/logs)


Configurando o Apache:

O primeiro passo é remover /chroot/httpd/usr/local/apache/conf/httpd.conf e criar um novo, similar ao que segue abaixo:


# =================================================
# Basic settings
# =================================================
ServerType standalone
ServerRoot /usr/local/apache
PidFile /usr/local/apache/logs/httpd.pid
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
ResourceConfig /dev/null
AccessConfig /dev/null

# =================================================
# Performance settings
# =================================================
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 150
MaxRequestsPerChild 0

# =================================================
# Apache"s modules
# =================================================
ClearModuleList
AddModule mod_log_config.c
AddModule mod_mime.c
AddModule mod_dir.c
AddModule mod_access.c
AddModule mod_auth.c

# =================================================
# General settings
# =================================================
Port 80
User apache
Group apache
ServerAdmin Webmaster@www.ebank.lab
UseCanonicalName Off
ServerSignature Off
HostnameLookups Off
ServerTokens Prod

DirectoryIndex index.html

DocumentRoot /www/vhosts

# =================================================
# Access control
# =================================================

Options None
AllowOverride None
Order deny,allow
Deny from all


Order allow,deny
Allow from all


Order allow,deny
Allow from all


# =================================================
# MIME encoding
# =================================================

TypesConfig /usr/local/apache/conf/mime.types

DefaultType text/plain

AddEncoding x-compress Z
AddEncoding x-gzip gz tgz
AddType application/x-tar .tgz


# =================================================
# Logs
# =================================================
LogLevel warn
LogFormat %h %l %u %t %r %>s %b %{Referer}i %{User-Agent}i
combined
LogFormat %h %l %u %t %r %>s %b common
LogFormat %{Referer}i -> %U referer
LogFormat %{User-agent}i agent
ErrorLog /usr/local/apache/logs/error_log
CustomLog /usr/local/apache/logs/access_log combined

# =================================================
# Virtual hosts
# =================================================
NameVirtualHost *

DocumentRoot /www/vhosts/www.ebank.lab
ServerName www.ebank.lab
ServerAlias www.e-bank.lab
ErrorLog logs/www.ebank.lab/error_log
CustomLog logs/www.ebank.lab/access_log combined


DocumentRoot /www/vhosts/www.test.lab
ServerName www.test.lab
ErrorLog logs/www.test.lab/error_log
CustomLog logs/www.test.lab/access_log combined



A configuração acima inclui somente os comandos necessários para suprir a funcionalidade e segurança. Na configuração apresentada, existem dois hosts virtuais suportados pelo servidor web:

- www.ebank.lab (www.e-bank.lab)
- www.test.lab

O conteúdo dos sites apresentados acima está localizado nos seguintes diretórios:

- /chroot/httpd/usr/local/apache/logs/www.ebank.lab
- /chroot/httpd/usr/local/apache/logs/www.test.lab

Os diretórios acima devem ser criados antes de rodar o Apache pela primeira vez - caso contrário o Apache não funcionará corretamente. Os proprietários para os diretórios devem ser root:sys, e as permissões setadas como 0755.

Comparado com o arquivo de configuração default do Apache, as seguintes mudanças foram feitas:

- O número de módulos ativados foram significativamente reduzidos;
- O Apache não divulga informações sobre sua versão (diretivas: ServerTokens e ServerSignature);
- Os processos são setados para serem executados com um único usuário/grupo regular - exceto processo root (diretivas: User e Group);
- O Apache irá permitir acesso somente a diretórios, subdiretórios e arquivos explicitamente especificados no arquivo de configuração (diretivas: Directory e Allow), e todas as outras requisições serão negadas por padrão;
- Serão logadas mais informações sobre requisições HTTP.


Passos Finais

Por fim criamos um script para startar chamado apache.sh, contendo um código similar ao que se segue:


#!/bin/sh

CHROOT=/chroot/httpd/
HTTPD=/usr/local/apache/bin/httpd
PIDFILE=/usr/local/apache/logs/httpd.pid

echo -n apache

case $1 in
start)
/usr/sbin/chroot $CHROOT $HTTPD
;;
stop)
kill `cat ${CHROOT}/${PIDFILE}`
;;
*)
echo
echo Usage: `basename $0` {start|stop} >&2
exit 64
;;
esac

exit 0



* O script acima deve ser copiado. No caso do FreeBSD, o diretório é /usr/local/etc/rc.d.


Por fim, terminamos este tutorial com um Apache bem configurado. Agora fica por conta do administrador do sistema em manter-se atualizado sobre futuras falhas a serem descobertas, aplicando os referidos patches de segurança.


Referência: Security Focus




Comentários

Deixe seu Comentário

URL Fonte: http://totalsecurity.com.br/noticia/239/visualizar/