*O autor selecionou a Electronic Frontier Foundation para receber uma doação como parte do programa Write for DOnations.*

Introdução

O Cloudflare é um serviço que fica entre o visitante e o servidor do proprietário do site, atuando como um proxy reverso para sites. O Cloudflare fornece uma rede de entrega de conteúdo (CDN), bem como serviços de mitigação de DDoS e serviços de servidor de nomes de domínio distribuídos.

O Nginx é um servidor Web popular responsável por hospedar alguns dos maiores e mais acessados sites na internet. É comum as organizações hospedarem sites com o Nginx e utilizarem o Cloudflare como provedor de CDN e DNS.

Neste tutorial, você irá proteger seu site apresentado pelo Nginx com um certificado de CA de origem da Cloudflare e então configurar o Nginx para usar solicitações pull autenticadas. As vantagens do uso desta configuração é que você se beneficia da CDN do Cloudflare e da resolução rápida de DNS ao mesmo tempo em que garante que todas as conexões passem pelo Cloudflare. Isso impede que quaisquer requisições maliciosas atinjam seu servidor.

Pré-requisitos

cloudflare illustration for: Pré-requisitos

Para completar este tutorial, você precisará do seguinte:

Passo 1 — Gerando um certificado TLS de CA de origem

O CA de origem da Cloudflare permite gerar um certificado TLS gratuito assinado pela Cloudflare para instalar em seu servidor Nginx. Ao usar o certificado TLS gerado pelo Cloudflare você pode proteger a conexão entre os servidores do Cloudflare e seu servidor Nginx.

Para gerar um certificado de CA de origem, faça login em sua conta Clouflare em um navegador Web. Selecione o domínio que você deseja proteger e navegue até a seção SSL/TLS do seu painel do Cloudflare. De lá, navegue até a guia Origin Server e clique no botão Create Certificate:

Deixe a opção padrão Let Cloudflare generate a private key and a CSR selecionada.

Clique em Next e você verá uma caixa de diálogo com o Origin Certificate e Private key. Você precisa transferir tanto o certificado de origem quanto a chave privada do Cloudflare para seu servidor. Por questões de segurança, as informações de Private Key não serão exibidas novamente, então copie a chave para seu servidor antes de clicar em Ok.

Usaremos o diretório /etc/ssl no servidor para manter o certificado de origem e os arquivos da chave privada. A pasta já existe no servidor.

Primeiro, copie o conteúdo de Origin Certificate exibido na caixa de diálogo em seu navegador.

Então, em seu servidor, abra /etc/ssl/cert.pem em seu editor de texto preferido:

				
					
sudo nano /etc/ssl/cert.pem

				
			

Adicione o conteúdo do certificado ao arquivo. Depois, salve e saia do editor.

Em seguida, retorne ao seu navegador e copie o conteúdo de Private Key. Abra o arquivo /etc/ssl/key.pem para edição:

				
					
sudo nano /etc/ssl/key.pem

				
			

Cole a chave privada no arquivo, salve o arquivo e saia do editor.

Nota: às vezes, quando você copia o certificado e a chave do painel Cloudflare e o cola nos arquivos relevantes no servidor, linhas em branco são inseridas. O Nginx irá tratar esses certificados e chaves como inválidos, então certifique-se de que não haja linhas em branco em seus arquivos.

[warning]

Atenção: o certificado de CA de origem do Cloudflare só é reconhecido pelo Cloudflare e, portanto, só deve ser usado por servidores de origem que estejam ativamente conectados ao Cloudflare. Se em qualquer momento você pausar ou desativar o Cloudflare, seu certificado de CA de origem irá disparar um erro de certificado não confiável.

Agora que você copiou os arquivos de chave e de certificado para seu servidor, você precisa atualizar a configuração do Nginx para usá-los.

Passo 2 — Instalando o certificado de CA de origem no Nginx

Na seção anterior, você gerou um certificado de origem e uma chave privada usando o painel do Cloudlfare e salvou os arquivos em seu servidor. Agora, você irá atualizar a configuração do Nginx para que seu site use o certificado de origem e a chave privada para proteger a conexão entre os servidores do Cloudflare e seu servidor.

Primeiro, certifique-se de que o UFW permitirá o tráfego HTTPS. Habilite o perfil Nginx Full, que abrirá tanto a porta 80 (HTTP) quanto a porta 443 (HTTPS):

				
					
sudo ufw allow 'Nginx Full'

				
			

Agora, recarregue o UFW:

				
					
sudo ufw reload

				
			

Por fim, verifique se suas novas regras estão permitidas e se o UFW está ativo:

				
					
sudo ufw status

				
			

Você verá uma saída como esta:

				
					
[secondary_label Output]

Status: <^>active<^>



To Action From

-- ------ ----

OpenSSH ALLOW Anywhere

<^>Nginx Full<^> <^>ALLOW<^> Anywhere

OpenSSH (v6) ALLOW Anywhere (v6)

<^>Nginx Full (v6)<^> <^>ALLOW<^> Anywhere (v6)

				
			

Agora, você está pronto para ajustar seu bloco de servidor Nginx. O Nginx cria um bloco de servidor padrão durante a instalação. Remova-o se ele ainda existir, já que você já configurou um bloco de servidor personalizado para seu domínio:

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

				
			

Em seguida, abra o arquivo de configuração Nginx para seu domínio:

				
					
sudo nano /etc/nginx/sites-available/<^>your_domain<^>

				
			

O arquivo deve ficar assim:

				
					
[label /etc/nginx/sites-available/your_domain]

server {

 listen 80;

 listen [::]:80;



 root /var/www/<^>your_domain<^>/html;

 index index.html index.htm index.nginx-debian.html;



 server_name <^>your_domain<^> <^>www.your_domain<^>;



 location / {

 try_files $uri $uri/ =404;

 }

}



				
			

Vamos modificar o arquivo de configuração do Nginx para fazer o seguinte:

  • Ouvir na porta 80 e redirecionar todas as requisições para usar o https.
  • Ouvir na porta 443 e usar o certificado de origem e a chave privada que você adicionou na seção anterior.

Modifique o arquivo para que fique da seguinte forma:

				
					
[label /etc/nginx/sites-available/your_domain]

server {

 listen 80;

 listen [::]:80;

 server_name <^>your_domain<^> <^>www.your_domain<^>;

 <^>return 302 https://$server_name$request_uri;<^>

}



<^>server {<^>



 <^># SSL configuration<^>



 <^>listen 443 ssl http2;<^>

 <^>listen [::]:443 ssl http2;<^>

 <^>ssl on;<^>

 <^>ssl_certificate /etc/ssl/cert.pem;<^>

 <^>ssl_certificate_key /etc/ssl/key.pem;<^>



 server_name <^>your_domain<^> <^>www.your_domain<^>;



 root /var/www/your_domain/html;

 index index.html index.htm index.nginx-debian.html;





 location / {

 try_files $uri $uri/ =404;

 }

<^>}<^>

				
			

Salve o arquivo e saia do editor.

Em seguida, teste para garantir que não haja erros de sintaxe em qualquer um dos seus arquivos do Nginx:

				
					
sudo nginx -t

				
			

Se nenhum problema for encontrado, reinicie o Nginx para habilitar suas alterações:

				
					
sudo systemctl restart nginx

				
			

Agora, vá até a seção SSL/TLS do painel do Cloudflare, navegue até a guia Overview e mude SSL/TLS encryption mode para Full (strict). Isso informa ao Cloudflare para sempre criptografar a conexão entre o Cloudflare e seu servidor Nginx de origem.

Agora, visite seu site em https://<^>your_domain<^> para verificar se ele está configurado corretamente. Você verá sua página inicial exibida, e o navegador irá informar que o site é seguro.

Na próxima seção, você irá configurar o Authenticated Origin Pulls para verificar se seu servidor de origem está realmente falando com o Cloudflare e não com algum outro servidor. Ao fazer isso, o Nginx será configurado para aceitar somente requisições que usem um certificado cliente válido da Cloudflare; todas as requisições que não passaram pelo Cloudflare serão descartadas.

Passo 3 — Configurando o Authenticated Origin Pulls

