TP 6 : Fortinet FortiGate (FortiOS VM) – Sécurité Programmatique

Module : 2 – Fondamentaux des API REST et de l’embarqué Durée indicative : 2h Prérequis : TP 5 terminé, une VM FortiGate (FortiOS) accessible, pip install requests

Objectifs

  • Générer et utiliser une clé API FortiOS.
  • Créer dynamiquement des objets réseau et des VIPs.
  • Automatiser des règles de filtrage via la FortiOS REST API.

Contexte

Vous outillez une équipe sécurité qui doit ouvrir rapidement des accès contrôlés vers des serveurs internes, sans passer par l’interface web à chaque demande.

Étape 1 – Génération d’une clé API

  1. Sur FortiGate : System → Administrators → REST API Admin.
  2. Créez un profil avec les droits nécessaires (lecture/écriture sur firewall).
  3. Récupérez le token généré et stockez-le dans .env :
FORTIGATE_HOST=192.168.1.99
FORTIGATE_TOKEN=xxxxxxxxxxxx

Étape 2 – Authentification et premier appel

import os, requests
from dotenv import load_dotenv

load_dotenv()
BASE_URL = f"https://{os.getenv('FORTIGATE_HOST')}/api/v2/cmdb"
HEADERS = {"Authorization": f"Bearer {os.getenv('FORTIGATE_TOKEN')}"}

resp = requests.get(f"{BASE_URL}/firewall/address", headers=HEADERS, verify=False, timeout=5)
resp.raise_for_status()
print(resp.json())

Étape 3 – Création d’un objet réseau (address)

payload = {"name": "SRV-WEB-01", "subnet": "10.0.10.50/32"}
resp = requests.post(f"{BASE_URL}/firewall/address", json=payload, headers=HEADERS, verify=False)
resp.raise_for_status()

Étape 4 – Création d’une VIP

Créez une Virtual IP redirigeant le port 443 externe vers SRV-WEB-01 en interne (POST /firewall/vip).

Étape 5 – Règle de filtrage

Écrivez un script qui :

  1. crée les objets adresse nécessaires (source, destination) s’ils n’existent pas,
  2. crée une règle de pare-feu (POST /firewall/policy) autorisant le flux HTTPS vers la VIP,
  3. affiche le résultat et gère les erreurs (raise_for_status, capture des exceptions).

Des objets API au flux réseau réel Des objets API au flux réseau réel Address, VIP et policy ne sont utiles qu’ensemble : c’est leur combinaison qui ouvre le flux HTTPS vers le serveur interne.

Rendu attendu

  • Script Python versionné (.env exclu du dépôt).
  • Capture de la politique de pare-feu créée, visible dans l’interface FortiGate.
  • Un court compte-rendu des objets créés (adresses, VIP, policy).

Points de vérification

  • Le token API n’apparaît jamais en clair dans le code versionné.
  • Les objets adresse, la VIP et la policy sont créés et cohérents entre eux.
  • Le script vérifie l’existence d’un objet avant de le recréer.