Fortigate -- Policies firewall¶
Concepts fondamentaux¶
Un pare-feu stateful comme le Fortigate inspecte chaque paquet en tenant compte de l'etat de la connexion (SYN, SYN-ACK, ESTABLISHED...). Contrairement a un pare-feu stateless qui evalue chaque paquet individuellement, le Fortigate maintient une table de sessions : une fois qu'un flux est autorise par une policy, les paquets de retour sont automatiquement acceptes sans reevaluation.
Ordre d'evaluation des policies¶
Les policies sont evaluees de haut en bas (top to bottom). Le premier match arrete l'evaluation : le trafic est traite par cette policy et les suivantes sont ignorees. C'est pourquoi l'ordre des policies est critique : une policy trop permissive placee en haut peut court-circuiter toutes les restrictions.
Deny implicite¶
Si aucune policy ne correspond au trafic, celui-ci est silencieusement bloque (implicit deny). La policy 38 (DENY-ALL-LOG) rend ce blocage explicite en loguant tout trafic refuse avant le deny implicite.
graph TD
PKT["Paquet entrant"] --> P20{"Policy 20 ?"}
P20 -->|"Match"| ALLOW20["Autorise"]
P20 -->|"No match"| P34{"Policy 34 ?"}
P34 -->|"Match"| ALLOW34["Autorise"]
P34 -->|"No match"| PNEXT["..."]
PNEXT --> P38{"Policy 38<br/>DENY-ALL-LOG"}
P38 -->|"Match all"| DENY["Bloque + Log"]
P38 -->|"Pas atteint"| IMPLICIT["Deny implicite<br/>(silencieux)"]
style DENY fill:#e74c3c,color:#fff
style IMPLICIT fill:#95a5a6,color:#fff
style ALLOW20 fill:#27ae60,color:#fff
style ALLOW34 fill:#27ae60,color:#fff
Etat du Fortigate¶
| Parametre | Valeur |
|---|---|
| Modele | FGT-02 VM64 (FortiOS v7.4.1) |
| Numero de serie | FGVM32Y8GM9AFW9T |
| API REST | https://10.15.100.30 |
| Haute disponibilite | Cluster actif-passif : fgt-01 + fgt-02 |
| Licences FortiGuard | Non enregistre (VM de lab) |
| Logging | Toutes les policies actives loguent le trafic (logtraffic all) |
Licence FortiGuard non enregistree
Le proxy explicite Fortigate fonctionne en HTTP mais pas en HTTPS car la licence FortiGuard n'est pas activee (VM de lab). Sans cette licence, l'inspection SSL/TLS et les mises a jour de signatures IPS/AV ne sont pas disponibles. Le proxy Squid HA remplace la fonction de proxy explicite.
Policy 1 (catch-all) -- DESACTIVEE¶
La policy initiale "ALL" autorisait tout le trafic de n'importe quelle zone vers n'importe
quelle destination (any -> any, action ACCEPT). Cette approche est incompatible avec
un modele de securite en production.
Elle a ete desactivee et remplacee par un ensemble de policies granulaires, chacune limitee a une zone source, un ensemble de destinations FQDN et des services specifiques.
Ne jamais reactiver la Policy 1
La reactivation de la Policy 1 supprimerait toute la segmentation reseau. Toutes les zones (SOC, Services, Admin, etc.) auraient un acces Internet illimite, contournant le proxy Squid et les FQDN groups. En cas de besoin d'acces supplementaire, creer une nouvelle policy dediee avec un FQDN group restreint.
FQDN Address Groups¶
Le Fortigate permet de definir des objets d'adresse de type FQDN (Fully Qualified Domain Name). Au lieu de specifier des adresses IP en dur, on definit un nom de domaine : le Fortigate effectue des resolutions DNS periodiques et maintient une table FQDN -> IP mise a jour dynamiquement. Ainsi, meme si l'IP d'un CDN change, la policy reste valide.
Les FQDN sont regroupes en Address Groups pour simplifier les policies :
GRP-Repos-Publiques¶
Depots de packages et logiciels pour l'infrastructure.
| FQDN | Usage |
|---|---|
dl.rockylinux.org |
Depots Rocky Linux 9 BaseOS / AppStream |
download.fedoraproject.org |
EPEL (Extra Packages for Enterprise Linux) |
download.docker.com |
Docker Community Edition |
artifacts.elastic.co |
Elasticsearch, Kibana, Logstash |
packages.wazuh.com |
Wazuh Manager et agents SIEM |
rpm.releases.hashicorp.com |
Vault, Terraform, Packer |
repo.zabbix.com |
Zabbix server et agents |
packages.gitlab.com |
GitLab Community Edition |
registry.npmjs.org |
Packages npm (Node.js) |
pypi.org, files.pythonhosted.org |
Packages Python (pip) |
GRP-Docker-Registries¶
Registres d'images de conteneurs.
| FQDN | Usage |
|---|---|
registry-1.docker.io |
Docker Hub (images) |
auth.docker.io |
Docker Hub (authentification) |
production.cloudflare.docker.com |
Docker Hub (CDN Cloudflare) |
ghcr.io |
GitHub Container Registry |
quay.io |
Red Hat Quay |
*.github.com |
GitHub (releases, archives) |
*.githubusercontent.com |
GitHub (contenu raw, assets) |
GRP-Threat-Intel¶
Sources de renseignement sur les menaces pour le SOC.
| FQDN | Usage |
|---|---|
*.abuse.ch |
URLhaus, MalwareBazaar, Feodo Tracker |
api.abuseipdb.com |
API AbuseIPDB (reputation IP) |
otx.alienvault.com |
AlienVault OTX (IOC feeds) |
*.virustotal.com |
VirusTotal (analyse fichiers/URL) |
*.circl.lu |
CIRCL (CERT luxembourgeois, MISP) |
api.github.com |
GitHub API (regles Sigma, YARA) |
GRP-Cloud-Identity¶
Services d'identite et cloud pour Entra ID, AWS et Azure.
| FQDN | Usage |
|---|---|
login.microsoftonline.com |
Entra ID -- authentification |
graph.microsoft.com |
Microsoft Graph API |
login.microsoft.com |
Entra ID -- login secondaire |
device.login.microsoftonline.com |
Entra ID -- device code flow |
*.msftauth.net |
Entra ID -- MFA, auth intermediaire |
aadcdn.msftauth.net |
Entra ID -- CDN |
*.amazonaws.com |
AWS (S3, STS, IAM, EC2, SSM) |
*.azure.com |
Azure (management, portal) |
*.windows.net |
Azure (blob, vault, monitor) |
GRP-AWS-S3¶
Endpoints specifiques pour les sauvegardes S3.
| FQDN | Usage |
|---|---|
s3.amazonaws.com |
Amazon S3 (API globale) |
*.s3.amazonaws.com |
Amazon S3 (buckets regionaux) |
sts.amazonaws.com |
AWS STS (assume role pour acces S3) |
GRP-Proxy-Squid¶
Adresses du proxy Squid HA.
| Adresse | Role |
|---|---|
10.15.50.1 |
Squid 1 (MASTER) |
10.15.50.2 |
Squid 2 (BACKUP) |
Flux de trafic via le proxy¶
La majorite du trafic Internet passe par le proxy Squid. Le chemin est le suivant :
sequenceDiagram
participant VM as VM (toute zone)
participant SQ as Squid VIP<br/>10.15.50.3:3128
participant FGT as Fortigate
participant NET as Internet
VM->>SQ: HTTP CONNECT / GET (port 3128)<br/>Policy 46
Note over SQ: Filtrage Layer 7<br/>ACL dstdomain whitelist
SQ->>FGT: Requete HTTPS/HTTP<br/>IP source = Squid
Note over FGT: Filtrage Layer 3/4<br/>Policy 47 (FQDN groups)
FGT->>NET: NAT source → IP publique
NET-->>FGT: Reponse
FGT-->>SQ: Reponse
SQ-->>VM: Reponse
Double filtrage
Le trafic est filtre a deux niveaux : le Squid verifie le domaine demande
(Layer 7, ACL dstdomain) et le Fortigate verifie les FQDN groups
(Layer 3/4, resolution DNS). Les deux doivent autoriser le domaine pour que
la connexion aboutisse.
Policies actives¶
| ID | Nom | Source | Destination | FQDN Group | Services | Action | Notes |
|---|---|---|---|---|---|---|---|
| 20 | Services-to-Internet | Services (106) | port1 | Repos + Docker + Cloud | HTTPS, HTTP | ACCEPT | FQDN restreint |
| 34 | SOC-Updates-Internet | SOC (800) | port1 | Repos + Docker + TI + Cloud | HTTPS, HTTP | ACCEPT | Inclut Threat Intel |
| 35 | Identity-to-Internet | Identite (107) | port1 | Cloud-Identity | HTTPS | ACCEPT | Entra ID uniquement |
| 38 | DENY-ALL-LOG | any | any | -- | ALL | DENY | Cleanup rule, log tout |
| 39 | Admin-to-Internet | Admin (108) | port1 | -- (tout) | ALL | ACCEPT | Acces complet (debug) |
| 40 | Supervision-to-Internet | Supervision (103) | port1 | Repos-Publiques | HTTPS, HTTP | ACCEPT | Repos uniquement |
| 41 | Sauvegarde-to-Internet | Sauvegarde (105) | port1 | AWS-S3 | HTTPS | ACCEPT | S3 uniquement |
| 46 | All-to-Squid-Proxy | Toutes zones | Proxy (50) | Proxy-Squid | TCP/3128 | ACCEPT | Acces au proxy |
| 47 | Squid-to-Internet | Proxy (50) | port1 | Tous GRP FQDN | HTTPS, HTTP | ACCEPT | NAT source |
| 48 | Squid-to-Internal | Proxy (50) | Services, Identite, SOC | -- | HTTPS, HTTP, DNS, NTP | ACCEPT | Retour proxy |
| 49 | Admin-to-Mgmt | Admin (108) | Mgmt | Mgmt address | ALL | ACCEPT | Acces management FGT |
| 50 | SOC-Intra-Zone | SOC (800) | SOC (800) | SOC address | ALL | ACCEPT | Communication intra-SOC |
| 51 | Admin-to-All-Internal | Admin (108) | Toutes zones | -- | HTTPS, HTTP, SSH, ICMP | ACCEPT | Administration |
| 52 | Supervision-ICMP-to-All | Supervision (103) | Toutes zones | -- | ICMP, SNMP | ACCEPT | Monitoring |
Policies desactivees¶
| ID | Nom | Raison de la desactivation |
|---|---|---|
| 1 | ALL (catch-all) | Remplacee par policies granulaires. Ne jamais reactiver. |
| 42 | Storage-to-Internet | Les noeuds Ceph n'ont aucun besoin d'acces Internet |
| 43 | Hyperviseur-to-Internet | Les ESXi n'ont aucun besoin d'acces Internet |
| 44 | Mgmt-to-Internet | Le VLAN management Fortigate n'a pas besoin d'Internet |
Pourquoi desactiver plutot que supprimer ?
Les policies desactivees restent visibles dans la configuration pour la tracabilite. En cas de besoin futur, il est plus simple de creer une nouvelle policy que de reactiver une ancienne policy trop permissive.
Diagramme des zones et policies¶
graph TB
subgraph ZONES["Zones sources"]
SERVICES["Services<br/>VLAN 106"]
SOC["SOC<br/>VLAN 800"]
IDENTITY["Identite<br/>VLAN 107"]
ADMIN["Admin<br/>VLAN 108"]
SUPV["Supervision<br/>VLAN 103"]
SAUV["Sauvegarde<br/>VLAN 105"]
end
subgraph DMZ["DMZ Proxy — VLAN 50"]
SQUID["Squid HA<br/>VIP 10.15.50.3"]
end
subgraph FW["Fortigate (policies FQDN)"]
P47["Policy 47<br/>Squid → Internet<br/>Tous FQDN groups"]
P39["Policy 39<br/>Admin → Internet<br/>Tout autorise"]
end
INTERNET["Internet"]
SERVICES -->|"P46 — port 3128"| SQUID
SOC -->|"P46 — port 3128"| SQUID
IDENTITY -->|"P46 — port 3128"| SQUID
SUPV -->|"P46 — port 3128"| SQUID
SAUV -->|"P46 — port 3128"| SQUID
SQUID -->|"P47 — FQDN"| INTERNET
ADMIN -->|"P39 — tout"| INTERNET
SUPV -->|"P52 — ICMP/SNMP"| ZONES
style INTERNET fill:#3498db,color:#fff
style SQUID fill:#e67e22,color:#fff
Procedure : ajouter un nouveau FQDN ou une nouvelle policy¶
Etape 1 -- Ajouter le FQDN au Fortigate¶
Dans l'interface Fortigate ou via l'API REST :
- Creer un objet Address de type FQDN (ex:
nouveau.domaine.com) - Ajouter cet objet au Address Group correspondant (ex:
GRP-Repos-Publiques)
Etape 2 -- Ajouter le domaine a la whitelist Squid¶
Sur les deux serveurs Squid (ou via Ansible) :
- Editer
/etc/squid/squid.conf - Ajouter le domaine dans l'ACL
dstdomainappropriee - Recharger Squid :
systemctl reload squid
Etape 3 -- Tester¶
Oubli du double filtrage
Si le domaine est ajoute uniquement au Fortigate sans la whitelist Squid, le trafic passant par le proxy sera bloque par Squid (HTTP 403). Si le domaine est ajoute uniquement au Squid sans le FQDN group Fortigate, le trafic direct sera bloque par le firewall. Les deux doivent etre configures.