O certificado de CA de origem irá ajudar o Cloudflare a verificar se ele está falando com o servidor de origem correto. Este passo irá usar o cliente de autenticação TLS para verificar se seu servidor Nginx de origem está falando com o Cloudflare.

Em um handshake TLS autenticado no cliente, ambos os lados fornecem um certificado a ser verificado. O servidor de origem está configurado para aceitar somente requisições que usam um certificado de cliente válido do Cloudflare. As requisições que não passaram pelo Cloudflare serão descartadas, pois elas não terão o certificado do Cloudflare. Isso significa que os atacantes não podem contornar as medidas de segurança do Cloudflare e se conectar diretamente ao seu servidor Nginx.

O Cloudflare apresenta certificados assinados por uma CA com o seguinte certificado:

				
					
-----BEGIN CERTIFICATE-----

MIIGCjCCA/KgAwIBAgIIV5G6lVbCLmEwDQYJKoZIhvcNAQENBQAwgZAxCzAJBgNV

BAYTAlVTMRkwFwYDVQQKExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmln

aW4gUHVsbDEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZv

cm5pYTEjMCEGA1UEAxMab3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwHhcNMTkx

MDEwMTg0NTAwWhcNMjkxMTAxMTcwMDAwWjCBkDELMAkGA1UEBhMCVVMxGTAXBgNV

BAoTEENsb3VkRmxhcmUsIEluYy4xFDASBgNVBAsTC09yaWdpbiBQdWxsMRYwFAYD

VQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxpZm9ybmlhMSMwIQYDVQQD

ExpvcmlnaW4tcHVsbC5jbG91ZGZsYXJlLm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD

ggIPADCCAgoCggIBAN2y2zojYfl0bKfhp0AJBFeV+jQqbCw3sHmvEPwLmqDLqynI

42tZXR5y914ZB9ZrwbL/K5O46exd/LujJnV2b3dzcx5rtiQzso0xzljqbnbQT20e

ihx/WrF4OkZKydZzsdaJsWAPuplDH5P7J82q3re88jQdgE5hqjqFZ3clCG7lxoBw

hLaazm3NJJlUfzdk97ouRvnFGAuXd5cQVx8jYOOeU60sWqmMe4QHdOvpqB91bJoY

QSKVFjUgHeTpN8tNpKJfb9LIn3pun3bC9NKNHtRKMNX3Kl/sAPq7q/AlndvA2Kw3

Dkum2mHQUGdzVHqcOgea9BGjLK2h7SuX93zTWL02u799dr6Xkrad/WShHchfjjRn

aL35niJUDr02YJtPgxWObsrfOU63B8juLUphW/4BOjjJyAG5l9j1//aUGEi/sEe5

lqVv0P78QrxoxR+MMXiJwQab5FB8TG/ac6mRHgF9CmkX90uaRh+OC07XjTdfSKGR

PpM9hB2ZhLol/nf8qmoLdoD5HvODZuKu2+muKeVHXgw2/A6wM7OwrinxZiyBk5Hh

CvaADH7PZpU6z/zv5NU5HSvXiKtCzFuDu4/Zfi34RfHXeCUfHAb4KfNRXJwMsxUa

+4ZpSAX2G6RnGU5meuXpU5/V+DQJp/e69XyyY6RXDoMywaEFlIlXBqjRRA2pAgMB

AAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1Ud

DgQWBBRDWUsraYuA4REzalfNVzjann3F6zAfBgNVHSMEGDAWgBRDWUsraYuA4REz

alfNVzjann3F6zANBgkqhkiG9w0BAQ0FAAOCAgEAkQ+T9nqcSlAuW/90DeYmQOW1

QhqOor5psBEGvxbNGV2hdLJY8h6QUq48BCevcMChg/L1CkznBNI40i3/6heDn3IS

zVEwXKf34pPFCACWVMZxbQjkNRTiH8iRur9EsaNQ5oXCPJkhwg2+IFyoPAAYURoX

VcI9SCDUa45clmYHJ/XYwV1icGVI8/9b2JUqklnOTa5tugwIUi5sTfipNcJXHhgz

6BKYDl0/UP0lLKbsUETXeTGDiDpxZYIgbcFrRDDkHC6BSvdWVEiH5b9mH2BON60z

