Desenvolvimento web

Configurações úteis de segurança para servidores Nginx

Desde que migrei este site para os serviços do Google Cloud, no início do ano, venho aprendendo a usar o Nginx. Neste post, compartilho algumas etapas essenciais de segurança que pesquisei e que podem ser úteis para quem está aprendendo ou quer ganhar tempo na configuração e implementação do servidor.

É importante considerar que o servidor Nginx é mais eficiente, consumindo menos recursos do que o Apache, e se tornou recentemente o servidor web mais popular no mundo.

Trabalhando com HTTPS no Nginx

O uso de HTTPS para navegação em websites se tornou uma prática padrão, essencial inclusive para sites pessoais e blogs (como o que você está lendo agora). O Google já leva em consideração o uso de certificados de segurança para o ranqueamento no sistema de busca, como um dos parâmetros do conceito de Page Experience.

Você pode instalar um certificado de segurança no seu servidor Nginx gratuitamente usando o Certbot. Alguns serviços de hospedagem também oferecem instalações gratuitas ou pagas em seus planos.

Uma vez instalado, você pode redirecionar todo o tráfego para a versão segura do seu site com HTTPS usando o código abaixo no bloco server do arquivo de configuração dentro da pasta sites-enabled.

# Force HTTPS
#
server {
	listen 80;
	listen [::]:80;
	access_log off;
	error_log off;
	server_name example.com www.example.com;
 
	return 301 https://example.com$request_uri;
}

No código acima, todos os acessos via porta 80 (http) no domínio example.com e com o subdomínio www.example.com serão redirecionados para o endereço https://example.com. Note o $request_uri, que repassa o caminho de arquivos que possa vir depois do domínio na barra de endereços.

Também é recomendável bloquear o acesso via porta 80 no endereço IP do seu servidor. No caso, o servidor retorna um erro 444 (connection closed without response).

# Block access using server IP
#
server {
	listen	80 default_server;
	server_name _;
	return	444;
}

Para bloquear o acesso direto via IP inclusive via HTTPS, forçando o usuário a acessar pelo domínio do seu site, você pode adaptar o bloco de configurações do site com SSL em seu servidor usando o seguinte código:

server {
        ...

	server_name example.com www.example.com;

	if ($host !~ ^(example.com|www.example.com)$){
		return 400;
	}

	...
}

Neste exemplo, se o usuário acessa o servidor por algo diferente de example.com ou www.example.com, o Nginx retorna para o usuário um erro 400 (Bad Request). Note que o erro 444 não pode ser retornado por conta do handshake na conexão SSL.

Protegendo pastas com senha no Nginx

Outra dica de segurança no Nginx é proteger o acesso à pastas e arquivos confidenciais ou administrativos com senha, para evitar acessos não-autorizados.

Primeiro é necessário criarmos um arquivo de senha com as credenciais de acesso. Para criar uma senha criptografada, use o comando openssl password no terminal. Insira e confirme a senha desejada. O comando retornará a versão criptografada da sua senha:

// Criar uma senha criptografada

openssl password

// Exemplo de retorno após a entrada da senha desejada

/PUfiF9t9VXnI

Copie o valor retornado. Agora vamos criar o arquivo com os dados de autenticação. Neste exemplo, nomearemos o arquivo como autenticacao e salvaremos dentro da pasta /etc/nginx/.

// Criar o arquivo /etc/nginx/autenticacao no editor de texto

sudo nano /etc/nginx/autenticacao

No editor de texto, você especificará o nome de usuário, seguido por dois pontos, e a senha criptografada que criou nos passos anteriores. Por exemplo john_doe:/PUfiF9t9VXnI. Salve e feche o arquivo.

Agora vamos modificar o arquivo de configuração do Nginx. Abra o arquivo de configuração correspondente ao site desejado na pasta /etc/nginx/sites-available/. Neste exemplo, faremos a configuração na pasta /restrito/.

server {
        ...     

        location / {
                try_files $uri $uri/ =404;
        }

        location ^~ /restrito/ {
            auth_basic "Admin Login";
            auth_basic_user_file /etc/nginx/autenticacao;
        }

        ...
}

Salve o arquivo no editor de texto e reinicie o servidor Nginx com o comando sudo systemctl reload nginx. Quando algum usuário acessar o endereço example.com/restrito, ele vará um prompt do navegador exigindo nome de usuário e senha definido no arquivo autenticacao para acessá-lo.

Cabeçalhos de segurança no Nginx

Por fim, uma configuração importante que evita, entre outros, injeção de código malicioso e clickjacking. Pode ser configurado tanto no arquivo correspondente ao site na pasta sites-available quanto no arquivo de configuração geral do Nginx, com o comando add_header.

A configuração dos cabeçalhos depende do nível de segurança que você precisa oferecer no seu site, mas segue abaixo um exemplo.

add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://ssl.google-analytics.com; img-src 'self' https://ssl.google-analytics.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://themes.googleusercontent.com; object-src 'none'";

Você pode aprender mais sobre cabeçalhos de segurança neste post do web.dev, do Google Developers.

Dica extra: remover a versão do Nginx das páginas padrão de erro e dos cabeçalhos

Permitir que usuários saibam qual a versão instalada do Nginx permite a exploração de possíveis vulnerabilidades de segurança, principalmente se o servidor não é atualizado. Para ocultar a versão do servidor Nginx nas páginas de erro padrão do servidor e dos cabeçalhos, basta inserir no arquivo de configuração o comando server_tokens off;.

Tem mais alguma dica? Deixe sua sugestão nos comentários!

Tags: , , , ,

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.