Assimilator: Automatic Firewall Rule Orchestator

The first restful API to control all firewall brands. Configure any firewall with restful API calls, no more manual rule configuration. Centralize all your firewalls into one API.


  • Palo Alto
  • Juniper
  • Cisco
  • Fortinet
  • Checkpoint
  • PfSense
  • AWS


  • API key through HTTP headers.
  • Flexible authorization, allow certain URI path with certain HTTP methods.


  • All request/response body are in JSON. No more XML, plain text or custom responses.


  • Fully scripted in Python Flask.
  • Easy to update and add new modules.
  • Ready for any automatic task.

Open Source

  • No more Panorama, CSM or NSM.
  • Integrates with Apache2 with mod WSGI.
  • Assimilator gives a full RESTful experience for free.

How it works

All firewalls share a common ground on their configuration, for example:

  • List of commands showing the actual configuration (AKA the running configuration).
  • Rules or policies filtering IP packets.
  • Objects:
    • Addresses (i.e. <-> Administration_Server).
    • Address group (i.e. Administration_Farm <-> [ Administration_Server01 , Administration_Server02 ]).
    • Port or service (i.e. TCP/80 <-> http).
    • Port or service group (i.e. Application_ports <-> { TCP/6600 , TCP/6610 }).
  • Interfaces.
  • Zones.
  • Routing table.
  • PBR (policy based route).

Assimilator makes it possible to configure via the five RESTful methods all these portions of configuration with JSON objects:

  • GET: Show the object.
  • POST: Add new object.
  • PATCH: Append new data to object.
  • PUT: Replace data in object.
  • DELETE: Remove object from configuration.

URL Format



Request: GET /api/headquarters/config

Response: HTTP 200
{"config" : "<...>"}

Request: POST /api/branch/rules
{"name" : "Test01", "from" : "trust", "to" : "untrust",
"source" : "", "destination" : "", "action" : "allow",
"application" : "junos-dns-udp"}
Response: HTTP 201
Request: DELETE /api/branch1/rules
{"name" : "Permit Any"}
Response: HTTP 200

Request: PUT /api/branch2/objects/address-group
{"name" : "Admin_Servers", "members" : [ "Server02" ] }
Response: HTTP 200

Request: PATCH /api/paloalto/headquarters/route
{"name" : "internal", "destination" : "", "next-hop" : "" }
Response: HTTP 200


With Docker (recommended):

cd /opt
git clone && cd assimilator
docker build -t assimilator /opt/assimilator/
docker run -d -p 443:443/tcp assimilator

Without Docker:

cd /opt
git clone && cd assimilator
sudo ./


Read the documentation.

%d bloggers like this: