A crescente exposição e complexidade das infraestruturas de rede têm aumentado a importância da segurança. Nesse sentido, um grande aliado é o uso de soluções de proxy reverso, como o NginX.
No entanto, embora amplamente adotado o NginX como um proxy reverso, vamos abordar estratégias e práticas recomendadas para reforçar a segurança nesta solução.
Em resumo, estas estratégias visam fortalecer a resiliência do ambiente contra ameaças cibernéticas e promover a segurança dos sistemas e dados gerenciados por ele, através da adição de cabeçalhos de segurança na configuração do proxy reverso.
Os passos a seguir foram baseados nas configurações de servidor utilizando nosso Post Instalando o Proxy Reverso com Ngnix no CentOS7.
Testando a configuração do seu ambiente
Antes de implementar qualquer configuração, sugerimos que você verifique a segurança atual do seu site, para isso iremos sugerir uma ferramenta web simples e eficiente.
O Security Headers é uma ferramenta web de teste gratuita. Além disso, irá ajudá-lo a compreender quais são os ajustes recomendados, proporcionando uma classificação de resultado do seu ambiente e informações sobre como implantar cabeçalhos de segurança que estejam ausentes.
Com essa análise e ajustes resultará em um aumento da segurança de seus sites e/ou aplicações Web.
Adicionando cabeçalhos de segurança
Adicionar cabeçalhos de segurança na configuração do Nginx oferece várias vantagens, incluindo:
- Proteção contra ataques: Cabeçalhos de segurança (como o Content-Security-Policy (CSP), X-Frame-Options, X-XSS-Protection, e X-Content-Type-Options) ajudam a proteger contra diversos ataques.
- Controle de políticas de segurança: Os cabeçalhos de segurança controlam como navegadores interagem com o site, restringindo o comportamento e reduzindo potenciais fontes de ataque.
- Prevenção de Clickjacking: O cabeçalho X-Frame-Options protege contra ataques ao especificar se uma página pode ser exibida em um frame ou iframe. Ele ajuda a proteger sua aplicação contra a inclusão maliciosa em frames de outras páginas da web.
- Prevenção de ataques XSS: O cabeçalho X-XSS-Protection ajudam a prevenir ataques de Cross-Site, ao ativar o mecanismo de proteção XSS integrado nos navegadores web modernos.
- Controle de MIME types: O cabeçalho X-Content-Type-Options previne ataques de MIME sniffing, especificando que o navegador respeite o tipo de conteúdo declarado no cabeçalho Content-Type.
- Políticas de conteúdo seguro: O Content-Security-Policy (CSP) permite especificar fontes confiáveis de recursos (como script), reduzindo a execução de scripts maliciosos ou não autorizados.
- Aumento da confiabilidade e integridade dos dados: Ajuda a garantir que os dados sejam transmitidos de forma segura, reduzindo o risco de comprometimento de dados.
Em suma, a adição de cabeçalhos de segurança na configuração do proxy reverso com NginX fortalece a segurança da sua aplicação web e proteger contra uma variedade de ataques e vulnerabilidades comuns. Para isso crie o arquivo /etc/nginx/security_headers.conf com o seguinte conteúdo:
add_header Content-Security-Policy "upgrade-insecure-requests; default-src * 'unsafe-inline'; font-src * data: 'unsafe-inline'; frame-ancestors 'self' *; img-src * data: 'unsafe-inline'; object-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'self' 'unsafe-eval'; style-src * 'unsafe-inline'; media-src * data: 'unsafe-inline'" always;
add_header Referrer-Policy "strict-origin";
add_header Permissions-Policy "camera=(), fullscreen=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), sync-xhr=()";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Xss-Protection "1; mode=block" always;
proxy_hide_header X-Powered-By;
Agora, no arquivo de configuração de seu site, adicione a seguinte configuração (dentro da sessão “server { “)
include /etc/nginx/security_headers.conf;
Teste a configuração e reinicie o serviço do NginX. Por fim, verifique a segurança, antes e depois de executar essas configurações, através do site Security Headers.
Limitando a conexão e balanceando entre servidores
Para balancear a conexão entre múltiplos servidores internos, evitando quedas e problemas de desempenho, é criar um pool de conexão. Para isso no inicio do arquivo de configuração que redirecionar para o seu site, adicione:
upstream pool_site_suaempresa.com.br {
least_conn;
server IP_SERVIDOR1 fail_timeout=30s max_fails=3;
server IP_SERVIDOR2 fail_timeout=30s max_fails=3;
}
Ainda no arquivo de configuração de seu site, localize a(s) linha(s) proxy_pass e altere para:
proxy_pass http://pool_site_suaempresa.com.br;
Para limitar o número de conexões para IP de origem adicione a variável limit_conn (dentro de server { ), exemplo:
limit_conn limitconnbyaddr 50;
Para adicionar um número máximo de conexões para cada IP, adicione a variável max_conns, exemplo:
upstream pool_seusite.suaempresa.com {
least_conn;
server IP_SERVIDOR1 fail_timeout=30s max_fails=3 max_conns=100;
server IP_SERVIDOR2 fail_timeout=30s max_fails=3 max_conns=100;
}
Adicionando configuração de segurança de conexão
Ao consultar o log de acesso do NginX você pode se deparar com uma série de acessos invedidos, entre eles verificar que o agente que está se conectando é um bot para extrair os dados do seu site. Para bloquear esse tipo de conexão, crie o arquivo /etc/nginx/block_content.conf com o seguinte conteúdo:
## Block SQL injections
set $block_sql_injections 0;
if ($query_string ~ "union.*select.*\(") {
set $block_sql_injections 1;
}
if ($query_string ~ "union.*all.*select.*") {
set $block_sql_injections 1;
}
if ($query_string ~ "concat.*\(") {
set $block_sql_injections 1;
}
if ($block_sql_injections = 1) {
return 403;
}
## Block file injections
set $block_file_injections 0;
if ($query_string ~ "[a-zA-Z0-9_]=http://") {
set $block_file_injections 1;
}
if ($query_string ~ "[a-zA-Z0-9_]=(\.\.//?)+") {
set $block_file_injections 1;
}
if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") {
set $block_file_injections 1;
}
if ($block_file_injections = 1) {
return 403;
}
## Block common exploits
set $block_common_exploits 0;
if ($query_string ~ "(<|%3C).*script.*(>|%3E)") {
set $block_common_exploits 1;
}
if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") {
set $block_common_exploits 1;
}
if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") {
set $block_common_exploits 1;
}
if ($query_string ~ "proc/self/environ") {
set $block_common_exploits 1;
}
if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3D)") {
set $block_common_exploits 1;
}
if ($query_string ~ "base64_(en|de)code\(.*\)") {
set $block_common_exploits 1;
}
if ($block_common_exploits = 1) {
return 403;
}
## Block spam
set $block_spam 0;
if ($query_string ~ "\b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)\b"){
set $block_spam 1;
}
if ($query_string ~ "\b(erections|hoodia|huronriveracres|impotence|levitra|libido)\b") {
set $block_spam 1;
}
if ($query_string ~ "\b(ambien|blue\spill|cialis|cocaine|ejaculation|erectile)\b") {
set $block_spam 1;
}
if ($query_string ~ "\b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)\b") {
set $block_spam 1;
}
if ($block_spam = 1) {
return 403;
}
## Block user agents
set $block_user_agents 0;
# Don't disable wget if you need it to run cron jobs!
if ($http_user_agent ~ "Wget") {
set $block_user_agents 1;
}
# Disable Akeeba Remote Control 2.5 and earlier
if ($http_user_agent ~ "Indy Library") {
set $block_user_agents 1;
}
# Common bandwidth hoggers and hacking tools.
if ($http_user_agent ~ "libwww-perl") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "GetRight") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "GetWeb!") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "Go!Zilla") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "Download Demon") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "Go-Ahead-Got-It") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "TurnitinBot") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "GrabNet") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "crawler") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "gptbot") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "amazonbot") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "developers") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "academicbot") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "SemrushBot") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "AhrefsBot") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "DotBot") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "mj12bot") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "OAI-SearchBot") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "ChatGPT-User") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "YandexBot") {
set $block_user_agents 1;
}
if ($http_user_agent ~ "PerplexityBot") {
set $block_user_agents 1;
}
if ($block_user_agents = 1) {
return 403;
}
Agora, no arquivo de configuração de seu site, adicione a seguinte configuração (dentro da sessão “server { “)
include /etc/nginx/block_content.conf;
Uma forma de simular o cliente em seu NginX é executar o seguinte comando:
curl -v --compressed -H "Range: bytes=0-524288" -H "Connection: close" -A "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" "http://seusite.com"
O comando acima deverá retornar o tipo de acesso, incluindo qual foi o resultado dessa tentativa. É possível você customizar e simular a conexão que deseja fazer no seu servidor, lhe permitindo adicionar outro agente específico ao seu caso no teste.
Criando uma Blacklist
Para criar uma blacklist, com os IP’s que deseja bloquear em todos seus sites, crie um único arquivo de configuração e importe na configuração de seus sites, dessa forma você terá um único local para cadastrar as origens que serão bloqueados em todos os sites que o NginX proteje. Para isso, crie o arquivo /etc/nginx/blacklist.conf com o seguinte conteúdo:
deny IP;
deny REDE/MÁSCARA;
Agora, no arquivo de configuração de seus sites, adicione a linha (dentro de server { )
include /etc/nginx/block_content.conf;
Reinicie o NginX e verifique se a configuração fez efeito.
Fontes/Referências
NVLAN – Instalando o Proxy Reverso com Ngnix no CentOS7
https://developers.facebook.com/docs/sharing/webmasters/web-crawlers
https://docs.nginx.com/nginx/admin-guide/security-controls/controlling-access-proxied-http
https://howtoforge.com/nginx-how-to-block-exploits-sql-injections-file-injections-spam-user-agents-etc
https://knthost.com/nginx/blocking-bots-with-nginx
https://learn.microsoft.com/pt-br/aspnet/core/host-and-deploy/linux-nginx
https://regex101.com
https://securityheaders.com
https://spinupwp.com/hosting-wordpress-yourself-nginx-security-tweaks-woocommerce-caching-auto-server-updates
https://stackoverflow.com/questions/962230/hide-x-powered-by-nginx
https://tecmint.com/limit-connections-in-nginx
https://webdock.io/en/docs/how-guides/security-guides/how-to-configure-security-headers-in-nginx-and-apache
Mais Informações
Esperamos ter te ajudado e estaremos sempre a disposição para mais informações.
Se você tem interesse em algum assunto específico, tem alguma dúvida, precisa de ajuda, ou quer sugerir um post, entre em contato conosco pelo e-mail equipe@nvlan.com.br.
