La domanda che ti arriva in produzione non è mai «come si configura l’antivirus», è «questo file è arrivato sul PC, perché il FortiGate non l’ha fermato». Rispondere richiede due mestieri distinti: leggere la riga di log e sapere qual è la lista dei sospetti abituali. Il primo passo è sempre lo stesso — verificare che un evento esista — perché metà delle volte il file è stato bloccato e nessuno se n’è accorto.
Dove si guardano gli eventi
In GUI si va in Log & Report > Security Events, si sceglie la card AntiVirus e si apre il dettaglio della riga. La scheda Summary funziona solo con disk logging e historical FortiView attivi: se sono spenti la card resta vuota, e non significa che l’antivirus non abbia mai loggato. Da CLI la categoria antivirus è la 2:
execute log filter category 2
execute log display
Per una fotografia rapida, senza scorrere i log, ci sono i contatori del motore e la vista aggregata:
diagnose ips av stats show
diagnose fortiview result security-log action=blocked
diagnose ips av stats clear
diagnose ips av stats show conta virus rilevati e bloccati per protocollo (HTTP, SMTP, POP3, IMAP, NNTP, FTP, SMB) ed è il modo più veloce per capire se il traffico è arrivato al motore. Gli stessi contatori si leggono via SNMP sotto l’OID 1.3.6.1.4.1.12356.101.8.2.1.1, dove fgAvVirusDetected e fgAvVirusBlocked sono due numeri diversi: la distanza fra i due è esattamente la misura di quanto stai monitorando invece di bloccare.
Leggere la riga di log
Una riga antivirus è type="utm" subtype="virus", e i campi che rispondono alle domande vere sono pochi.
eventtype dice chi ha deciso: infected è il motore antivirus, outbreak-prevention è il servizio di outbreak prevention che ha riconosciuto l’hash. Lo conferma dtype, che vale av-engine oppure outbreak-prevention, e viruscat, che passa da Virus a File Hash quando la decisione arriva da un hash: in quel caso il campo virus contiene l’hash stesso e filehashsrc indica la sorgente, per esempio fortiguard.
action distingue blocked da passthrough: se leggi passthrough il profilo è in Monitor, non c’è nulla di rotto. Il nome della firma è indicativo — W32/AI.Pallas.Suspicious significa che a decidere è stato il rilevamento AI del motore, non una firma tradizionale. quarskip spiega perché il file non è finito in quarantena, e Quarantine-disabled è il valore che si vede più spesso. Poi ci sono profile e policyid, che chiudono il cerchio dicendoti quale profilo e quale regola hanno agito: quando il sospetto è che il traffico stia colpendo una policy diversa da quella che immagini, si parte da qui.
Perché un file passa: i sospetti abituali
In ordine di frequenza reale, non di gravità.
- Il file non è mai stato visto. Se il traffico è HTTPS e la policy fa solo certificate inspection, l’antivirus non ha nulla da scansionare: serve la full SSL inspection. È anche il motivo per cui il test con EICAR fallisce così spesso — il profilo
custom-deep-inspectionesenta di default l’FQDNfortinet, quindi i file di prova ospitati sui siti Fortinet non vengono ispezionati finché non togli l’esenzione. - Il protocollo non è coperto. MAPI e SSH si ispezionano solo in proxy. E il port mapping del profilo di protocol options vale solo per l’ispezione proxy: un servizio su porta non standard sfugge alla policy proxy.
- Il file è oversize. Sopra la soglia (10 MB di default) il file non viene processato dal profilo antivirus. Attiva Log oversized files e guarda con che frequenza succede prima di dare la colpa alle firme.
- Il FortiGate è in conserve mode. È il caso più insidioso, perché la configurazione non è cambiata. Con il default
set av-failopen passil proxy antivirus viene scavalcato e con lui tutti i security profile che ne dipendono;offfa l’opposto e blocca il traffico di quelle policy. Sul lato flow decideconfig ips globalconset fail-open: disabilitato (default) il motore IPS scarta le nuove sessioni da ispezionare, abilitato le lascia passare senza scansione. - Le firme sono vecchie. Le definizioni si scaricano solo se esiste almeno una policy con l’antivirus abilitato, e i contratti scadono. Verifica versioni e scadenze con
diagnose autoupdate versionse lo stato dei servizi FortiGuard condiagnose debug rating. - La sandbox ha risposto tardi. Con la scansione inline il file resta trattenuto, ma il timeout predefinito è di 50 secondi e l’azione di default è log-only: al primo tentativo il file arriva a destinazione e nel log trovi un timeout, non un’infezione.
Quando serve scavare
Se il log non basta, il debug in tempo reale del demone di scansione mostra la decisione file per file:
diagnose sys scanunit debug all
diagnose sys scanunit debug level verbose
L’output nomina il job, il file, i database abilitati, l’hash calcolato, lo stato di ritorno della scansione e — riga preziosa — il motivo per cui un file non è stato messo in quarantena o non è stato sottomesso per analisi. È il livello di dettaglio a cui si arriva quando il log dice che il file è passato ma non dice perché.