Usare grep -f su FortiGate per cercare più oggetti contemporaneamente

Durante un’attività su FortiGate mi sono trovato a dover recuperare la configurazione di diversi oggetti presenti all’interno di alcuni Address Group.

Il problema era abbastanza semplice: avevo molti oggetti da cercare e lanciare un grep -f separato per ciascuno sarebbe stato inutilmente scomodo.

È possibile invece sfruttare le espressioni regolari supportate da grep nella CLI FortiGate per cercare più oggetti contemporaneamente:

1
show | grep -f "OBJ1\|OBJ2\|OBJ3"

In questo modo possiamo cercare in una sola volta tutti gli oggetti indicati e, grazie all’opzione -f, ottenere il relativo contesto di configurazione.

Il comportamento di grep sulla CLI FortiGate

FortiOS permette di utilizzare grep per filtrare l’output di diversi comandi CLI, ad esempio:

1
show | grep OGGETTO

Una ricerca di questo tipo restituisce però principalmente le righe che corrispondono al pattern cercato.

Quando stiamo analizzando una configurazione spesso questo non basta: conoscere la singola riga in cui compare un oggetto è meno utile rispetto a vedere il blocco di configurazione nel quale viene utilizzato.

Per questo può essere utilizzata l’opzione:

1
-f

Ad esempio:

1
show | grep -f OBJ1

grep -f permette di visualizzare il contesto di configurazione relativo alla corrispondenza trovata.

È particolarmente utile per capire rapidamente dove viene referenziato un oggetto senza dover scorrere manualmente l’intera configurazione.

Cercare più oggetti contemporaneamente

La parte interessante è che il pattern passato a grep può essere una regular expression.

Possiamo quindi utilizzare l’operatore OR per indicare più stringhe:

1
show | grep -f "OBJ1\|OBJ2\|OBJ3"

Il pattern:

1
OBJ1\|OBJ2\|OBJ3

può essere letto come:

1
OBJ1 OR OBJ2 OR OBJ3

Il comando cercherà quindi una corrispondenza con uno qualsiasi degli oggetti specificati.

Questo diventa molto comodo quando la lista comincia ad essere lunga:

1
show | grep -f "SERVER01\|SERVER02\|SERVER03\|SERVER04\|SERVER05"

invece di eseguire:

1
2
3
4
5
show | grep -f SERVER01
show | grep -f SERVER02
show | grep -f SERVER03
show | grep -f SERVER04
show | grep -f SERVER05

Il caso pratico degli Address Group

Nel mio caso il comando è risultato utile durante un’attività nella quale dovevo riportare diversi Address Group e i relativi Address Object.

Un Address Group può contenere molti oggetti e, una volta recuperata la lista dei membri, è possibile costruire rapidamente una ricerca unica.

Supponiamo ad esempio di avere come membri:

1
2
3
4
SERVER01
SERVER02
SERVER03
SERVER04

Possiamo cercarli tutti contemporaneamente con:

1
show | grep -f "SERVER01\|SERVER02\|SERVER03\|SERVER04"

Questo permette di trovare i blocchi di configurazione nei quali compare almeno uno degli oggetti.

È utile anche per capire dove gli oggetti vengono referenziati, perché la ricerca viene effettuata sull’output completo di show.

Limitare la ricerca agli Address Object

Se invece l’obiettivo è esclusivamente recuperare la definizione degli Address Object, è preferibile restringere il comando alla sezione interessata.

Ad esempio:

1
show firewall address | grep -f "SERVER01\|SERVER02\|SERVER03\|SERVER04"

Rispetto a:

1
show | grep -f "SERVER01\|SERVER02\|SERVER03\|SERVER04"

la differenza è importante.

Il primo comando cerca solamente all’interno di:

1
config firewall address

ed è quindi più adatto quando dobbiamo recuperare la configurazione degli oggetti stessi.

Il secondo cerca invece nell’intera configurazione visibile tramite show ed è utile quando vogliamo individuare anche altri punti nei quali gli oggetti vengono utilizzati, ad esempio gruppi o firewall policy.

La scelta dipende quindi da ciò che stiamo cercando.

Recuperare gli oggetti

1
show firewall address | grep -f "SERVER01\|SERVER02\|SERVER03"

Cercare tutti i riferimenti

1
show | grep -f "SERVER01\|SERVER02\|SERVER03"

Questa distinzione è particolarmente utile durante migrazioni o attività di pulizia della configurazione.

Attenzione alla sintassi

Il comando deve essere scritto in questo modo:

1
show | grep -f "OBJ1\|OBJ2\|OBJ3"

Se il comando viene copiato da chat, documentazione Markdown o altri sistemi di formattazione è possibile ritrovarsi accidentalmente qualcosa del genere:

1
OBJ1**\|**OBJ2**\|**OBJ3

Gli ** non fanno parte della sintassi di FortiGate: sono normalmente marcatori utilizzati da Markdown per il testo in grassetto.

La stringa da passare realmente a grep rimane:

1
OBJ1\|OBJ2\|OBJ3

Quando può essere utile

Oltre al caso degli Address Group, lo stesso approccio può tornare comodo quando bisogna:

  • individuare più Address Object;
  • verificare contemporaneamente diversi riferimenti;
  • analizzare una configurazione prima di una migrazione;
  • recuperare rapidamente configurazioni da riportare su un altro FortiGate;
  • verificare dove vengono utilizzati più oggetti;
  • ridurre il numero di ricerche manuali sulla configurazione.

Per pochi oggetti la differenza è minima, ma quando bisogna lavorare con gruppi composti da decine di elementi poter costruire una singola espressione rende l’attività decisamente più rapida.

Riferimenti

Fortinet documenta l’utilizzo di grep nella CLI FortiGate nella sezione CLI basics della FortiOS Administration Guide:

Fortinet Documentation - CLI basics

È disponibile inoltre un Technical Tip Fortinet dedicato all’utilizzo del filtro grep nella CLI:

Fortinet Community - Technical Tip: The usage of grep filter command on the FortiGate CLI

Il punto interessante da ricordare è soprattutto la combinazione tra grep -f e una regular expression con più alternative:

1
show | grep -f "OBJ1\|OBJ2\|OBJ3"

Per attività di migrazione o analisi di configurazioni FortiGate è uno di quei piccoli comandi che evita parecchio lavoro ripetitivo.