Tutorial

Como hospedar um site usando o Cloudflare e o Nginx no Ubuntu 18.04

NginxSecurityUbuntu 18.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 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

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:

Create certificate option in the Cloudflare dashboard

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

Origin CA GUI options

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.

Dialog showing the origin certificate and private key

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.

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:

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:

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

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

Enable Full(strict) SSL mode in the Cloudflare Dashboard

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

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

/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;
    ssl_client_certificate /etc/ssl/cloudflare.crt;
    ssl_verify_client on;

    . . .

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.

Enable 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:

Error message

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.

Creative Commons License