Vor Kurzem musste ich spontan einen Exchange-Server veröffentlichen; weder Webserver Protection noch ein vertrauenswürdiges Zertifikat waren vorhanden. Die Lösung in Form von Let’s Encrypt mit Certify The Web Client war schnell konfiguriert, jedoch musste für die HTTP-Challenge -nun ja- HTTP-Zugriff auf den Server ermöglicht werden. Diese Regel dauerhaft aktiv zu halten, war mir dann doch nicht geheuer und eine automatisierte Lösung musste her.
Sophos UTM RESTful API to the rescue!
Für den Einstieg erwies sich die Weboberfläche „SwaggerUI“ als äußerst hilfreich. Sobald das API-Modul unter Management → WebAdmin Settings → RESTful API aktiviert ist, steht diese unter https://utmhostname:4444/api/ zur Verfügung.
Mithilfe der Tools können die Möglichkeiten der API „spielerisch“ erkundet werden, zudem können hier direkt die passenden Aufrufe generiert werden. Über packetfilter → nat kann man sich die aktuellen NAT-Regeln ausgeben lassen und z.B. über den Namen die zughörige Referenz identifizieren.
Die Dokumentation ist ebenfalls hilfreich. Damit war es mir möglich, ein zufällig entdecktes PowerShell-Script anzupassen:
$utmHostName = 'utmhostname.domain'
$token = 'apitoken'
$networkURI = 'https://' + $utmHostName + ':4444/api/objects/packetfilter/nat/REF_PacNatHttpFromAny'
$tokenBase64 = [Convert]::ToBase64String([System.Text.Encoding]::Default.GetBytes("token:" + $token))
$headers = @{}
$headers.add('Content-Type', 'application/json')
$headers.add('Accept', 'application/json')
$headers.add("Authorization",'Basic ' + $tokenBase64)
$body = '{
"auto_pf_in": "",
"auto_pfrule": true,
"comment": "",
"destination": "REF_NetIntExterWanAddre",
"destination_nat_address": "REF_NetDnsWapp01",
"destination_nat_service": "",
"group": "Zertifikate",
"ipsec": false,
"log": false,
"mode": "dnat",
"name": "HTTP from Any to WAN (Address)",
"service": "REF_zbCXCkAONs",
"source": "REF_NetworkAny",
"source_nat_address": "",
"source_nat_service": "",
"status": false
}'
Invoke-RestMethod -Uri $networkURI -Method Patch -Headers $headers -Body $body
In der letzten Zeile des Body-Blocks wird der Status festgelegt. True = Regel aktiv, false = Regel deaktiviert. Das Script kann dann direkt im Certify-Client eingebunden werden, per Aufgabenplanung ausgeführt werden oder wie auch immer gewünscht. Angepasst werden müssen die ersten beiden Zeilen ($utmHostName und $token) sowie der Body. Letzteren kann man ohne großen Aufwand über die Swagger UI generieren.
Der API-Key kann über das WebAdmin-Portal erzeugt werden und muss an einen entsprechend berechtigten Benutzer gebunden werden. Hierbei sollte es sich um einen lokalen UTM-Account handeln, wurde jedenfalls hier erwähnt.