Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian

Este artigo visa implementar um serviço de Proxy Reverso com o WEBservice NGINX, o qual irá receber as requisições dos clientes e enviar o tráfego de maneira segura, usando criptografia. As aplicações WEB ficarão em 2 servidores WEB virtuais com Apache utilizando uma VM com o sistema operacional Debian 10. O objetivo é mostrar algumas funcionalidades de um Proxy Reverso e os benefícios de realizar a criptografia no serviço de Proxy Criptografado, para simplificar o gerenciamento quando existem inúmeros servidores de aplicação WEB em um ambiente.

[ Hits: 15.797 ]

Por: PEDRO HENRIQUE CAMPOS DAMACENA em 17/10/2019


Configuração NGINX



Note que estamos usando a porta 8080 ao invés da porta 80, que é a porta padrão do HTTP (Hypertext Transfer Protocol - Protocolo de Transferência de Hipertexto), pois vamos logo a seguir instalar o serviço do Proxy Reverso na porta 80 e caso não façamos essa alteração, o serviço do NGINX não será instalado.

Após essa etapa, podemos ver que o servidor WEB Apache está funcionando e concluímos suas configurações. Agora devemos instalar o servidor de Proxy Reverso e configurar o acesso criptografado.

O próximo passo é instalar o serviço do NGINX com o comando:

# sudo -H apt install -y nginx

Em seguida, vamos confirmar se ele está funcionando corretamente com uma sequência de comandos. Esses são comandos muito importantes e bastante úteis. Sempre que editar alguma configuração, antes de executar o comando para reiniciar ou recarregar o serviço, verifique se não há erros de configurações usando um ou os três comandos abaixo:

# nginx -t
# service nginx configtest
# systemctl status nginx

Segue abaixo, respectivamente, as telas de retorno que cada um desses comandos deve trazer.
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Agora, reinicie o serviço do NGINX:

# systemctl restart nginx

Por padrão, o NGINX tem um limite de 1024 arquivos que podem ser abertos simultaneamente, para evitar que sejam apresentadas mensagens de falhas, devido esse limite ser atingido, recomendamos alterar as configurações do arquivo /etc/nginx/nginx.conf, usando o comando abaixo.

# vim /etc/nginx/nginx.conf

Para corrigi-lo, você pode usar as diretivas worker_rlimit_nofile e worker_connections, na parte superior do seu /etc/nginx/nginx.conf. As dez primeiras linhas do nosso arquivo "nginx.conf" ficaram conforme abaixo:

user www-data;
worker_processes auto;
worker_rlimit_nofile 8192;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 4096;
        # multi_accept on;
}

Uma vez instalado e ativo o serviço do NGINX, vamos criar um arquivo de Host Virtual chamado "proxy":

# vim /etc/nginx/sites-available/proxy

Esse arquivo deve conter o seguinte conteúdo:

