Configurando proxy reverso com NGINX, Letsencrypt e Certbot (SSL) para publicação de Zabbix e Grafana.

bernardolankheet
Zabbix Brasil
Published in
7 min readJul 1, 2020

Neste artigo irei mostrar como podemos configurar o NGINX com o Certbot para aplicar automaticamente certificados SSL em ambientes de monitoramento, porem pode ser aplicado para outras aplicações.

Quando posso utilizar o nginx?

Ideal quando possui apenas um IP púbico e queira publicar apenas uma porta 443 e 80, principalmente quando se usa vários serviços, (Zabbix, Grafana, Gitlab, Proxymox, storage e etc). Além de não ter IPs públicos suficiente para publicação desses caras, dificilmente conseguirá dedicar cada serviço em um IP/porta porta diferente, além de ficar muito trabalhoso de se manter.

Nesse caso que entra em jogo o NGINX, além de ser um servidor WEB (igual o apache), podemos utiliza-lo como um proxy reverso, onde é possível receber uma requisição web, processar e direcionar para um servidor específico interno da sua rede, sem a necessidade de publica-lo diretamente na internet. Com fácil configuração, é muito poderoso para processar uma carga alta de requisições com pouca utilização de CPU/RAM e o principalmente, é trabalha muito bem como micro serviço/docker (mas não será o foco deste artigo).

Mesmo que com ele, podemos implementar SSL, não podemos considerar somente ele como um fator principal de segurança. Principalmente por ele não ser um Web Application Firewall (WAF), mas claro, podemos considerar (de certa forma) um ponto da sua pilha de segurança.

Requisitos deste artigo

O ambiente deste artigo, foi utilizado com o Debian 10, rodando em uma máquina virtual hyper-v. Com o Zabbix e Grafana rodando em Docker. Em outro artigo irei publicar em com rodar todos os serviços em Docker.

Necessário ter criado os redirecionamentos em seu domínio para acesso aos subdomínios Zabbix e Grafana possam chegar no IP onde os serviços estão hospedados. Também há necessidade de já ter criado redirecionamento das portas 80 e 443.

Obs: irei simular como se tivesse fazendo para o meu domínio www.bernardolankheet.com.br, basta alterar os códigos quando necessário.

Instalando o NGINX

A instalação é muito semelhante a um servidor web Apache.

apt install nginx

Habilite a inicialização automática do serviço junto com o sistema operacional e já o inicie.

systemctl enable — now nginx

Verifique se o serviço está sendo executado.

systemctl status nginx

Troubleshooting inicialização NGINX

Em casos de falha na inicialização do serviço, é como ele é um servidor web, as portas 80 e 443 não podem está sendo utilizadas por outro serviço no servidor. Para verificar, você pode testar em um navegador http://ip-nomeserver ou https://ip-nomeserver. Também podemos verificar as portas pelo S.O, utilizando o netstat (para utiliza-lo, deverá ter o pacote net-tools instalado).

netstat -plnt | grep 80
netstat -plnt | grep 443

Poderá ter um retorno parecido com o abaixo:

tcp 0 0 0.0.0.0:80 0.0.0.0:* OUÇA 618/nomeserviço

Desta forma, ou precisará alterar a porta padrão do nginx ou do serviço que está em execução. E posteriormente criar uma regra para redirecionamento deste serviço dentro do Nginx, assim essa mudança não será transparente para seu usuário, funcionará tudo em background, e ele acessará um endereço de url comum, sem porta.

Configurando as regras de redirecionamentos para o Nginx

Neste exemplo iremos configurar para acessarmos através de subdomínios. Por exemplo:

https://grafana.bernardolankheet.com.br e https://zabbix.bernardolankheet.com.br

Também é possível configurar como se fosse diretório.

https://bernardolankheet.com.br/zabbix ou /grafana

Remova o arquivo de configuração default do nginx, para que quando acessar o diretório principal não apareça a página de do nginx.

rm /etc/nginx/sites-enabled/defaultservice nginx reload

Agora crie um arquivo de configuração para o zabbix dentro de sites-available.

touch /etc/nginx/sites-available/zabbix.confnano /etc/nginx/sites-available/zabbix.conf

Insira o seguinte conteúdo dentro do arquivo, nele estaremos informando para o nginx que tudo que chegar na porta 80 através do subdomínio zabbix.bernardolankheet.com.br ou www.zabbix.bernardolankheet.com.br, será redirecionado para o serviço interno do Zabbix.

