From e932ca8f7d1991624db28ecdf673f529e2817470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Toledo?= Date: Fri, 6 Feb 2026 22:18:42 -0300 Subject: [PATCH] =?UTF-8?q?feat(waf):=20implementado=20modsecurity=203.0.1?= =?UTF-8?q?4,=20plugins=20crs=20v4=20e=20tunings=20espec=C3=ADficos=20por?= =?UTF-8?q?=20app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 102 ++++++------------- nginx/modsec/app_specific_modsec_tuning.conf | 63 ++++++++++++ nginx/modsec/main.conf | 2 +- nginx/nginx.conf | 7 +- nginx/snippets/proxy_params.conf | 4 + nginx/snippets/security_headers.conf | 30 ++++++ 6 files changed, 131 insertions(+), 77 deletions(-) create mode 100644 nginx/modsec/app_specific_modsec_tuning.conf create mode 100644 nginx/snippets/security_headers.conf diff --git a/README.md b/README.md index 0f8f640..73a3279 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,10 @@ A configuração é modular para permitir manutenção rápida e alta disponibil - `nginx.conf`: O "cérebro" global. Configura workers, logs JSON e carrega os módulos dinâmicos. - `conf.d/`: Contém as definições de cada site (**VHosts**). -- `snippets/`: Componentes reutilizáveis (SSL, Proxy, Cache, WAF). -- `modsec/`: Configuração do ModSecurity e regras do **OWASP Core Rule Set**. +- `snippets/`: Componentes reutilizáveis (SSL, Proxy, Cache, WAF, Headers). +- `modsec/`: Configuração do ModSecurity, regras **OWASP CRS v4** e tunings específicos. - `dynamic/`: Arquivos modificados em tempo real (ex: `blacklist.conf` pelo Fail2Ban). +- `scripts/`: Scripts de utilidade (Ex: `install_modsecurity.sh`). --- @@ -21,10 +22,23 @@ A configuração é modular para permitir manutenção rápida e alta disponibil Para garantir o **Padrão Ouro**, todo site deve incluir os snippets básicos: 1. `include snippets/ssl_params.conf;`: Ativa TLS 1.3, HSTS e anuncia **HTTP/3 (QUIC)**. -2. `include snippets/proxy_params.conf;`: Headers padrão para o backend não perder o IP real do cliente. -3. `include snippets/modsecurity.conf;`: Ativa o WAF e a Blacklist dinâmica. -4. `include snippets/security_actions.conf;`: Toma a decisão final de bloquear (`444`) se o motor PSDE detectar risco alto. -5. `include snippets/cache_optimizer.conf;`: Otimiza a entrega de estáticos com cache inteligente. +2. `include snippets/proxy_params.conf;`: Headers padrão e ofuscação de tecnologia de backend (`Server`, `X-Powered-By`). +3. `include snippets/security_headers.conf;`: **Headers de 2026** (COOP, COEP, CORP) para proteção de isolamento do navegador. +4. `include snippets/modsecurity.conf;`: Ativa o WAF e a Blacklist dinâmica. +5. `include snippets/security_actions.conf;`: Toma a decisão final de bloquear (`444`) se o motor PSDE detectar risco alto. +6. `include snippets/cache_optimizer.conf;`: Otimiza a entrega de estáticos com cache inteligente (SWR). + +--- + +## 🛡️ Camada de WAF (ModSecurity 3.0.14) + +O Pathfinder Proxy utiliza o **ModSecurity v3** compilado sob medida para o Nginx Mainline. + +- **Versão Nginx**: 1.29.5 Mainline (Oficial). +- **Versão ModSec**: 3.0.14. +- **Regras**: OWASP Core Rule Set (CRS) v4. +- **Plugins**: Utiliza plugins oficiais do CRS para **Nextcloud** e **WordPress**, garantindo zero falsos positivos nessas plataformas. +- **Tuning**: Arquivo `modsec/app_specific_modsec_tuning.conf` centraliza exceções para UniFi, vCenter, Exchange, Zabbix e Veeam. --- @@ -38,61 +52,6 @@ Diferente de firewalls comuns, o Pathfinder usa o `security_maps.conf` para calc --- -## 🏆 Padrões Ouro de Configuração - -### 1. Servidor de Arquivos (Performance & Caching) -Focado em minimizar uso de CPU e maximizar I/O. -```nginx -location /files/ { - sendfile on; - tcp_nopush on; - aio on; - directio 512; - include snippets/cache_optimizer.conf; - proxy_cache_valid 200 30d; # Cache longo - add_header Content-Disposition "attachment"; # Força download -} -``` - -### 2. Streaming de Vídeo (Continuidade & Buffer) -Evita travamentos e economiza banda com suporte a *Range Requests*. -```nginx -location /stream/ { - proxy_pass http://backend; - proxy_set_header Range $http_range; - proxy_set_header If-Range $http_if_range; - proxy_cache_key "$host$request_uri$http_range"; - - # Tuning de Buffer para vídeo - proxy_buffers 32 16k; - proxy_buffer_size 64k; - proxy_read_timeout 300s; -} -``` - -### 3. API Pesada / Traccar (Real-time & WebSocket) -Focado em manter conexões persistentes e rate limiting agressivo. -```nginx -location /api/ { - proxy_pass http://backend; - - # Suporte a WebSocket (Vital para Traccar/Mobile) - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - # Rate Limit Estreito para APIs - limit_req zone=global_limit burst=20 nodelay; - - # Timeouts curtos para liberar recursos - proxy_connect_timeout 5s; - proxy_send_timeout 30s; - proxy_read_timeout 30s; -} -``` - ---- - ## 🛠️ Workflow Operacional: Ativando um Novo Site Siga este procedimento para colocar um novo sistema no ar com segurança máxima: @@ -130,18 +89,13 @@ Rode os comandos abaixo (substitua o domínio): > [!TIP] > **Atenção aos Caminhos:** Se o Certbot gerar uma pasta com final `-0001`, certifique-se de que o arquivo `.conf` do seu site em `/etc/nginx/conf.d/` aponta para o caminho exato gerado por ele. Você pode conferir os caminhos ativos com `sudo certbot certificates`. -### Automação de Renovação (Configuração Única) -Para que o Nginx atualize os certificados automaticamente, o sistema usa um **Post-Hook**. Toda vez que o Certbot renovar um certificado, o Nginx fará um reload. - -**Verificar se o hook está ativo:** -`cat /etc/letsencrypt/cli.ini` (Deve conter `post-hook = systemctl reload nginx`) - --- -## 🚀 Como Operar +## 🚀 Manutenção e Logs -### Sincronização -As alterações feitas aqui devem ser enviadas para a branch `producao`. No servidor, a sincronização é feita via `git pull` na pasta `/etc/nginx`. +### Recompilar WAF (Se necessário) +Se o Nginx for atualizado para uma versão superior à 1.29.5, o módulo ModSecurity precisará ser recompilado usando o script: +`sudo ./scripts/install_modsecurity.sh` ### Validação Sempre teste a configuração antes do reload: @@ -150,6 +104,8 @@ sudo nginx -t sudo systemctl reload nginx ``` -### Logs -Para auditoria de segurança, use o log JSON: -`tail -f /var/log/nginx/access_json.log | jq` (necessário instalar o `jq`) +### Auditoria em Tempo Real +Para visualizar ataques bloqueados e o PSDE Scoring em formato amigável: +`tail -f /var/log/nginx/access_json.log | jq` (necessários logs JSON ativos e `jq` instalado). + +--- \ No newline at end of file diff --git a/nginx/modsec/app_specific_modsec_tuning.conf b/nginx/modsec/app_specific_modsec_tuning.conf new file mode 100644 index 0000000..4410948 --- /dev/null +++ b/nginx/modsec/app_specific_modsec_tuning.conf @@ -0,0 +1,63 @@ +# ========================================================================== +# Pathfinder Proxy - Application Specific ModSecurity Tuning +# ========================================================================== +# Este arquivo centraliza as exceções e ajustes para garantir o funcionamento +# de aplicações críticas sem comprometer a segurança global. +# IDs de regras customizadas: 10000 - 10999 +# ========================================================================== + +# -------------------------------------------------------------------------- +# 1. NEXTCLOUD (Configurações Adicionais ao Plugin) +# -------------------------------------------------------------------------- +# Aumenta limites de body para suportar uploads grandes via WebDAV +SecRequestBodyLimit 10737418240 +SecRequestBodyNoFilesLimit 1048576 + +# -------------------------------------------------------------------------- +# 2. ZABBIX & APIs JSON-RPC +# -------------------------------------------------------------------------- +# Desativa inspeção pesada para rotas de API que usam muito JSON/RPC +SecRule REQUEST_URI "@rx (api_jsonrpc\.php|jsrpc\.php|zabbix\.php)" \ + "id:10001,phase:1,nolog,pass,ctl:ruleEngine=Off,msg:'TUNING: Zabbix API Bypass'" + +# -------------------------------------------------------------------------- +# 3. GITEA (Git Service) +# -------------------------------------------------------------------------- +# Permite operações de Git (upload, edit, wiki) que contém código/scripts +SecRule REQUEST_URI "@rx ^/.*/(src/branch|_edit|_new|commits/branch|upload-file|wiki)/" \ + "id:10002,phase:1,nolog,pass,ctl:ruleEngine=Off,msg:'TUNING: Gitea Operations Bypass'" + +# -------------------------------------------------------------------------- +# 4. MICROSOFT EXCHANGE (OWA / ECP) +# -------------------------------------------------------------------------- +# Proteção de motor para caminhos de interface do Exchange +SecRule REQUEST_URI "@rx ^/(owa|ecp)/" \ + "id:10003,phase:1,nolog,pass,ctl:ruleEngine=Off,msg:'TUNING: Exchange Web UI Bypass'" + +# -------------------------------------------------------------------------- +# 5. UNIFI CONTROLLER +# -------------------------------------------------------------------------- +# Permite comunicação da API do UniFi que usa métodos e corpos específicos +SecRule REQUEST_URI "@beginsWith /api/" \ + "id:10004,phase:1,nolog,pass,ctl:ruleEngine=Off,msg:'TUNING: UniFi API Bypass'" + +# -------------------------------------------------------------------------- +# 6. VMWARE vCENTER +# -------------------------------------------------------------------------- +# Exclui motor para interface de gerenciamento vSphere UI +SecRule REQUEST_URI "@beginsWith /ui/" \ + "id:10005,phase:1,nolog,pass,ctl:ruleEngine=Off,msg:'TUNING: vCenter UI Bypass'" + +# -------------------------------------------------------------------------- +# 7. VEEAM BACKUP & REPLICATION +# -------------------------------------------------------------------------- +# Garante que o console web do Veeam não seja bloqueado por falso positivo +SecRule REQUEST_URI "@rx ^/(veeam|VeeamBackup)/" \ + "id:10006,phase:1,nolog,pass,ctl:ruleEngine=Off,msg:'TUNING: Veeam Console Bypass'" + +# -------------------------------------------------------------------------- +# 8. WORDPRESS (Tuning Adicional) +# -------------------------------------------------------------------------- +# O plugin oficial cuida do básico, aqui adicionamos regras se necessário. +# Exemplo: Permitir XML-RPC se necessário (com cautela) +# SecRule REQUEST_URI "@streq /xmlrpc.php" "id:10007,phase:1,nolog,pass,ctl:ruleEngine=Off" diff --git a/nginx/modsec/main.conf b/nginx/modsec/main.conf index 5bd12d1..52bdae2 100644 --- a/nginx/modsec/main.conf +++ b/nginx/modsec/main.conf @@ -8,4 +8,4 @@ Include /etc/nginx/modsec/owasp-crs/crs-setup.conf Include /etc/nginx/modsec/owasp-crs/rules/*.conf # Include Custom Rules -# include /etc/nginx/modsec/custom_rules.conf +Include /etc/nginx/modsec/app_specific_modsec_tuning.conf diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 617ee23..b406dfd 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -1,7 +1,7 @@ # NGINX Master Configuration - Pathfinder Proxy # Load essential modules -# load_module modules/ngx_http_modsecurity_module.so; # Se compilado dinamicamente +load_module modules/ngx_http_modsecurity_module.so; # load_module modules/ngx_http_brotli_filter_module.so; # load_module modules/ngx_http_brotli_static_module.so; @@ -54,8 +54,9 @@ http { resolver_timeout 5s; # Security Snippets - include /etc/nginx/snippets/security_maps.conf; - include /etc/nginx/snippets/rate_limit.conf; + include snippets/security_headers.conf; # Novos headers de 2026 + include snippets/security_maps.conf; + include snippets/rate_limit.conf; # Ativação Global da Blacklist include /etc/nginx/dynamic/blacklist.conf; diff --git a/nginx/snippets/proxy_params.conf b/nginx/snippets/proxy_params.conf index 44ac451..cefdf61 100644 --- a/nginx/snippets/proxy_params.conf +++ b/nginx/snippets/proxy_params.conf @@ -13,3 +13,7 @@ proxy_buffer_size 8k; proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; + +# Security: Hide Backend Technology +proxy_hide_header X-Powered-By; +proxy_hide_header Server; diff --git a/nginx/snippets/security_headers.conf b/nginx/snippets/security_headers.conf new file mode 100644 index 0000000..79e9768 --- /dev/null +++ b/nginx/snippets/security_headers.conf @@ -0,0 +1,30 @@ +# --- Pathfinder Next-Gen Security Headers (2026) --- +# Função: Instruções diretas para o navegador sobre isolamento e privacidade. + +# 1. Privacidade e Controle de Referrer +# Evita que URLs internas vazem para domínios externos em cliques. +add_header Referrer-Policy "strict-origin-when-cross-origin" always; + +# 2. Proteção contra Farejamento de MIME (Anti-Sniffing) +# Força o navegador a respeitar o Content-Type enviado pelo servidor. +add_header X-Content-Type-Options "nosniff" always; + +# 3. Proteção contra Clickjacking (Fallback/Legacy Support) +# O CSP 'frame-ancestors' é a proteção moderna, mas o X-Frame ainda é necessário. +add_header X-Frame-Options "SAMEORIGIN" always; + +# 4. Cross-Origin Isolation (Proteção contra Spectre/Meltdown em JS) +# COOP: Isola o contexto de navegação em um processo separado. +add_header Cross-Origin-Opener-Policy "same-origin" always; +# COEP: Bloqueia recursos que não tenham CORP definido de forma segura. +add_header Cross-Origin-Embedder-Policy "require-corp" always; +# CORP: Define quem pode carregar os recursos deste site. +add_header Cross-Origin-Resource-Policy "same-origin" always; + +# 5. Permissions-Policy (Privacidade de Hardware) +# Restringe o acesso a recursos do dispositivo que não são usados. +add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), usb=(), payment=()" always; + +# 6. Ofuscação de Servidor (Opcional - Requer módulo 'headers-more') +# Remove o nome 'nginx' totalmente do header Server. +# more_clear_headers Server;