Moin,
ich hab mal ein kleines Problem.
Ich muss zwei Batchdateien erstellen.
Eine muss auf Opnsense zugreifen und eine bestimmte Regel aktivieren, die andere soll genau diese Regel deaktivieren.
Der Umgang mit Opnsense soll vereinfacht werden, statt ins Webinterface zu gehen soll der Klick auf eine Batchdatei genügen.
Kommen wir zum Problem:
Ich habe diese Aufgabe bekommen, bin im 1. Lehrjahr zum FISI (weder in der Berufschule noch im Betrieb haben wir mal über sowas geredet) und habe keinen Ansprechpartner weil "mach mal, wird schon, hast ja Google". Dementsprechend habe ich keine Erfahrung geschweige denn Ahnung von sowas.
Kann mir vielleicht jemand helfen?
Wenn ich vielleicht mal einen Anfang oder Hilfestellung finden würde, würde ich es vielleicht auch hinbekommen.
Batchdatei klingt nach Windows. Anstelle von einer altmodischen Batch-Datei erstelle besser ein Powershell-Script. In Powershell hast du einen SSH-Client inklusive und kannst per SSH auf der OPNsense Kommandos ausführen. Wenn du mal so weit bist, dass das funktioniert (einloggen per privat/public key aus einem Powershell-Script), dann melde dich wieder, dann kann man mal gucken, wie man einzelne Regeln an oder aus geknipst bekommt. Als Test-ommando kannst du ja "ls" oder sowas benutzen, was einfach eine Ausgabe erzeugt.
Hoffe, da sind jetzt genug Stichworte zum Googeln drin ;) Nochmal zusammengefasst:
- powershell
- ssh
- public key authentication
Und in der OPNsense-Doku mal danach gucken, wie man einen Benutzer anlegt und SSH einschaltet, damit der sich dann auch einloggen kann.
Ah, danke dir schonmal! Ist es denn wirklich zwangsweise notwendig einen User zu erstellen? Nicht, dass das jetzt irgend ein Problem wäre aber davon hab ich in meiner Recherche zumindest nichts gelesen.
Mit irgendeinem Benutzer musst du dich anmelden, wenn du die OPNsense fernsteuern willst. Du kannst natürlich auch den "root" Benutzer dazu nehmen, das ist aber deutlich unsicherer, wenn sich der "Ober-Admin darf alles" über das Netzwerk per SSH anmelden kann.
So, ich habs jetzt geschafft mich per SSH einzuloggen über das Terminal. Wie genau kann ich jetzt einzelne bestehende Regeln aktivieren und deaktivieren?
Wäre es nicht einfacher, mit der OpnSense-API von außen die Regeln zu steuern?
Mir wäre jedenfalls auf Anhieb nicht klar, welches Kommando per SSH eine Firewall-Regel an- oder ausknipst. In der API ist das schön dokumentiert: https://docs.opnsense.org/development/api/plugins/firewall.html#api-plugins-firewall
Quote from: meyergru on July 17, 2023, 08:07:20 PM
Wäre es nicht einfacher, mit der OpnSense-API von außen die Regeln zu steuern?
Mir wäre jedenfalls auf Anhieb nicht klar, welches Kommando per SSH eine Firewall-Regel an- oder ausknipst. In der API ist das schön dokumentiert: https://docs.opnsense.org/development/api/plugins/firewall.html#api-plugins-firewall
Ich denke auch, dass das Ganze per API etwas sinnvoller ist (dafür ist diese ja da).
Ist sicherlich einfach gebaut mit PowerShell, die kann ja mit ,,Invoke-RestMethod" die API ansprechen.
OPNsense Telegram Group: https://t.me/joinchat/0o9JuLUXRFpiNmJk
PM for paid support
Meine Idee wäre gewesen, per SSH auf der OPNsense die API anzusprechen. Immerhin ist der Werkzeugkasten dort wesentlich umfangreicher als unter Windows. Zumindest der mir bekannte Werkzeugkasten, zugegeben. ;)
Dass pfctl keine Möglichkeit hat, Regeln zu deaktivieren, finde ich allerdings ziemlich enttäuschend. Komme langsam zu dem "was kann pf überhaupt besser als ipfw?" Punkt. Eine Firewall mit dem Umfang von OPNsense und ipfw als engine hätte wirklich was ...
Meddl Loide,
ich habe jetzt ein Pythonskript angefertigt. In welchem ich eine Liste an Firewallregeln angebe und diese dann über die OPNsense API aktiviert/deaktiviert werden sollen. Mein Problem ist das ich als Antwort der API nur "{"result":"failed"}" bekomme. Hat jemand eine Idee was da der Fehler ist?
def toggle_firewall_rules(rule_uuids):
for rule_uuid in rule_uuids:
try:
url = f"{OPNSENSE_URL}/api/firewall/filter/toggleRule/{rule_uuid}/0"
response = requests.post(url, auth=(API_KEY, API_SECRET), verify=False)
response.raise_for_status()
print(response.text)
print(f"Firewall-Regel mit der UUID {rule_uuid} wurde erfolgreich getoggelt.")
except requests.exceptions.RequestException as e:
print(f"Fehler beim Toggeln der Firewall-Regel: {str(e)}")
if __name__ == "__main__":
# Liste der Firewall-Regeln, die getogglet werden sollen.
rule_uuids_to_toggle = ["Ausnahme", "721cedbd7cf211983ec1946cf98ae63f", "5b2581147a52b44b6c85cce7ae453438", "209a1a1f5e2cec6377ca10becbbdbb05"]
# Regeln toggeln
toggle_firewall_rules(rule_uuids_to_toggle)
Du musst dich erst authentifizieren.
Ich authentifiziere mich über einen API-Token welcher sich auch im Skript befindet, ich aber nicht mit reingeschickt habe. Siehe: response = requests.post(url, auth=(API_KEY, API_SECRET), verify=False)