Tutorial

Como proteger o Nginx com o Let's Encrypt no Ubuntu 20.04

NginxUbuntuSecurityUbuntu 20.04

Introdução

A Let’s Encrypt é uma autoridade certificadora (CA) que proporciona uma maneira descomplicada de obter e instalar certificados TLS/SSL, gratuitamente, possibilitando assim protocolos HTTPS criptografados em servidores web. Ela simplifica o processo ao fornecer um cliente de software, o Certbot, que tenta automatizar a maioria (se não todas) das etapas necessárias. Atualmente, todo o processo de obtenção e instalação de um certificado é totalmente automatizado em Apache e Nginx.

Neste tutorial, você usará o Certbot para obter um certificado SSL gratuito para o Nginx no Ubuntu 20.04 e para configurar o seu certificado para renovação automática.

Este tutorial usará um arquivo de configuração de servidor separado do Nginx em vez do arquivo padrão. Recomendamos que você crie novos arquivos de bloco do servidor do Nginx para cada domínio, uma vez que isso ajuda a evitar erros comuns e mantém as linhas padrão como uma configuração de fallback.

Pré-requisitos

Para seguir este tutorial, você vai precisar do seguinte:

  • Um servidor Ubuntu 20.04 configurado seguindo este tutorial de configuração inicial de servidor para o Ubuntu 20.04, incluindo um usuário não-root com sudo habilitado e um firewall.

  • Um nome de domínio registrado. Este tutorial usará o example.com do início ao fim. Você pode comprar um nome de domínio do Namecheap, obter um gratuitamente com o Freenom ou usar o registrador de domínios de sua escolha.

  • Ambos os registros de DNS a seguir serão configurados para o seu servidor. Se você estiver usando a DigitalOcean, consulte nossa documentação de DNS para maiores detalhes sobre como adicioná-los.

    • Um registro A com example.com apontando para o endereço de IP público do seu servidor.
    • Um registro A com www.example.com apontando para o endereço de IP público do seu servidor.
  • O Nginx instalado seguindo Como instalar o Nginx no Ubuntu 20.04. Certifique-se de que você tenha um bloco de servidor para o seu domínio. Este tutorial usará o /etc/nginx/sites-available/example.com como exemplo.

Etapa 1 — Instalando o Certbot

A primeira etapa para usar o Let’s Encrypt para obter um certificado SSL, é instalar o software Certbot no seu servidor.

Instale o Certbot e seu plug-in do Nginx com o apt:

  • sudo apt install certbot python3-certbot-nginx

O Certbot agora está pronto para ser usado. Para que ele configure automaticamente o SSL para o Nginx, porém, precisamos verificar algumas configurações do Nginx.

Passo 2 — Confirmando a configuração do Nginx

O Certbot precisa conseguir encontrar o bloco de server (servidor) correto na sua configuração Nginx para que ele seja capaz de configurar automaticamente o SSL. Mais especificamente, ele faz isso procurando uma diretiva server_name que corresponda ao domínio do qual você solicita um certificado.

Se você seguiu o passo de configuração de bloco de servidor no tutorial de instalação do Nginx, você deve ter um bloco de servidor para seu domínio em /etc/nginx/sites-available/example.com com a diretriz server_name já devidamente configurada.

Para verificar, abra o arquivo de configuração do seu domínio usando o nano ou seu editor de texto preferido:

  • sudo nano /etc/nginx/sites-available/example.com

Encontre a linha existente server_name. Deve se parecer com isto:

/etc/nginx/sites-available/example.com
...
server_name example.com www.example.com;
...

Se parecer, saia do seu editor e siga para o próxima etapa.

Se não, atualize-a para corresponder. Em seguida, salve o arquivo, feche o editor e verifique a sintaxe de suas edições de configuração:

  • sudo nginx -t

Se receber um erro, abra novamente o arquivo de bloco de servidor e verifique se há erros de digitação ou se faltam caracteres. Assim que a sintaxe do seu arquivo de configuração estiver correta, recarregue o Nginx para carregar a nova configuração:

  • sudo systemctl reload nginx