server {listen 80;listen [::]:80;server_name zabbix.bernardolankheet.com.br www.zabbix.bernardolankheet.com.br;location / {proxy_pass http://IPNOMEZABBIX/; ## URL ZABBIXproxy_buffering off;proxy_set_header X-Real-IP $remote_addr;}}

Mesmo processo iremos repetir com para o arquivo de configuração do nginx para o Grafana neste momento.

touch /etc/nginx/sites-available/grafana.confnano /etc/nginx/sites-available/grafana.conf

Conteúdo do grafana.conf

server {listen 80;listen [::]:80;server_name bernardolankheet.com.br www.bernardolankheet.com.br;location / {proxy_pass http://IPNOMEGRAFANA:3000/; ## IP:PORTA GRAFANAproxy_buffering off;proxy_set_header X-Real-IP $remote_addr;}}

Crie o link simbólico para o diretório de sites-enabled do nginx.

ln -s /etc/nginx/sites-available/grafana.conf /etc/nginx/sites-enabled/grafana.confln -s /etc/nginx/sites-available/zabbix.conf /etc/nginx/sites-enabled/zabbix.conf

Utilize o próprio nginx para testar as configurações realizadas, onde com o parâmetro –t, podemos testar as configurações.

nginx -t

Verá uma saída parecida com esta.

nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful

Ou poderá apresentar um erro, como por exemplo o abaixo indicando que no httpd.conf, há um erro de configuração.

nginx: [emerg] unexpected ">" in /etc/nginx/conf.d/httpd.conf:1nginx: configuration file /etc/nginx/nginx.conf test failed

Se tudo ocorrer vem, basta reiniciar o serviço.

systemctl nginx restart

Neste momento já é possível ir no navegador e testar as configurações, se já estiver com as portas redirecionadas e o redirecionamento no domínio criado, terá sucesso no acesso.

http://zabbix.dominio.com.br e http://grafana.dominio.com.br

É possível acompanhar todos os acessos através dos logs do nginx.

tail -20 /var/log/nginx/access.logtail -20 /var/log/nginx/error.log

Se tudo ocorreu bem e teve sucesso ao acessar seus serviços, agora será necessário instalar e configurar o SSL para acesso via https.

Configurando o Certbot para instalação e renovação de Certificados Lets-Encrypts

Para quem não conhece, o Lets-Encrypts é uma autoridade certificadora gratuita, automatizada e aberta. Sendo patrocinada por várias empresas para poder manter seus serviços e fornecer de forma gratuita certificados confiáveis a de forma transparente para todos.

Para poder usar o serviço da Lets-Encrypts, é necessário que seu servidor responda alguns “desafios” para provar que controla o domínio que está requisitando o certificado.

Envio de chave privada, comprovação de controle de domínio. Fonte: Documentacão Let’s-Encrypt

Após ter concluído esses desafios, será emitido um certificado valido e disponibilizado para uso.

Conclusão de desafios com entrega de chaves e certificados SSL.

Todos esses passos são feitos de forma automatizada pelo CertBot, um conjunto de scripts opensource, para ajudar a configurar e habilitar o https no seu serviço web. A própria ferramenta já reconfigura o nginx para que seus serviços já possam responder de forma segura.

Vamos começar a brincadeira. Instale os pre-requisitos para o certbot funcionar.

apt updateapt install python3-acme python3-certbot python3-mock python3-openssl python3-pkg-resources python3-pyparsing python3-zope.interfaceapt install python3-certbot-nginx

Após a conclusão da instalação, vamos executar o script para solicitar o certificado para Lets-Encrypts.

certbot — nginx -d zabbix.bernardolankheet.com.br -d www.zabbix.bernardolankheet.com.brcertbot — nginx -d grafana.bernardolankheet.com.br -d www.grafana.bernardolankheet.com.br

Primeiro será necessário aceitar os termos de uso. Na segunda pergunta, será necessário informar um e-mail valido, o próximo passo, pedirá de deseja receber atualizações e informações por e-mail. Após isso, começará a etapa de responder aos desafios impostos pela LetsEncrypt, após ter sucesso, será obtido o certificado SSl. Por fim, será perguntado se deseja criar as regras de redirecionamento automático de http para https.

....
Congratulations! You have successfully enabled
https://zabbix.bernardolankheet.com.br andhttps://www.zabbix.bernardolankheet.com.brYou should test your configuration at:https://www.ssllabs.com/ssltest/analyze.html?d=zabbix.bernardolankheet.com.brhttps://www.ssllabs.com/ssltest/analyze.html?d=www.zabbix.bernardolankheet.com.br- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -IMPORTANT NOTES:- Congratulations! Your certificate and chain have been saved at:....- If you like Certbot, please consider supporting our work by:Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donateDonating to EFF: https://eff.org/donate-le

Se tudo ocorrer bem, verá uma saída parecida com esta.

Validando as configurações.

Após a conclusão, será emitido o certificado e as configurações serão gravadas em /etc/letsencrypt e a chave do certificado em /etc/letsencrypt/live. Outro ponto importante que podemos notar, visualize os arquivos conf que criamos do nginx que foram modificados pelo script.

Teste a renovação do certificado pelo certbot.

certbot renew --dry-run

Teste todas as configurações do nginx.

nginx -t

Reinicie o serviço do nginx.

systemctl restart nginx
systemctl status nginx

Renovação automática do Certificado.

O próprio certbot cria uma tarefa no gerenciador de tarefas do Linux para renovar o certificado de tempo em tempo. O certificado fica valido por 90 dias, e é preciso renova-lo em um período até antes, normalmente feito de mês em mês para evitar que o certificado expire. Uma coisa importante para deixar claro, é que o Letsencrypt possui uma limitação de requisições de certificados, 5 por semana. Logo não é uma boa pratica colocar um período tão frequente.

Tarefa criada pelo Certbot.

cat /etc/cron.d/certbot0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

Considerações Finais.

Nginx é uma ferramenta muito poderosa e que aguenta uma carga considerável de acessos. Pode ser de grande ajuda quando precisa publicar algum mapa do Zabbix dentro do Grafana sem a necessidade de expor seu ambiente e sem precisar passar a url completa com a autenticação do zabbix. E alem de formar uma boa companhia com o certbot para aplicação de SSL em seus ambientes de forma simples, prática e funcional.

Ate breve.

--

--