Sono sysadmin / DevOps con poca esperienza specifica su hardening server. Posso usare questo tool?
Si\'. Per ogni finding trovi descrizione del problema in linguaggio operativo e remediation pronta da copy-paste nella config. La logica del tool ricalca quella dei tool ufficiali (Mozilla SSL Configurator, OWASP Secure Headers Project): gli stessi check che farebbe un cyber esperto, automatizzati. Per aspetti che il linter non copre (cert in scadenza, validation di certificati intermedi, monitoring runtime) usa SSLLabs e Mozilla Observatory in parallelo.
Cosa significa che il linter è AST-based e perché è meglio di un linter regex?
AST = Abstract Syntax Tree: la config viene parsata in un albero di blocchi e direttive con scope preciso. Il linter sa che add_header X-Frame-Options DENY dentro location /admin NON si applica al resto del sito. Un linter regex vedrebbe la stringa X-Frame-Options ovunque nel testo e direbbe "presente". Quel falso negativo ha conseguenze pratiche: l'header e\' presente formalmente ma non e\' emesso sulle response che dovevano protegerlo. Stesso ragionamento per HSTS, CSP, e per la regola add_header override Nginx.
Posso testare un .htaccess o serve l'intero VirtualHost?
Entrambi funzionano. Un .htaccess e\' una config Apache parziale (ereditata dal vhost padre): il linter accetta direttive bare al top-level. Un VirtualHost completo aggiunge il contesto (porta SSL, certificati). Per audit accurato preferisci il vhost completo perche\' alcuni check (HSTS scoped al vhost SSL, listen 80 redirect) richiedono il blocco. Se incolli solo un .htaccess, il linter non puo\' decidere se sei su HTTPS o HTTP.
Il sample Apache passa con score 100? Lo voglio capire come baseline.
Il sample Apache include due vhost: uno HTTP->HTTPS redirect, uno HTTPS con SSL/TLS modern, HSTS preload, CSP con report-uri, X-Frame, X-Content-Type, Referrer, Permissions, OCSP stapling, HTTP/2 (Protocols h2), AllowOverride None su Directory. Score atteso: 90-100. Eventuale calo: mod_security non visibile (info, -1), nessun ServerTokens dichiarato esplicitamente (info, -1).
Override semantica add_header Nginx: come la fixo davvero?
Tre approcci. (1) Ripeti gli header in ogni location: piu\' boilerplate ma deterministico, lo capisce qualsiasi sysadmin che legga la config. (2) Usa more_set_headers del modulo headers-more-nginx-module: NON soggetto alla regola override, set globale che si applica anche alle location. Richiede build custom o pacchetto ufficiale (Debian: libnginx-mod-http-headers-more-filter). (3) Refactor della struttura location: collassa location simili in un'unica con map o if, riducendo la superficie di override.
CSP con 'unsafe-inline': quando si può accettare?
Idealmente mai in nuovi progetti: nonce-based o hash-based CSP sono la baseline moderna. Nei casi legacy: (a) frontend con migliaia di inline event handler che richiedono refactor lungo, accetta unsafe-inline per il momento ma documentalo nel commit message della config; (b) tool di analytics che inietta inline script (Google Tag Manager pre-2023, alcuni A/B testing tool), unsafe-inline e\' la via piu\' rapida. Mitigation parziale: aggiungi 'self' + nonce per gli script tuoi e accetta unsafe-inline solo come fallback whitelist.
HSTS preload: vale la pena iscriversi alla preload list di Chrome?
Si\' per qualsiasi dominio web-only stabile. La preload list integra il dominio nel codice di Chromium (e dei browser derivati): la prima visita al dominio e\' gia\' forzata HTTPS, eliminando la finestra di first-visit downgrade attack. Trade-off: una volta iscritto, riposi solo HTTPS (no rollback rapido a HTTP). Procedura: max-age=31536000 minimo, includeSubDomains obbligatorio, preload obbligatorio, sottometti su hstspreload.org.
/server-status e /nginx_status: vanno disabilitati o solo restricted?
Restricted, non disabilitati: sono utili per monitoring (Nagios, Zabbix, custom dashboard). Restrizione tipica: Apache <Location /server-status> Require local </Location> o Require ip 10.0.0.0/8. Nginx location /nginx_status { stub_status on; allow 127.0.0.1; allow 10.0.0.0/8; deny all; }. Esposti pubblicamente perdono header internal, traffic per-vhost, request rate: information leakage utile per fingerprinting e per riconoscere ondate di attacco.
TLSv1 e TLSv1.1: vanno completamente disabilitati o e\' OK negoziarli per compatibilita\'?
Completamente disabilitati per qualsiasi nuovo progetto. PCI DSS 4.0 richiede TLSv1.2 minimo da metà 2024. Browser support: TLSv1.2 e\' supportato da IE 11 in poi (Win 7+), Android 5+, iOS 5+. La compatibilita\' rimasta richiesta da TLSv1/TLSv1.1 sono client legacy esoterici (printer enterprise vintage, scada systems): se ce li hai, isolali su un endpoint separato e dichiara TLSv1.2+ ovunque.
Forward secrecy: quanto è critico in pratica?
Critico per dati a lunga vita conservativa. Senza forward secrecy, una compromissione futura della chiave privata (server breach, key theft, court order) permette di decifrare TUTTE le sessioni TLS passate intercettate (registrate da un avversario passivo come ISP o nation-state actor). Con forward secrecy, le sessioni passate restano cifrate. Cipher con ECDHE/DHE la garantiscono, RSA static no. Best practice: il SSLCipherSuite Mozilla Intermediate la garantisce, migra verso quello.
HTTP/2 vs HTTP/3: serve abilitare entrambi?
HTTP/2 e\' baseline moderna (deploy mature dal 2018, supporto browser ~99%). HTTP/3 (over QUIC) e\' next-gen ma deploy non triviale: richiede UDP open lato firewall, Apache lo supporta solo con mod_http2 sperimentale, Nginx richiede --with-http_v3_module (1.25+). Roadmap pragmatica: HTTP/2 sempre, HTTP/3 quando hai un caso d'uso reale (mobile-heavy, dispositivi con connessioni lossy).
mod_security: vale la pena attivarlo?
Si\', per qualsiasi sito esposto pubblicamente. Cost: ~5-10% overhead CPU con CRS standard. Beneficio: blocco automatico di SQLi, XSS, RCE, scanner ricognoscibili (nikto, sqlmap, dirb), enumeration, attack pattern in chiaro. Caveat: configurazione iniziale richiede tuning per ridurre falsi positivi sull'app specifica. Alternativa moderna: WAF cloud (Cloudflare, AWS WAF, Sucuri). Costa ma elimina il tuning.
Posso fare audit di config che usano Include / include verso file esterni?
Il tool linta solo il testo che gli incolli. Include Apache e include Nginx puntano a file esterni: il browser non puo\' risolverli. Workaround: concatena manualmente i file che ti interessano e incolla il blob risultante, oppure linta i file uno per uno. Per audit completo serve accesso al filesystem del server, fuori scope per un tool browser-only.
Posso fare audit del file /etc/nginx/nginx.conf principale?
Si\', il parser supporta correttamente events { }, http { }, server { } annidati, upstream, direttive top-level. Findings tipici di nginx.conf principale: server_tokens off a livello http, limit_req_zone globali, ssl session cache. Findings per-server appariranno per ogni server { } incluso (anche via include risolti manualmente).
Privacy: la config che incollo viene salvata o tracciata?
No. Il tool gira interamente nel browser. Nessuna richiesta di rete con la config: parser, regole context-aware, value validators, rendering, generazione del report - tutto in JavaScript locale. Verificabile aprendo il pannello Network di DevTools durante il lint: zero richieste outgoing con i dati della config. La config non viene salvata in localStorage né tracciata in analytics.
Posso integrare il linter in pipeline CI/CD?
Per CI/CD usa tool dedicati: nginx-config-formatter + configtest di Nginx, apachectl configtest di Apache, gixy (Yandex, Python) per security audit Nginx, apache-config-lint Ruby. Il nostro tool e\' browser-based: ottimo per review interattive, sub-ottimale per pipeline. Caso d'uso valido: code review di un PR di config, lo sviluppatore incolla il diff e fa il triage prima di push.