server {
listen 80;
server_name www.exemplo1.com www.exemplo2.com;

location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

Agora precisamos remover o arquivo default da pasta "sites-enabled":

# rm /etc/nginx/sites-enabled/default

Em seguida, vamos criar um link simbólico para o Proxy virtual host ficar habilitado e assumir a função de arquivo default no NGINX:

# ln -s /etc/nginx/sites-available/proxy /etc/nginx/sites-enabled/proxy

Devemos realizar a criação do arquivo chamado "exemplo1" com os conteúdos mostrados abaixo na pasta /etc/nginx/sites-available:

# vim /etc/nginx/sites-available/exemplo1

Esse arquivo deve conter o seguinte conteúdo:

server {
listen 80;
server_name exemplo1.com www.exemplo1.com;

location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Em seguida, devemos realizar a criação do arquivo chamado "exemplo2" com os conteúdos mostrados abaixo na pasta /etc/nginx/sites-available:

# vim /etc/nginx/sites-available/exemplo2

Esse arquivo deve conter o seguinte conteúdo:

server {
listen 80;
server_name exemplo2.com www.exemplo2.com;

location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Vamos criar um link simbólico dos arquivos "exemplo1" e "exemplo2" no caminho /etc/nginx/sites-enabled:

# ln -s /etc/nginx/sites-available/exemplo1 /etc/nginx/sites-enabled/exemplo1
# ln -s /etc/nginx/sites-available/exemplo2 /etc/nginx/sites-enabled/exemplo2

Estando tudo configurado com sucesso, conforme demonstrado acima, agora já é possível acessar os sites do Apache pela porta HTTP padrão, como podemos ver abaixo, isso significa que o Proxy Reverso já está encaminhando as requisições de maneira adequada ao host virtuais no servidor WEB Apache.
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Para finalizar as configurações, vamos tornar o acesso do navegador ao Proxy Reverso NGINX um acesso criptografado via protocolo HTTPS (Hyper Text Transfer Protocol Secure - Protocolo de Transferência de Hipertexto Seguro), como o tutorial é para fins didáticos, mostraremos como configurar usando um certificado auto assinado.

Vá para o diretório onde os arquivos serão criados os certificados:

# cd /etc/nginx

Vamos criar um certificado com o OpenSSL (OpenSSL é uma implementação de código aberto dos protocolos SSL e TLS) no seguinte comando:

# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt

A seguinte entrada irá gerar a seguinte saída, os itens marcados na cor laranja podem ser configurados da forma que desejar para seu certificado.
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Agora, executando esses dois comandos abaixo, podemos visualizar os dois arquivos:

# cd /etc/nginx
# ls
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Para finalizar, devemos alterar a configuração do arquivo do Proxy criado anteriormente. Primeiro acesse o arquivo e depois edite-o da seguinte maneira:

# vim /etc/nginx/sites-available/proxy

Esse arquivo deve conter o seguinte conteúdo:

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}

server {
listen 443;
server_name _;
ssl_certificate         /etc/nginx/cert.crt;
ssl_certificate_key     /etc/nginx/cert.key;

ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RCA;
ssl_prefer_server_ciphers on;

location / {
proxy_set_header               Host $host;
proxy_set_header               X-Real-IP $remote_addr;
proxy_set_header               X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header               X-Forwarded-Proto $scheme;
proxy_pass                            http://localhost:8080;
proxy_read_timeout           90;
proxy_redirect                        http://localhost:8080 https://$host$request_uri;
}
}

Essa parte final demonstra que a criptografia com certificado auto assinado está totalmente funcional no Proxy Reverso, o Proxy NGINX recebe as requisições dos clientes e envia ao Apache o qual retorna ao NGINX a página solicitada, posteriormente o Proxy criptografa as informações e envia ao cliente, a partir daí a comunicação é toda criptografada entre cliente (Navegador) e servidor (Proxy NGINX).

Conforme comentado acima, haviam três comandos importantes. Agora vamos utilizá-los novamente:

# nginx -t
# service nginx configtest
# systemctl status nginx

Segue abaixo, respectivamente, as telas de retorno que cada um desses comandos deve trazer:
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Reinicie o serviço do NGINX:

# systemctl restart nginx

Observação: nas imagens abaixo, existem itens escritos na cor vermelha. Esses itens são apresentados dessa forma devido ao navegador não poder verificar que a chave pública fornecida é uma chave válida por nenhuma Autoridade Certificadora da Internet, ou seja, estamos interessados apenas no aspecto de criptografia do nosso certificado, não na validação de terceiros da autenticidade do nosso host.

Assim, como foi dito, para sistemas em produção é recomendado usar um certificado confiável gratuito, como por exemplo, do projeto Let's Encrypt. Saiba mais, como configurar o Let's Encrypt aqui.
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
Linux: Configurando Proxy Reverso NGINX com SSL e Apache em Virtual Hosts no Debian
NOTA: a criptografia de chaves públicas e privadas, utiliza duas chaves distintas, uma para codificar e outra para decodificar mensagens. Neste método, cada pessoa ou entidade mantém duas chaves: uma pública, que pode ser divulgada livremente, e outra privada, que deve ser mantida em segredo pelo seu dono. As mensagens codificadas com a chave pública só podem ser decodificadas com a chave privada correspondente.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução e Configuração Apache
   2. Configuração NGINX
   3. Conteúdos Relacionados e Referências
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

5 comandos que ninguém nunca deve executar no Linux

SDI (IDS) com o SNORT, MySQL, PHP e BASE em 15 minutos

Entrevista com um hacker, via Internet

Gaim + Gaim Encryption - Bate-papo com segurança

Arpwatch - Detecte em sua rede ataques de Arp Spoofing/Arp Poisoning

  
Comentários
[1] Comentário enviado por fabio em 17/10/2019 - 14:24h

Muito bom o artigo, meus parabéns pelo trabalho!

[2] Comentário enviado por kayshin em 29/10/2019 - 09:02h

Bom dia,
Excelente seu artigo, parabéns!

Não sei o que estou fazendo de errado.

" O seguinte erro foi encontrado ao tentar recuperar a URL: http://www.exemplo1.com/

Impossível determinar o endereço IP do nome de host "www.exemplo1.com"

O servidor DNS retornou:

Name Error: The domain name does not exist.

Isto significa que o cache não pode resolver o nome de host contido na URL. Verifique se o endereço está correto."


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts