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:
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 “IP Alias”), 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 “Virtual hosts baseados em IP” 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 “Virtual hosts baseados em nome” para detalhes de como construir um
virtual host deste tipo.
As explicações desta seção são baseadas na documentação do Apache.
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.
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.
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:
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.
Copyright © 1999-2020 - Gleydson Mazioli da Silva