Files
PyFRC2G/README.md
2025-11-22 14:13:26 +01:00

109 lines
4.2 KiB
Markdown

# PyFRC2G
Scripts python de conversion de règles firewall **PfSense** et **OPNSense** en vision graphique des flux.
![rules](./img/convert-rules-to-graph.png)
## 👋 Présentation
Le script a été codé pour répondre à deux objectifs :
* Avoir une vision graphique globale des règles firewall (une image vaut mille mots).
* Fournir des preuves permettant de répondre à des exigences de sécurité informatique édictées par les différents référentiels existants.
## ⚡ Caractéristiques
* Script basé sur **Python** (développé et testé sur GNU/Linux).
* Utilisation de l'API de pfSense fournie par [pfSense REST API Package](https://pfrest.org/).
* Utilisation de l'API intégrée d'OPNSense.
* Génération des flux graphiques avec la bibliothèque python **Graphviz**.
* Génération d'un fichier PDF A4 avec une page par interface.
* Distinction entre un VLAN/réseau de destination et un hôte de destination.
* Mapping des interfaces, des ports et des destnations.
* Coloration pour les actions PASS et BLOCK.
* Coloration pour les règles présentes mais désactivées.
## 💾 Installation
1. Prérequis
Installation des bibliothèques Python :
```Bash
pip install requests graphviz reportlab
```
2. pfSense
Installation de **pfSense REST API Package** : [https://github.com/jaredhendrickson13/pfsense-api?tab=readme-ov-file#quickstart](https://github.com/jaredhendrickson13/pfsense-api?tab=readme-ov-file#quickstart)
Une fois le paquet **pfSense REST API** installé, configurez la ou les interface(s) d'écoute sur **pfSense** puis générez une clé qui nous servira pour l'authentification à l'API.
3. Configuration du script
Récupérez les fichiers **pyfrc2g.py** et **config.py** correspondant à votre passerelle (pfSense ou OPNSense).
Configurez l'**URL** de votre passerelle et vos **credentials** dans le fichier **pyfrc2g.py**.
Exemple avec pfSense :
```python
# --- CONFIG ---
PFS_URL = "https://pfs01.domaine.lan/api/v2/firewall/rules"
PFS_TOKEN = "VOTRE_CLE_GENEREE_AVEC_PFSENSE_REST_API"
PASSERELLE = "PFS01"
```
Pour OPNSense vous devez également renseigner le nom des interfaces car l'API ne permet de récupérer les règles qu'interface par interfac (elles sont visibles sur *Interfaces > Assignations*)
Exemple avec OPNSense :
```python
OPNS_URL = "https://<OPNS_ADDRESS/api/firewall/filter/search_rule"
OPNS_SECRET = "<API_SECRET>"
OPNS_KEY = "<API_KEY>"
PASSERELLE = "<GW_NAME>"
(...)
# Déclaration des interfaces présentes sur OPNSense
INTERFACES = ["wan","lan","opt1"]
```
Configurez ensuite vos interfaces, les réseaux, les adresses des interfaces et les ports dans le fichier **config.py**.
Exemple avec pfSense :
```python
INTERFACE_MAP = {
"wan": "WAN",
"lan": "ADMINISTRATION",
"opt1": "LAN",
"opt2": "DMZ"
}
NET_MAP = {
"wan": "WAN SUBNET",
"lan": "ADMINISTRATION SUBNET",
"opt1": "LAN SUBNET",
"opt2": "DMZ SUBNET"
}
ADDRESS_MAP = {
"wan:ip": "WAN ADDRESS",
"lan:ip": "ADMINISTRATION ADDRESS",
"opt1:ip": "LAN ADDRESS",
"opt2:ip": "DMZ ADDRESS"
}
PORT_MAP = {
"WEB_ACCESS": "80/443"
}
```
## 🚀 Utilisation
Lancez le script **pyfrc2g.py**. Le script génèrera alors un fichier CSV qui sera parsé dans la foulée afin de générer un fichier *.gv* par interface présente sur pfSense puis de générer un rendu au format PNG. Ces fichiers sont nommés avec le nom de la passerelle et l'interface dans le répertoire **graphs**.
Notes :
* Lors de la récupération des hôtes de destination, l'API de pfSense ne permet pas de connaitre le réseau dans lequel se situe celui-ci. J'ai donc commenté mes hôtes de destination sur pfSense en renseignant dans quel VLAN était celui-ci.
* Pour les hôtes de destination se situant en dehors de mon infrastructure interne, j'ai renseigné dans pfSense *EXT_* devant chaque nom d'alias de ces hôtes.
## 📝 Todo
* Améliorer le code (je ne suis pas dev et ça se voit sur le côté bordélique).
* Automatiser le script avec génération des graphiques uniquement pour les règles ayant changées.
* Notification des admins quand génération des graphiques.
* Insérer le VLAN de destination devant un hôte de destination.
* Faire la même chose avec OPNSense.
* Envoyez les preuves dans [CISO Assistant](https://intuitem.com/fr/ciso-assistant/).