O Certbot agora consegue encontrar o bloco de server correto e atualizá-lo automaticamente.

Em seguida, atualizaremos o firewall para permitir o tráfego HTTPS.

Etapa 3 — Permitindo tráfego HTTPS pelo firewall

Se você tem o firewall ufw ativado, conforme recomendado pelos guias de pré-requisitos, será necessário ajustar as configurações para permitir o tráfego HTTPS. Felizmente, o Nginx registra alguns perfis com o ufw durante a instalação.

Você pode verificar a configuração atual digitando:

  • sudo ufw status

Provavelmente irá se parecer com isso, o que significa que apenas o tráfego HTTP é permitido no servidor Web:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)

Para também permitir o tráfego HTTPS, autorize o perfil Nginx Full e apague a autorização do perfil Nginx HTTP redundante:

  • sudo ufw allow 'Nginx Full'
  • sudo ufw delete allow 'Nginx HTTP'

Seu status agora deve se parecer com este:

  • sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)

Em seguida, vamos executar o Certbot e buscar os nossos certificados.

Etapa 4 — Obtendo um certificado SSL

O Certbot oferecer várias maneiras de obter certificados SSL através de plug-ins. O plug-in Nginx cuidará da reconfiguração do Nginx e recarregará a configuração sempre que necessário. Para usar este plug-in, digite o seguinte:

  • sudo certbot --nginx -d example.com -d www.example.com

Esse comando executa o certbot com o plug-in --nginx, usando -d para especificar os nomes para os quais desejamos um certificado válido.

Se essa é a primeira vez que você executa o certbot, você será solicitado a informar um endereço de e-mail e concordar com os termos de serviço. Após fazer isso, o certbot se comunicará com o servidor da Let’s Encrypt, executando posteriormente um desafio para verificar se você controla o domínio para o qual está solicitando um certificado.

Se tudo correr bem, o certbot perguntará como você quer definir suas configurações de HTTPS.

Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Select your choice then hit ​​​ENTER​​​​​. A configuração será atualizada e o Nginx recarregará para aplicar as novas configurações. O certbot será encerrado com uma mensagem informando que o processo foi concluído e onde os certificados estão armazenados:

Output
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2020-08-18. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

Seus certificados são baixados, instalados e carregados. Tente recarregar o site usando https:// e verifique o indicador de segurança do seu navegador. Ele deve indicar que o site está devidamente protegido, normalmente com um ícone de cadeado. Se você testar o servidor usando o SSL Labs Server Test​​​​, receberá uma classificação A.

Vamos concluir testando o processo de renovação.

Etapa 5 — Verificando a renovação automática do Certbot

Os certificados da Let’s Encrypt possuem validade de apenas 90 dias. Isso visa incentivar os usuários a automatizar o processo de renovação de certificados. O pacote certbot que instalamos cuida disso adicionando um temporizador systemd que será executado duas vezes por dia e renovará automaticamente qualquer certificado que esteja dentro de trinta dias da expiração.

Você pode consultar o status do temporizador com o systemctl:

  • sudo systemctl status certbot.timer
Output
● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left Triggers: ● certbot.service

Para testar o processo de renovação, você pode realizar uma simulação com o certbot:

  • sudo certbot renew --dry-run

Se não aparecerem erros, tudo funcionou. Quando necessário, o Certbot renovará seus certificados e recarregará o Nginx para aplicar as alterações. Se o processo de renovação automatizada alguma vez falhar, a Let’s Encrypt enviará uma mensagem para o e-mail que você especificou, informando quando o certificado vai expirar.

Conclusão

Neste tutorial, você instalou o certbot do cliente Let’s Encrypt, baixou os certificados SSL para o seu domínio, configurou o Nginx para usar esses certificados e configurou a renovação automática de certificados. Em caso de outras dúvidas sobre como usar o Certbot, a documentação oficial é um bom ponto de partida.

Creative Commons License