Table of Contents

PAN-OS API Basics

Palo Alto Networks PANOS has an XML API that can be used to script and automate any task.

The admin guide can be found here.

PANOS API

The official PANOS XML API information is here.

In addition to using cURL and PowerShell, you can (for the most part) just take the https commands and paste them straight into a web browser's address bar.

Get API Key

To get the API key, run

https://10.1.1.1/api/?type=keygen&user=YOUR_USERNAME_HERE&password=YOUR_PASSWORD_HERE

Escape Characters

When using cURL, sometimes you need to replace whitespace and symbols with ASCII codes.

cURL

cURL for Windows can be found here.

With Curl, we use the following command to run XML API actions.

curl --insecure -g -X GET "URL_HERE"

Sometimes we need to output to a file (e.g. if exporting configuration files or certificates) and we use -o output_filename.xyz. If we want to silence all output from the command, we can use -o nul.

If we want to upload a file, we remove -X GET and add –form file=Name_Of_File.xyz

You can move the key out of the URL and into a parameter to the cURL command using the following example

curl -H "X-PAN-KEY:API_KEY_HERE" --insecure -g -X GET "https://..."

PowerShell

When using Windows, you may find it easier to use PowerShell as that is built in and does not require you to download cURL.

Disclaimer: I am no expert in PowerShell. Any an all code here is derived from snippets I have found online.

The following line ensures the rest of the script uses TLS 1.2.

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

To actually invoke a HTTPS request, run the following. I noticed that I had to use a FQDN and also make sure that the end point running the script trusted the management certificate in order to connect correctly.

$FIREWALL_FQDN = "firewall.example.local"
$URL = "https://$FIREWALL_FQDN/..."
$Output = Invoke-WebRequest -Uri $URL

If you remove the $Output = from the line then the HTTP response will be printed to the console window.

To output text to the screen, run

Write-Host "This prints a variable to the screen $VAR_NAME"

On some scripts, you may need the IP of the server the script is running on. This seems to work: (I found it here.

$ipaddress = $(ipconfig | where {$_ -match 'IPv4.+\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' } | out-null; $Matches[1])

Get XML Data

debug cli on

here.