0O0j8EEKTwi9jnafVtZQXP/D8yoVowdFDjXcKkOPF/1gIh9qrFR6GdoPVgB3SkLc

5ulBqZaCHm563jsvWb/kXJnlFxW+1bsO9BDD6DweBcGdNurgmH625wBXksSdD7y/

fakk8DagjbjKShYlPEFOAqEcliwjF45eabL0t27MJV61O/jHzHL3dknXeE4BDa2j

bA+JbyJeUMtU7KMsxvx82RmhqBEJJDBCJ3scVptvhDMRrtqDBW5JShxoAOcpFQGm

iYWicn46nPDjgTU0bX1ZPpTpryXbvciVL5RkVBuyX2ntcOLDPlZWgxZCBp96x07F

AnOzKgZk4RzZPNAxCXERVxajn/FLcOhglVAKo5H0ac+AitlQ0ip55D2/mf8o72tM

fVQ6VpyjEXdiIXWUq/o=

-----END CERTIFICATE-----

				
			

Você também pode baixar o certificado diretamente do Cloudflare aqui.

Copie este certificado.

Em seguida, crie o arquivo /etc/ssl/cloudflare.crt para armazenar o certificado do Cloudflare:

				
					
sudo nano /etc/ssl/cloudflare.crt

				
			

Adicione o certificado ao arquivo. Então, salve o arquivo e saia do editor.

Agora, atualize sua configuração do Nginx para usar o TLS Authenticated Origin Pulls. Abra o arquivo de configuração para seu domínio:

				
					
sudo nano /etc/nginx/sites-available/&lt;^&gt;your_domain&lt;^&gt;

				
			

Adicione as diretivas ssl_client_certificate e ssl_verify_client como mostrado no seguinte exemplo:

				
					
[label /etc/nginx/sites-available/your_domain]

. . .



server {



 # SSL configuration



 listen 443 ssl http2;

 listen [::]:443 ssl http2;

 ssl on;

 ssl_certificate /etc/ssl/cert.pem;

 ssl_certificate_key /etc/ssl/key.pem;

 &lt;^&gt;ssl_client_certificate /etc/ssl/cloudflare.crt;&lt;^&gt;

 &lt;^&gt;ssl_verify_client on;&lt;^&gt;



 . . .

				
			

Salve o arquivo e saia do editor.

Em seguida, teste para garantir que não haja erros de sintaxe em sua configuração do Nginx:

				
					
sudo nginx -t

				
			

Se nenhum problema for encontrado, reinicie o Nginx para habilitar suas alterações:

				
					
sudo systemctl restart nginx

				
			

Por fim, para habilitar o Authenticated Pulls, abra a seção SSL/TLS no painel do Cloudflare, navegue até a guia Origin Server e alterne a opção Authenticated Origin Pulls.

Agora, visite seu site em https://<^>your_domain<^> para verificar se ele está configurado corretamente. Como antes, você verá sua página inicial exibida.

Para verificar se seu servidor irá aceitar apenas requisições assinadas pela CA do Cloudflare, alterne a opção Authenticated Origin Pulls para desativá-la e então recarregue seu site. Você deve obter a seguinte mensagem de erro:

Seu servidor de origem gera um erro se uma requisição não for assinada pela CA do Cloudflare.

Nota: a maioria dos navegadores irá fazer cache das requisições, então para ver a alteração acima que você pode usar o modo de navegação anônimo/privado em seu navegador. Para evitar que o Cloudflare faça cache das requisições enquanto você configura seu site, navegue até Overview no painel do Cloudflare e alterne o Development Mode.

Agora que você sabe que ele funciona corretamente, retorne à seção SSL/TLS no painel do Cloudflare, navegue até a guia Origin Server e alterne a opção Authenticated Origin Pulls de novo para habilitá-la.

Conclusão

Neste tutorial, você protegeu seu site hospedado em Nginx criptografando o tráfego entre o Cloudflare e o servidor Nginx usando um certificado de CA de origem do Cloudflare. Em seguida, você configurou o Authenticated Origin Pulls no servidor Nginx para garantir que ele somente aceita requisições dos servidores do Cloudflare, impedindo qualquer um que se conecte diretamente ao servidor Nginx.