# PyFRC2G Script python de conversion de rĂšgles firewall **PfSense** en graphique. ## 👋 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Ă© Ă©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/). * GĂ©nĂ©ration des flux graphiques avec la bibliothĂšque python **Graphviz**. * GĂ©nĂ©ration d'un fichier PNG 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 ``` 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. 2. Configuration du script RĂ©cupĂ©rez les fichiers **pyfrc2g.py** et **config.py**. Configurez l'**URL** de votre pfSense et vos **credentials** dans le fichier **pyfrc2g.py**. Exemple : ```python # --- CONFIG --- PFS_URL = "https://pfs01.domaine.lan/api/v2/firewall/rules" PFS_TOKEN = "VOTRE_CLE_GENEREE_AVEC_PFSENSE_REST_API" ``` Renseignez le nom de la passerelle Ă  la ligne 171 du script : ```Python (...) for entry in entries: writer.writerow({ "SOURCE": safe_value(entry.get("source"), "source"), "PASSERELLE": "NOM_DE_LA_PASSERELLE/"+safe_value(entry.get("interface"), "interface"), "ACTION": safe_value(entry.get("type")), (...) ``` Configurez ensuite vos interfaces, les rĂ©seaux, les adresses des interfaces et les ports dans le fichier **config.py**. C'est certainement rĂ©cupĂ©rable depuis pfSense mais je suis allĂ© au plus facile Ă  mettre en place 😇. Exemple : ```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.