Apresentação do proxy reverso
Neste tutorial irei explicar como configurar um proxy reverso com o Apache no Ubuntu (Ao adaptar os comandos de instalação do Apache, este tutorial pode ser facilmente transposto para outras distribuições).
Antes de entrar na parte técnica, vamos fazer um balanço do que é um proxy reverso?
Um proxy inverso é um servidor (Web) colocado antes do servidor Web de destino onde o serviço Web (site) está alojado.
Quando os computadores consultam um serviço Web que utiliza proxy reverso, não acedem diretamente ao servidor onde se encontra a aplicação, o pedido HTTP chega primeiro ao proxy reverso, que depois faz o próprio pedido ao servidor de destino.
É o mesmo princípio de um servidor proxy que encontramos nas empresas para aceder à Internet.
A utilização de um proxy reverso tem várias vantagens:
- Guardando o endereço IP (v4), os sites website1 e website2 terão o mesmo endereço IP na Internet, o do proxy inverso.
- Aumente o nível de segurança (Mod Security, Crowdsec, Fail2ban)
- Reduza a carga em servidores web com cache e/ou descarregamento de SSL
- Reescrever o conteúdo HTML
- Centralize a gestão de certificados SSL
- …
Para este tutorial utilizei um único computador com Ubuntu 22.04, para simular os servidores web onde os sites estão alojados utilizei o Docker.
Instale o Apache2 no Ubuntu
Por defeito, o Apache2 está disponível nos repositórios do Ubuntu, para tirar partido da versão mais recente do Apache de uma versão mais recente do Apache2, irei passar pelo repositório ppa:ondrej/apache2.
A utilização do repositório ppa:ondrej/apache2 não é obrigatória.
Adicione o repositório ppa:ondrej/apache2:
sudo add-apt-repository ppa:ondrej/apache2
Confirme a adição do depósito premindo a tecla Enter.
O depósito é adicionado.
Atualizar lista de pacotes:
sudo apt update
Instale o Apache2:
sudo apt install apache2 -y
Aguarde enquanto instala o Apache2 no servidor:
O Apache2 está instalado.
Active o proxy reverso no Apache2
Por predefinição, o Apache2 não pode ser configurado como proxy reverso, porque o Apache2 é utilizado principalmente como servidor web.
Para que o Apache2 possa ser utilizado como Reverse Proxy, deverá activar o módulo proxy_http que se encontra na pasta: /etc/apache2/mods-available.
Para visualizar a lista de módulos Apache2 ativos, pode vê-los listando o conteúdo da pasta /etc/apache2/mods-enabled.
Para ativar o mod proxy_http digite o seguinte comando:
sudo a2enmod proxy_http
Ao ativar o mod proxy_http, o mod proxy também foi ativado.
Para ter em conta os novos módulos, deve reiniciar o Apache2.
sudo systemctl restart apache2
Se olharmos novamente para a pasta /etc/apache2/mods-enabled, podemos ver os dois módulos proxy e proxy_http.
Criação e configuração de hosts virtuais
O funcionamento dos virtualhosts é idêntico quer utilizemos o Apache2 como servidor Web ou como proxy inverso, apenas as instruções serão diferentes no ficheiro de configuração.
Os ficheiros virtualhosts são criados primeiro na pasta /etc/apache2/sites-available.
Vá para a pasta:
cd /etc/apache2/sites-available
Vamos agora criar um ficheiro para configuração do site Website1:
sudo nano reverse-proxy-website1.conf
Aqui está o conteúdo do ficheiro:
As definições devem ser adaptadas ao seu ambiente
Explicações dos parâmetros:
Contexto | Explicação |
---|---|
ServerName | Nome de domínio associado ao virtualhost |
ProxyPreserveHost | On|Off permite manter o cabeçalho Host ao transferir o pedido para o servidor de destino, se utilizar virtualhosts no servidor Web de destino, deverá deixar este parâmetro em On. |
ProxyRequests | Off se esta diretiva for aprovada pelo On, isto permitirá que o Apache2 atue como proxy para aceder à Internet como o Squid. Por motivos de segurança, deve ser definido como Off, caso contrário é possível utilizar o serviço Apache2 como proxy para falsificar um endereço IP. |
ProxyPass | Permite corresponder o caminho no URL ao servidor de destino. Aqui enviamos todos os pedidos/para o servidor web http://127.0.0.1:20001/ |
ProxyPassReverse | Geralmente encontramos o mesmo valor de ProxyPass, este permite ajustar o URL no cabeçalho HTTP |
Agora que a configuração do virtualhost está concluída, vamos criar um link simbólico na pasta /etc/apache2/sites-enabled para ativar a configuração.
sudo ln -s /etc/apache2/sites-available/reverse-proxy-website1.conf /etc/apache2/sites-enabled/
Antes de recarregar a configuração, testaremos a configuração para garantir que não existem erros de bloqueio:
apachectl configtest
Se a sintaxe estiver OK, pode recarregar a configuração:
sudo systemctl reload apache2
Agora poderemos testar a configuração, antes de fazer um teste certifique-se que o domínio (url) aponta para o proxy reverso e não para o servidor web de destino. Feita esta verificação, ao iniciar um browser foi para o URL do virtualhost.
Podemos garantir a passagem pelo proxy reverso Apache2 observando os logs localizados em /var/log/apache2/other_vhosts_access.log
sudo tail -f /var/log/apache2/other_vhosts_access.log
Não vou entrar em detalhes, apenas colocar as capturas, mas vou fazer o mesmo para o site Website2.
Nos logs posso validar a passagem pelo proxy reverso.
Para uma melhor legibilidade dos registos, é possível separar os registos em ficheiros diferentes para cada host virtual.
Na configuração do virtualhost, iremos adicionar os parâmetros LogLevel, ErrorLog e CustomLog.
Recarregue a configuração para ter em conta as alterações:
sudo systemctl reload apache2.
Na pasta /var/log/apache2, podemos ver os ficheiros:
Os registos de navegação são agora guardados no ficheiro dedicado ao virtualhost:
Agora já sabe como configurar o Apache como proxy reverso para proteger os seus servidores web.