Fortinet
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 aggiungiamo un 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
e verifichiamo che l’object sia attivo. Se tutto è andato bene e abbiamo i log abilitati, vedremo una lista simile questa:
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: