feat(waf): implementado modsecurity 3.0.14, plugins crs v4 e tunings específicos por app
This commit is contained in:
parent
5ada628ac4
commit
e932ca8f7d
102
README.md
102
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.
|
- `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**).
|
- `conf.d/`: Contém as definições de cada site (**VHosts**).
|
||||||
- `snippets/`: Componentes reutilizáveis (SSL, Proxy, Cache, WAF).
|
- `snippets/`: Componentes reutilizáveis (SSL, Proxy, Cache, WAF, Headers).
|
||||||
- `modsec/`: Configuração do ModSecurity e regras do **OWASP Core Rule Set**.
|
- `modsec/`: Configuração do ModSecurity, regras **OWASP CRS v4** e tunings específicos.
|
||||||
- `dynamic/`: Arquivos modificados em tempo real (ex: `blacklist.conf` pelo Fail2Ban).
|
- `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:
|
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)**.
|
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.
|
2. `include snippets/proxy_params.conf;`: Headers padrão e ofuscação de tecnologia de backend (`Server`, `X-Powered-By`).
|
||||||
3. `include snippets/modsecurity.conf;`: Ativa o WAF e a Blacklist dinâmica.
|
3. `include snippets/security_headers.conf;`: **Headers de 2026** (COOP, COEP, CORP) para proteção de isolamento do navegador.
|
||||||
4. `include snippets/security_actions.conf;`: Toma a decisão final de bloquear (`444`) se o motor PSDE detectar risco alto.
|
4. `include snippets/modsecurity.conf;`: Ativa o WAF e a Blacklist dinâmica.
|
||||||
5. `include snippets/cache_optimizer.conf;`: Otimiza a entrega de estáticos com cache inteligente.
|
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
|
## 🛠️ Workflow Operacional: Ativando um Novo Site
|
||||||
|
|
||||||
Siga este procedimento para colocar um novo sistema no ar com segurança máxima:
|
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]
|
> [!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`.
|
> **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
|
### Recompilar WAF (Se necessário)
|
||||||
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`.
|
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
|
### Validação
|
||||||
Sempre teste a configuração antes do reload:
|
Sempre teste a configuração antes do reload:
|
||||||
|
|
@ -150,6 +104,8 @@ sudo nginx -t
|
||||||
sudo systemctl reload nginx
|
sudo systemctl reload nginx
|
||||||
```
|
```
|
||||||
|
|
||||||
### Logs
|
### Auditoria em Tempo Real
|
||||||
Para auditoria de segurança, use o log JSON:
|
Para visualizar ataques bloqueados e o PSDE Scoring em formato amigável:
|
||||||
`tail -f /var/log/nginx/access_json.log | jq` (necessário instalar o `jq`)
|
`tail -f /var/log/nginx/access_json.log | jq` (necessários logs JSON ativos e `jq` instalado).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
@ -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"
|
||||||
|
|
@ -8,4 +8,4 @@ Include /etc/nginx/modsec/owasp-crs/crs-setup.conf
|
||||||
Include /etc/nginx/modsec/owasp-crs/rules/*.conf
|
Include /etc/nginx/modsec/owasp-crs/rules/*.conf
|
||||||
|
|
||||||
# Include Custom Rules
|
# Include Custom Rules
|
||||||
# include /etc/nginx/modsec/custom_rules.conf
|
Include /etc/nginx/modsec/app_specific_modsec_tuning.conf
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
# NGINX Master Configuration - Pathfinder Proxy
|
# NGINX Master Configuration - Pathfinder Proxy
|
||||||
|
|
||||||
# Load essential modules
|
# 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_filter_module.so;
|
||||||
# load_module modules/ngx_http_brotli_static_module.so;
|
# load_module modules/ngx_http_brotli_static_module.so;
|
||||||
|
|
||||||
|
|
@ -54,8 +54,9 @@ http {
|
||||||
resolver_timeout 5s;
|
resolver_timeout 5s;
|
||||||
|
|
||||||
# Security Snippets
|
# Security Snippets
|
||||||
include /etc/nginx/snippets/security_maps.conf;
|
include snippets/security_headers.conf; # Novos headers de 2026
|
||||||
include /etc/nginx/snippets/rate_limit.conf;
|
include snippets/security_maps.conf;
|
||||||
|
include snippets/rate_limit.conf;
|
||||||
|
|
||||||
# Ativação Global da Blacklist
|
# Ativação Global da Blacklist
|
||||||
include /etc/nginx/dynamic/blacklist.conf;
|
include /etc/nginx/dynamic/blacklist.conf;
|
||||||
|
|
|
||||||
|
|
@ -13,3 +13,7 @@ proxy_buffer_size 8k;
|
||||||
proxy_connect_timeout 60s;
|
proxy_connect_timeout 60s;
|
||||||
proxy_send_timeout 60s;
|
proxy_send_timeout 60s;
|
||||||
proxy_read_timeout 60s;
|
proxy_read_timeout 60s;
|
||||||
|
|
||||||
|
# Security: Hide Backend Technology
|
||||||
|
proxy_hide_header X-Powered-By;
|
||||||
|
proxy_hide_header Server;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
Loading…
Reference in New Issue