Guia do Linux/Avançado/Apache/Virtual Hosts
Virtual Hosts
editarVirtual 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:
- Virtual Hosts baseados em IP - Requer um endereço IP diferente para cada site. Este poderá ser um IP real (da interface de rede) ou um apelido (veja [ch-cfgrede.html#s-cfgrede-ipalias IP Alias, Seção 5.1]), o que interessa é que deve haver um endereço IP diferente para cada site. O número de sites servidos estará limitado a quantidade de endereços IP disponíveis em sua classe de rede. Veja [#s-s-apache-vhosts-ip Virtual hosts baseados em IP, Seção 12.12.1] para detalhes de como construir um virtual host deste tipo.
O apache
foi um dos primeiros servidores web a incluir suporte a virtual hosts baseados em IP.
- Virtual Hosts baseados em nome - Este utiliza nomes para identificar os sites servidos e requerem somente um endereço IP. Desta maneira é possível servir um número ilimitado de sites virtuais. O navegador do cliente deve suportar os cabeçalhos necessários para garantir o funcionamento deste recurso (praticamente todos os navegadores atuais possuem este suporte). Veja [#s-s-apache-vhosts-nome Virtual hosts baseados em nome, Seção 12.12.2] para detalhes de como construir um virtual host deste tipo.
As explicações desta seção são baseadas na documentação do Apache
.
Virtual hosts baseados em IP
editarExistem 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 [ch-rede.html#s-rede-dns-a-hostconf /etc/host.conf, Seção 4.6.2.2] e [ch-fw-iptables.html#s-fw-iptables-outras-ipspoof Proteção contra IP spoofing, Seção 10.6.5]. Leia também a seção [#s-s-apache-vhosts-dnssec Segurança no uso de IP's em Virtual Hosts, Seção 12.12.3].
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
editarEste 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 [ch-rede.html#s-rede-dns-a-hostconf /etc/host.conf, Seção 4.6.2.2] e [ch-fw-iptables.html#s-fw-iptables-outras-ipspoof Proteção contra IP spoofing, Seção 10.6.5]. Leia também a seção [#s-s-apache-vhosts-dnssec Segurança no uso de IP's em Virtual Hosts, Seção 12.12.3].
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
editarQuando 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:
- 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.
- 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.
- Utilize endereços IP na diretiva <VirtualHost>.
- Use endereços IP na diretiva Listen.
- Use um endereço IP na diretiva BindAddress.
- Sempre utilize o parâmetro ServerName em todas as diretivas <VirtualHost>, isto evita o retorno incorreto de nomes (que pode evitar/revelar fraudes).
- 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.