Marvin Pascale

[B.Log]

11 Dicembre 2022

Fortinet

Fortinet bug E’ notizia di poche settimane fa: una falla in FortiOS, FortiProxy e FortiSwitchManager (CVE-2022-40684) è ancora sfruttabile e permette ad un utente malintenzionato un accesso shell privilegiato.

Il 2022 non è stato un grande anno per Fortinet che è stata costretta a rincorrere gli eventi.

Esprimendo la mia più profonda solidarietà per tutti quei colleghi che hanno scelto questi prodotti, vi propongo una veloce guida per integrare Crowdsec e farsi dare una mano dalla community. Al momento non esiste un bouncer nativo per Fortigate ma in pochi semplici passi è possibile esporre la blocklist in formato txt. L’obiettivo è quindi quello di servire tramite un web server (nel mio caso nginx) la lista di ip della blocklist.

La prima parte della guida è generica ed è valida per qualsiasi software possa contattare un endpoint http per scaricare una lista di ip.

Vi proporrò due modalità

Modalità 1

Come prima cosa generiamo una nuova api key con la cli di Crowdsec

# cscli bouncers add txt-list
Api key for 'txt':

   e32162cf5db5731b3ce69f1d3d968094

Please keep this key since you will not be able to retrieve it!

con la chiave api possiamo esportare la lista ed esporla con nginx

nb: per manipolare il json utilizzeremo jq; per cui, se non è installato, procedi con l’installazione.

# curl -s -H "X-Api-Key:e32162cf5db5731b3ce69f1d3d968094" http://127.0.0.1:8080/v1/decisions/stream?startup=true  | jq '.new[].value' | sed 's/"//g' > /usr/share/nginx/html/list.txt

verificato che il comando funzioni, possiamo creare un nuovo job in crontab

 * * * * curl -s -H "X-Api-Key: e32162cf5db5731b3ce69f1d3d968094" http://127.0.0.1:8080/v1/decisions/stream?startup=true  | jq '.new[].value' | sed 's/"//g' > /usr/share/nginx/html/list.txt

nel mio esempio viene eseguito ogni minuto.

Se volessimo avere un fqdn per nginx, possiamo configurarlo come di seguito

server {
	server_name cslist.marvinpascale.it;
  listen 80;

  location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
  }
	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
    	root   /usr/share/nginx/html;
	}
}

Modalità 2

Esiste un bouncer che espone direttamente la blocklist nel formato corretto, ma in questo caso dovremmo esporre Crowdsec oppure utilizzare Nginx come reverse proxy.

Installiamo il bouncer

# dnf install crowdsec-blocklist-mirror # su RHEL
# apt install  crowdsec-blocklist-mirror # su Debian

Di solito Crowdsec è bravo: genera da solo la nuova chiave api e confguira il bouncer, ma nel caso in cui questo non accada è necessario generarla a mano e configurare il servizio.

# cscli bouncers add blocklist-mirror
Api key for 'txt':

   e32162cf5db5731b3ce69f1d3d968094

Please keep this key since you will not be able to retrieve it!

configuriamo il servizio editando il file /etc/crowdsec/bouncers/crowdsec-blocklist-mirror.yaml

config_version: v1.0
crowdsec_config:
  lapi_key: e32162cf5db5731b3ce69f1d3d968094 # insderire la chiave api
  lapi_url: http://127.0.0.1:8080/
  update_frequency: 10s
...
blocklists:
  - format: plain_text # Supported formats are either of "plain_text"
    endpoint: /security/blocklist
    authentication:
      type: none # Supported types are either of "none", "ip_based", "basic"
      user:
      password:
      trusted_ips: # IP ranges, or IPs which don't require auth to access this blocklist
        - 127.0.0.1
        - ::1

listen_uri: 127.0.0.1:41412
tls:
  cert_file:
  key_file:
...

una volta configurata la chiave api riavviamo il servizio e abilitiamolo al boot

# systemctl restart crowdsec-blocklist-mirror.service
# systemctl enable crowdsec-blocklist-mirror.service

per fare un test basterà

# curl http://127.0.0.1:41412/security/blocklist | more
1.1.138.229
1.11.62.185
1.116.15.240
1.116.227.30
1.116.46.30
1.117.30.93
1.117.73.199
1.117.80.149
1.12.229.48
...

se volessimo esporre questo endpoint con nginx basterà creare un vhost o modificare il default ma prima dobbiamo editare la listen uri nel file /etc/crowdsec/bouncers/crowdsec-blocklist-mirror.yaml

...
listen_uri: 0.0.0.0:41412
...

su Nginx prestiamo attenzione alla location

...
location /security/blocklist {
  proxy_pass http://[IP_LOCALE]:41412/security/blocklist;
}
...

Configuriamo il Fortigate

Spostandoci sul Fortigate andiamo nella sezione Security Fabric Security Fabric aggiungiamo un IP Address IP Address come nome mettiamo “Crowdsec”, come url http://cslist.marvinpascale.it/list.txt e refresh 5 min;

NB: se invece abbiamo utilizzato la seconda modalità dobbiamo inserire come url l’fqdn scelto, ad esempio: http://cslist.marvinpascale.it/security/blocklist

List e verifichiamo che l’object sia attivo. Crowdsec Se tutto è andato bene e abbiamo i log abilitati, vedremo una lista simile questa: Firewall block log

Questa modalità è molto semplice ed è applicabile con tanti altri prodotti. Credo sia stato più complesso scrivere il post che metterlo in pratica.


Le opinioni in quanto tali sono opinabili e nulla ti vieta di approfondire l’argomento.

Risorse: