Como Hospedar um Site Usando o Cloudflare e Nginx no Ubuntu 22.04

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 Distribuição de Conteúdo (CDN), bem como mitigação de DDoS e serviços de servidor de nomes de domínio distribuído.

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

Neste tutorial, você irá proteger seu site servido pelo Nginx com um certificado Origin CA do Cloudflare e depois configurar o Nginx para usar solicitações de busca autenticadas. As vantagens de usar essa configuração são que você se beneficia da CDN do Cloudflare e da rápida resolução de DNS enquanto garante que todas as conexões passem pelo Cloudflare. Isso impede que qualquer solicitação maliciosa alcance seu servidor.

Pré-requisitos

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

Etapa 1 — Gerando um Certificado TLS da CA de Origem

O Cloudflare Origin CA permite que você gere um certificado TLS gratuito assinado pelo 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 com Origin CA, faça login na sua conta do Cloudflare em um navegador da web. Selecione o domínio que você deseja proteger e acesse a seção SSL/TLS do painel do Cloudflare. Em seguida, vá para a aba do Servidor de Origem e clique no botão Criar Certificado:

Deixe selecionada a opção padrão de Gerar chave privada e CSR com o Cloudflare.

Clique em Criar e você verá um diálogo com o Certificado de Origem e a Chave Privada. Você precisa transferir tanto o certificado de origem quanto a chave privada do Cloudflare para o seu servidor. Por razões de segurança, as informações da Chave Privada não serão exibidas novamente, então copie a chave para o seu servidor antes de clicar em Ok.

Você usará o diretório /etc/ssl no servidor para armazenar os arquivos do certificado de origem e da chave privada. A pasta já existe no servidor.

Primeiro, copie o conteúdo do Certificado de Origem exibido na caixa de diálogo no seu navegador.

Em seguida, no seu servidor, abra o arquivo /etc/ssl/cert.pem no seu editor de texto preferido:

  1. sudo nano /etc/ssl/cert.pem

Cole o conteúdo do certificado no arquivo. Em seguida, salve e saia do editor. Se estiver usando o nano, pressione Ctrl+X, depois quando solicitado, Y e depois Enter.

Depois, volte para o seu navegador e copie o conteúdo da Chave Privada. Abra o arquivo /etc/ssl/key.pem para edição:

  1. sudo nano /etc/ssl/key.pem

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

Nota: Às vezes, ao copiar o certificado e a chave do painel da Cloudflare e colá-los nos arquivos relevantes no servidor, linhas em branco são inseridas. O Nginx tratará esses certificados e chaves como inválidos, portanto, certifique-se de que não haja linhas em branco em seus arquivos.

Aviso: O Certificado de CA de Origem da Cloudflare é confiável apenas pela Cloudflare e, portanto, deve ser usado apenas por servidores de origem que estejam conectados ativamente à Cloudflare. Se em algum momento você pausar ou desativar a Cloudflare, seu certificado de CA de origem apresentará um erro de certificado não confiável.

Agora que você copiou os arquivos de chave e 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 da Cloudflare e salvou os arquivos em seu servidor. Agora você atualizará a configuração do Nginx para seu site usar o certificado de origem e a chave privada para garantir a conexão entre os servidores da Cloudflare e seu servidor.

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

  1. sudo ufw allow 'Nginx Full'

Agora recarregue o UFW:

  1. sudo ufw reload

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

  1. sudo ufw status

Você verá uma saída como esta:

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 o bloco do servidor Nginx. O Nginx cria um bloco de servidor padrão durante a instalação. Remova-o se ainda existir, pois você já configurou um bloco de servidor personalizado para seu domínio:

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

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

  1. sudo nano /etc/nginx/sites-available/your_domain

O arquivo deve parecer com isso:

/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;
        }
}

Você modificará o arquivo de configuração do Nginx para fazer o seguinte:

  • Ouça na porta 80 e redirecione todas as solicitações para usar https.
  • Ouça na porta 443 e use o certificado de origem e a chave privada adicionados na seção anterior.

Modifique o arquivo para que ele fique assim:

/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 {

    # Configuração SSL

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    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 nenhum dos seus arquivos de configuração do Nginx:

  1. sudo nginx -t

Se não encontrou problemas, reinicie o Nginx para habilitar suas alterações:

  1. sudo systemctl restart nginx

Agora vá para a seção SSL/TLS do painel do Cloudflare, navegue até a aba Visão geral e altere o modo de criptografia SSL/TLS para Completo (estrito). Isso informa ao Cloudflare para sempre criptografar a conexão entre o Cloudflare e seu servidor de origem Nginx.

Agora visite seu site em https://seu_domínio para verificar se está configurado corretamente. Você verá sua página inicial exibida, e o navegador informará que o site é seguro.

Para visualizar os detalhes do seu certificado, acesse as Ferramentas do Desenvolvedor do seu navegador, selecione a guia Segurança e depois clique em Ver Certificado.

Observação: Você pode notar que o seu certificado não lista a Cloudflare como a emissora. Isso ocorre porque a Cloudflare pode usar outras autoridades de certificação, como a Let’s Encrypt. Para uma lista completa, consulte a documentação de produtos da Cloudflare para autoridades de certificação.

Na próxima seção, você irá configurar as Solicitações de Origem Autenticadas para verificar se o seu servidor de origem está realmente se comunicando com a Cloudflare e não com outro servidor. Ao fazer isso, o Nginx será configurado para aceitar apenas solicitações que usem um certificado de cliente válido da Cloudflare; todas as solicitações que não passaram pela Cloudflare serão descartadas.

Passo 3 — Configurando as Solicitações de Origem Autenticadas

O certificado da CA de origem ajudará a Cloudflare a verificar se está se comunicando com o servidor de origem correto. Este passo utilizará a Autenticação de Cliente TLS para verificar se o seu servidor Nginx de origem está se comunicando com a Cloudflare.

Em um handshake TLS autenticado pelo cliente, ambos os lados fornecem um certificado a ser verificado. O servidor de origem é configurado para aceitar apenas solicitações que usem um certificado de cliente válido da Cloudflare. Solicitações que não passaram pela Cloudflare serão descartadas, pois não terão o certificado da Cloudflare. Isso significa que os atacantes não podem contornar as medidas de segurança da Cloudflare e se conectar diretamente ao seu servidor Nginx.

A 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 da documentação da Cloudflare.

Copie este certificado.

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

  1. sudo nano /etc/ssl/cloudflare.crt

Adicione o certificado ao arquivo. Em seguida, salve o arquivo e saia do editor.

Agora atualize sua configuração do Nginx para usar Autenticação de Origem por TLS. Abra o arquivo de configuração para seu domínio:

  1. sudo nano /etc/nginx/sites-available/your_domain

Adicione as diretivas ssl_client_certificate e ssl_verify_client conforme mostrado no exemplo a seguir:

/etc/nginx/sites-available/your_domain
. . .

server {

    # Configuração SSL

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate         /etc/ssl/cert.pem;
    ssl_certificate_key     /etc/ssl/key.pem;
    ssl_client_certificate /etc/ssl/cloudflare.crt;
    ssl_verify_client on;

    . . .

Salve o arquivo e saia do editor.

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

  1. sudo nginx -t

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

  1. sudo systemctl restart nginx

Finalmente, para habilitar Pulls Autenticados, abra a seção SSL/TLS no painel da Cloudflare, navegue até a guia Servidor de Origem e ative a opção Pulls de Origem Autenticados.

Agora, visite seu site em https://seu_domínio para verificar se foi configurado corretamente. Como antes, você verá sua página inicial sendo exibida.

Para verificar se seu servidor aceitará apenas solicitações assinadas pela CA da Cloudflare, desative a opção Pulls de Origem Autenticados e recarregue seu site. Você deverá receber a seguinte mensagem de erro:

Seu servidor de origem gera um erro se a CA da Cloudflare não assinar uma solicitação.

Observação: A maioria dos navegadores armazenará em cache as solicitações, então, para ver a alteração acima, você pode usar o modo de navegação anônima/privada em seu navegador. Para evitar que a Cloudflare armazene em cache as solicitações enquanto você configura seu site, navegue até Visão Geral no painel da Cloudflare e ative Modo de Desenvolvimento.

Agora que você sabe que funciona corretamente, retorne à seção SSL/TLS no painel da Cloudflare, navegue até a guia Servidor de Origem e ative novamente a opção Pulls de Origem Autenticados.

Conclusão

Neste tutorial, você garantiu seu site alimentado pelo Nginx criptografando o tráfego entre o Cloudflare e o servidor Nginx usando um certificado de CA de Origem do Cloudflare. Em seguida, configurou as Solicitações de Origem Autenticadas no servidor Nginx para garantir que ele apenas aceite as solicitações dos servidores do Cloudflare, impedindo que qualquer outra pessoa se conecte diretamente ao servidor Nginx.

Source:
https://www.digitalocean.com/community/tutorials/how-to-host-a-website-using-cloudflare-and-nginx-on-ubuntu-22-04