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 :

  1. Creer un objet Address de type FQDN (ex: nouveau.domaine.com)
  2. 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) :

  1. Editer /etc/squid/squid.conf
  2. Ajouter le domaine dans l'ACL dstdomain appropriee
  3. Recharger Squid : systemctl reload squid

Etape 3 -- Tester

# Depuis une VM de la zone concernee
curl -x http://10.15.50.3:3128 https://nouveau.domaine.com

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.