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!