I have a script that I have always used to copy the L3 firewall rules from one network to another. This has worked until recently, and the only change I can see is that Security & SD-WAN > Firewall had a bit of an overhaul. I am wondering if this broke the API, or if I just need to change something. I did have to refine how I get the rules a bit as the output changed from getting the rules from a source network.
This is a PowerShell script, however using the Curl template as an example I am using Invoke-RestMethod to PUT the data into Meraki.
Recently, this started throwing (403) Forbidden.
What is actually happening with the above code:
#PowerShell:
$header = @{"X-Cisco-Meraki-API-Key" = $secured_api_key
"Content-Type" = 'application/json'}
#I have also tried adding "Accept" = 'application/json' to the above $header
$body = @{ rules = $FirewallRules } | ConvertTo-Json
$uri = https://api.meraki.com/api/v1/networks/L_123456789012345678/appliance/firewall/l3FirewallRules
$request = Invoke-RestMethod -Method Put -Uri $uri -Headers $header -Body $body
return $request
#This is what is stored in the $body variable from above, with IP addresses modified for use as an example. The format still matches what is in the examples in the Developer Hub.
{
"rules": [
{
"comment": "Deny Guest to Internal VLANS",
"policy": "deny",
"protocol": "any",
"srcPort": "Any",
"srcCidr": "172.24.25.0/24",
"destPort": "Any",
"destCidr": "172.24.24.0/25,172.24.24.128/26,172.24.26.0/23,172.24.25.0/24,172.24.30.0/24,172.24.28.0/23,172.24.24.192/26",
"syslogEnabled": false
},
{
"comment": "Deny Outside to Internal VLANS except itself",
"policy": "deny",
"protocol": "any",
"srcPort": "Any",
"srcCidr": "172.24.24.192/26",
"destPort": "Any",
"destCidr": "172.24.24.0/25,172.24.24.128/26,172.24.26.0/23,172.24.25.0/24,172.24.30.0/24,172.24.28.0/23",
"syslogEnabled": false
}
]
}
The account used with the API has full access.
I am wondering if the format of $body needs to change to accommodate changes made to the dashboard, considering that Inbound and Cellular rules have been added.
I am sort of at a loss of what to do to fix this. I am sure I can switch to using CURL from within PowerShell if anyone who wants to take a stab at it has trouble with PowerShell programming and the Invoke-RestMethod way I was doing it. I got really deep in the weeds programming that way before realizing I could have used curl commands all along in PS (and at the time I was new with API programming).