Virtual Hosts

Virtual Hosts (sites virtuais) é um recurso que permite servir mais de um site no mesmo servidor. Podem ser usadas diretivas específicas para o controle do site virtual, como nome do administrador, erros de acesso a página, controle de acesso e outros dados úteis para personalizar e gerenciar o site. Existem 2 métodos de virtual hosts:

As explicações desta seção são baseadas na documentação do Apache.

Virtual hosts baseados em IP

Existem duas maneiras de rodar este tipo de host virtual: Através de daemons httpd separados ou em um único daemon httpd usando a diretiva <VirtualHost>.

As vantagens do uso de daemons separados para servir requisições é a proteção sob UID e GID diferente dos outros servidores, assim o administrador do site1 não terá acesso ao httpd.conf, página do site2 (porque ele estará rodando sob uma UID e GID diferentes e o acesso é restrito). Para usar este método, especifique a opção -f [arquivo_cfg] para utilizar um arquivo de configuração personalizado e a diretiva Listen endereço:porta para dizer onde o servidor aguardará as requisições.

As vantagens do uso de um mesmo daemon para servir as requisições são: quando não há problema se os administradores de outros sites tenham acesso ao mesmo arquivo de configuração ou quando há a necessidade de servir muitas requisições de uma só vez (quanto menos servidores web estiverem em execução, melhor o desempenho do sistema). Abaixo um exemplo de configuração de virtual hosts servindo os sites www.site1.com.br e www.site2.com.br:

ServerAdmin webmaster@site.com.br

<VirtualHost www.site1.com.br>
 ServerName www.site1.com.br
 ServerAdmin site1@site1.com.br
 DocumentRoot /var/www/www_site1_com_br
 TransferLog /var/log/apache/site1/access.log
 ErrorLog /var/log/apache/site1/error.log
 User www-data
 Group www-data
</VirtualHost>

<VirtualHost www.site2.com.br>
 ServerName www.site2.com.br
 DocumentRoot /var/www/www_site2_com_br
 CustomLog /var/log/apache/site2/access.log combined
 ErrorLog /var/log/apache/site2/error.log
</VirtualHost>

Qualquer diretiva dentro de <VirtualHost> controlarão terão efeito no site virtual especificado. Quando uma diretiva não for especificada dentro de <VirtualHost>, serão usados os valores padrões especificados no arquivo de configuração do Apache (como a diretiva ServerAdmin webmaster@site.com.br que será usado como padrão na configuração de www.site2.com.br).

Digite apache -S para ver suas configurações de virtual hosts atual.

OBS1: Desative a diretiva UseCanonicalName off quando utilizar o recurso de máquinas virtuais, esta diretiva faz que o nome do servidor retornado usando o valor em ServerName quando o cliente digita um endereço qualquer.

OBS2: Utilize sempre que possível endereços IP em configurações críticas, assim os serviços não serão tão vulneráveis a possíveis falsificações ou erros. Veja “/etc/host.conf” e “Proteção contra IP spoofing”. Leia também a seção “Segurança no uso de IP's em Virtual Hosts”.

OBS3: Não permita que outros usuários a não ser o root e o dono do processo Apache (especificado pela diretiva User) tenham acesso de gravação aos logs gerados pelo servidor, pois os dados podem ser apagados ou criados links simbólicos para binários do sistema que serão destruídos quando o Apache gravar dados. Alguns binários e bibliotecas são essenciais para o funcionamento do sistema.

Virtual hosts baseados em nome

Este método é idêntico ao baseado em IP, em especial adicionamos a diretiva NameVirtualHost para dizer qual é o endereço IP do servidor que está servindo os virtual hosts baseados em nome. Veja o exemplo de configuração:

NameVirtualHost 200.200.200.10:80

<VirtualHost _default_:80 200.200.200.10:80>
 ServerName www.site.com.br
 ServerAdmin admin@site.com.br
 DocumentRoot /var/www
 TransferLog /var/log/apache/access.log
 ErrorLog /var/log/apache/error.log
</VirtualHost>

<VirtualHost 200.200.200.10>
 ServerName www.site1.com.br
 ServerAdmin admin1@site1.com.br
 DocumentRoot /var/www/www_site1_com_br
 TransferLog /var/log/apache/site1/access.log
 ErrorLog /var/log/apache/site1/error.log
</VirtualHost>

<VirtualHost 200.200.200.10>
 ServerName www.site2.com.br
 ServerAdmin admin2@site2.com.br
 DocumentRoot /var/www/www_site2_com_br
 TransferLog /var/log/apache/site2/access.log
 ErrorLog /var/log/apache/site2/error.log
</VirtualHost>

A diretiva NameVirtualHost diz que será usado virtual hosts baseados em nome servidos pela máquina com IP 200.200.200.10. Os parâmetros dentro do bloco das diretivas <VirtualHost > são específicas somente no site virtual especificado, caso contrário os valores padrões definidos no arquivo de configuração serão usados. Caso nenhum virtual host confira com a configuração, o virtualhost _default_ será usado.

Digite apache -S para ver suas configurações de virtual hosts atual. Se sua intenção é criar um grande número de virtual hosts que serão servidos pela mesma máquina, o uso da expansão %0 e diretivas VirtualDocumentRoot e VirtualScriptAlias são recomendados:

NameVirtualHost 200.200.200.10:80

<VirtualHost 200.200.200.10>
 VirtualDocumentRoot /var/www/%0
 VirtualScriptAlias /var/www/%0/cgi-bin
 TransferLog log/apache/site1/access.log
 ErrorLog log/apache/site1/error.log
</VirtualHost>

Agora crie os diretórios em /var/www correspondentes aos nomes de domínios que serão servidos por sua máquina: mkdir /var/www/www.site1.com.br, mkdir /var/www/www.site2.com.br. Note que sua máquina deverá estar com o DNS configurado para responder por estes domínios .

ATENÇÃO É importante que os endereços especificados nas diretivas ServerName (www.site1.com.br) resolvam o endereço IP da diretiva VirtualHost (200.200.200.10). Isto deve ser feito via DNS ou nos arquivos /etc/hosts.

OBS1: Utilize sempre que possível endereços IP em configurações críticas, assim os serviços não serão tão vulneráveis a possíveis falsificações ou erros. Veja “/etc/host.conf” e “Proteção contra IP spoofing”. Leia também a seção “Segurança no uso de IP's em Virtual Hosts”.

OBS2: Não permita que outros usuários a não ser o root e o dono do processo Apache (especificado pela diretiva User) tenha acesso de gravação aos logs gerados pelo servidor. Pois os dados podem ser apagados ou criados links para binários do sistema que serão destruídos quando o apache gravar dados para os logs. Alguns binários e bibliotecas são essenciais para o funcionamento do sistema.

Segurança no uso de IP's em Virtual Hosts

Quando você está colocando um nome na diretiva de configuração do seu virtual hosts, está assumindo que ele resolverá o endereço IP corretamente (como www.site1.com.br => 200.200.200.10). Se por algum motivo o servidor DNS for modificado (por outra pessoa que tem acesso a isto), o endereço IP resolvido para o site www.site1.com.br poderá ser modificado para 200.200.200.20, isto redirecionará as requisições para outra máquina ao invés da máquina correta. Este tipo de ataque é chamado "DNS Spoofing" e o uso de endereço IP (ao invés de nomes) praticamente evita que isto aconteça. Esta situação pode acontecer com a diretiva abaixo:

<VirtualHost www.gms.com.br>
 ServerName www.gms.com.br
 ServerAdmin gleydson@guiafoca.org
 DocumentRoot /var/www/www_gms_com_br
</VirtualHost>

Outra situação, que impede o funcionamento do servidor Web, é quando o servidor DNS está em manutenção ou por algum outro motivo não pode resolver o endereço IP de um nome especificado (como www.site1.com.br). O apache precisa saber qual é o seu endereço IP para ser executado. Veja a próxima modificação:

<VirtualHost 192.168.1.1>
 ServerName www.gms.com.br
 ServerAdmin gleydson@guiafoca.org
 DocumentRoot /var/www/www_gms_com_br
</VirtualHost>

Na configuração acima usamos o IP do servidor para especificar o virtual host. O apache tentará fazer o DNS reverso para determinar qual nome é servido por aquele endereço IP (www.site1.com.br). Se ele falhar, somente a seção <VirtualHost> correspondente será desativada. Isto já é uma melhoria sobre a primeira configuração. O nome do servidor na diretiva ServerName garante que o servidor responda com o nome correto.

Para evitar ataques baseados em DNS siga os seguintes procedimentos de segurança:

  1. Preferencialmente utilize o arquivo /etc/hosts para a resolução de nomes em máquinas locais (principalmente quando existe somente um administrador). É um método que evita diversas consultas ao servidor DNS (que pode deixar o acesso lento) e este arquivo é gerenciado pelo usuário root, isto evita o acesso de qualquer usuário para a falsificação de endereços.

    Este arquivo também é útil caso a pesquisa DNS falhe (quando a ordem de pesquisa for do servidor DNS para o arquivo hosts no arquivo /etc/host.conf), pois de qualquer forma o nome será resolvido e o servidor Apache será executado.

  2. Evite dar poderes a outros administradores manipularem seu próprio domínio DNS, não há nada que possa impedi-lo de modificar o endereço "X" para ser servido pelo IP "Y" desviando o tráfego para seu próprio servidor web. Se isto não for possível, siga as dicas abaixo para diminuir possíveis problemas.

  3. Utilize endereços IP na diretiva <VirtualHost>.

  4. Use endereços IP na diretiva Listen.

  5. Use um endereço IP na diretiva BindAddress.

  6. Sempre utilize o parâmetro ServerName em todas as diretivas <VirtualHost>, isto evita o retorno incorreto de nomes (que pode evitar/revelar fraudes).

  7. Quando utilizar virtual hosts, crie uma diretiva <VirtualHost _default_L:*> usando uma diretiva DocumentRoot que não aponte para lugar algum. Esta diretiva será acessada quando nenhuma diretiva VirtualHost servir a requisição, conferindo com o endereço/ip.