Automatización y API
Resumen
Todo lo que haces en la interfaz web del firewall también se puede hacer por API: leer estado, cambiar configuración, hacer commit, registrar IP con tags, consultar sesiones. Esto permite automatizar tareas repetitivas (crear objetos y reglas en lote, respaldos programados, aislar un equipo infectado en segundos) y reducir errores humanos. PAN-OS ofrece dos APIs principales: la XML API (la clásica, con cuatro tipos de petición:
keygen,op,configycommit, másuser-idyexport) y la REST API (recursos JSON por objeto: direcciones, reglas, zonas…). Ambas se usan con HTTPS y una API key.
Además de scripts concurl, existen herramientas que se apoyan en esas APIs: el SDK de Python pan-os-python (ypan-python), módulos de Ansible y el proveedor de Terraform para Palo Alto, que permiten tratar la configuración como código. Esta nota explica cómo obtener una API key, ejemplos básicos de XML y REST concurl, el patrón seguro para cambiar y confirmar configuración, buenas prácticas de seguridad y los errores más comunes. Es contenido propio para la vida real: no depende de un laboratorio.
Requisitos previos
- Acceso HTTPS a la interfaz de gestión del firewall o de Panorama desde el equipo donde correrá el script (ver Initial Setup y Management Plane)
- Una cuenta de servicio dedicada, con un Admin Role que habilite solo la API y los permisos necesarios (ver Admin Authentication y RBAC)
- La IP del equipo de automatización en la lista de Permitted IP Addresses (ver Hardening del Management Plane)
-
curl(o Python, Ansible, Terraform) en el equipo de automatización - Un entorno de laboratorio para probar antes de ejecutar contra producción
- Un respaldo reciente de la configuración (ver CLI y Config Management)
- Un lugar seguro (un gestor de secretos) para guardar la API key
Conceptos clave
| Concepto | Qué es |
|---|---|
| API key | Cadena que identifica y autoriza a una cuenta; se envía en cada petición |
| XML API | Interfaz clásica: /api/?type=... con parámetros en la URL y respuesta XML |
| REST API | Interfaz JSON por recursos: /restapi/<versión>/Objects/Addresses?... |
type=keygen | Genera la API key a partir de usuario y contraseña |
type=op | Ejecuta un comando operativo (como show system info) |
type=config | Lee o modifica la configuración candidata (get, show, set, edit, delete…) |
type=commit | Confirma la configuración candidata |
type=user-id | Registra o elimina mapeos IP-usuario o IP-tag |
| XPath | La ruta del elemento dentro de la configuración XML |
| Candidate config | Configuración pendiente de commit; las llamadas config la modifican |
sequenceDiagram participant S as Script / Ansible / Terraform participant F as Firewall o Panorama S->>F: keygen (usuario y contraseña) o API key guardada F-->>S: API key S->>F: config set (candidate config) F-->>S: success S->>F: commit F-->>S: job id S->>F: op show jobs id (hasta FIN) F-->>S: result OK
Configuración y uso (Ejemplo)
Se usa 192.168.1.51 como firewall de ejemplo y <API-KEY> como marcador. Cambia ambos por los tuyos.
1. Cuenta de servicio y rol de API
- Device > Admin Roles > Add: Name
API-Automation. - Pestaña XML API: habilita solo lo necesario (Configuration, Operational Requests, Commit, User-ID Agent, Export…). Pestaña REST API: habilita los recursos que usarás.
- Pestaña Web UI y Command Line:
Noneen Command Line si la cuenta no necesita entrar por ahí (en Web UI usaDisablepor área). - Device > Administrators > Add: Name
svc-automation, Authentication (contraseña fuerte), Administrator TypeRole Based, ProfileAPI-Automation. - Commit.
2. Obtener la API key
curl -k -X GET "https://192.168.1.51/api/?type=keygen&user=svc-automation&password=<CONTRASEÑA>"
La respuesta es un XML con <key>...</key>. Guarda la clave en un gestor de secretos. Para no dejar la contraseña en el historial, usa -X POST con --data-urlencode:
curl -k -X POST "https://192.168.1.51/api/" --data-urlencode "type=keygen" --data-urlencode "user=svc-automation" --data-urlencode "password=<CONTRASEÑA>"
-k ignora el certificado: úsalo solo en laboratorio. En producción confía en la CA del firewall (ver Certificates y PKI) y quita -k.
3. Comandos operativos (type=op)
curl -k -G "https://192.168.1.51/api/" --data-urlencode "type=op" --data-urlencode "cmd=<show><system><info></info></system></show>" --data-urlencode "key=<API-KEY>"
curl -k -G "https://192.168.1.51/api/" --data-urlencode "type=op" --data-urlencode "cmd=<show><high-availability><state></state></high-availability></show>" --data-urlencode "key=<API-KEY>"
curl -k -G "https://192.168.1.51/api/" --data-urlencode "type=op" --data-urlencode "cmd=<show><session><info></info></session></show>" --data-urlencode "key=<API-KEY>"
El cmd es el comando de CLI convertido a XML: cada palabra es una etiqueta anidada. Para descubrir el XML de un comando, ejecuta el comando en la CLI con debug cli on y verás la petición XML correspondiente.
4. Leer y modificar configuración (type=config)
Leer un objeto de dirección:
curl -k -G "https://192.168.1.51/api/" --data-urlencode "type=config" --data-urlencode "action=get" --data-urlencode "xpath=/config/devices/entry[@name='localhost.localdomain']/vsys/entry[@name='vsys1']/address/entry[@name='DMZ-Server']" --data-urlencode "key=<API-KEY>"
Crear un objeto de dirección:
curl -k -G "https://192.168.1.51/api/" --data-urlencode "type=config" --data-urlencode "action=set" --data-urlencode "xpath=/config/devices/entry[@name='localhost.localdomain']/vsys/entry[@name='vsys1']/address" --data-urlencode "element=<entry name='API-Host-1'><ip-netmask>10.10.0.50/32</ip-netmask></entry>" --data-urlencode "key=<API-KEY>"
Confirmar (commit):
curl -k -G "https://192.168.1.51/api/" --data-urlencode "type=commit" --data-urlencode "cmd=<commit></commit>" --data-urlencode "key=<API-KEY>"
La respuesta trae un job id; consúltalo hasta que termine:
curl -k -G "https://192.168.1.51/api/" --data-urlencode "type=op" --data-urlencode "cmd=<show><jobs><id>5</id></jobs></show>" --data-urlencode "key=<API-KEY>"
Los xpath son largos y sensibles a comillas: para obtener el xpath exacto de algo que existe, mira la configuración en XML (Device > Setup > Operations > Export named configuration snapshot) o usa show en la API.
5. Registrar IP con tags (respuesta automática)
curl -k -X POST "https://192.168.1.51/api/?type=user-id&key=<API-KEY>" --data-urlencode "cmd=<uid-message><version>2.0</version><type>update</type><payload><register><entry ip='10.10.0.105'><tag><member>quarantine</member></tag></entry></register></payload></uid-message>"
Con un Dynamic Address Group asociado al tag, esa IP queda bloqueada sin commit (ver Dynamic Address Groups y Tagging).
6. REST API (JSON)
curl -k -X GET "https://192.168.1.51/restapi/v10.2/Objects/Addresses?location=vsys&vsys=vsys1&name=DMZ-Server" -H "X-PAN-KEY: <API-KEY>"
curl -k -X POST "https://192.168.1.51/restapi/v10.2/Objects/Addresses?location=vsys&vsys=vsys1&name=API-Host-2" -H "X-PAN-KEY: <API-KEY>" -H "Content-Type: application/json" -d '{"entry":{"@name":"API-Host-2","ip-netmask":"10.10.0.51/32"}}'
Cambia v10.2 por la versión de tu PAN-OS (por ejemplo v11.0). El REST modifica la configuración candidata; hace falta commit por la XML API o la GUI. En Panorama, la ubicación es location=device-group&device-group=<nombre>.
7. Herramientas de automatización
| Herramienta | Para qué |
|---|---|
pan-os-python | SDK de Python para escribir scripts orientados a objetos (direcciones, reglas, commits) |
Ansible (colección paloaltonetworks.panos) | Playbooks que definen el estado deseado de reglas, objetos y más |
Terraform (proveedor panos) | Configuración como código con planificación (plan) y aplicación (apply) |
Con cualquiera de ellas aplica el mismo patrón: cambios pequeños, probados en laboratorio, versionados (Git) y con commit controlado.
8. Patrón seguro de cambios
- Respaldo antes de cambiar (export de la configuración).
- Cambio en la candidata (
config set/ REST). - Validación (
validate fullantes del commit:type=op&cmd=<validate><full></full></validate>). - Commit y espera del job hasta
FINyOK. - Verificación (consulta de lo cambiado y de los logs).
- Reversa: si algo falla,
revertde la candidata (type=op&cmd=<load><config><from>running-config.xml</from></config></load>) o carga del respaldo.
Concurrencia
Si dos personas o scripts modifican la candidata a la vez, un commit puede incluir cambios ajenos. Usa config lock (
<request><config-lock><add></add></config-lock></request>) en cambios grandes, o commits por administrador (Partial commit/commit scope).
Verificación
| Comando o lugar | Qué debes ver | Si no lo ves |
|---|---|---|
Respuesta de keygen | status="success" con <key> | Si error, revisa usuario, contraseña y el permiso de API |
Respuesta de op | status="success" y el resultado del comando | Si Invalid command, revisa el XML del comando |
Respuesta de config set | status="success" | Si error, el xpath o el elemento son inválidos |
Tasks (icono de tareas, abajo a la derecha) o show jobs all | El job de commit en FIN / OK | Si FAIL, lee el detalle |
| GUI: Objects > Addresses | El objeto creado por API | Si falta, el cambio está en candidata sin commit o hubo error |
| Monitor > Logs > Config | La entrada del cambio con el usuario svc-automation | Si no aparece, no se aplicó |
| Monitor > Logs > System | Autenticaciones de la cuenta de servicio | Útil para detectar usos extraños |
show object registered-ip all | Las IP registradas con tags | Si falta, revisa el XML del registro |
Errores comunes
Invalid credentials o 403 al usar la API
- Causa: usuario o clave incorrectos, la cuenta no tiene permisos de API en su Admin Role, o la IP de origen no está en Permitted IP Addresses.
- Solución: revisa el rol (pestañas XML API/REST API), la IP permitida y vuelve a generar la clave.
Invalid XPath o Object not found
- Causa: el xpath tiene un nombre de entry, vsys o dispositivo incorrectos, o comillas mal escapadas.
- Solución: obtén el xpath exacto desde la configuración XML exportada y usa
--data-urlencodepara evitar problemas de escape.
El cambio se hizo pero no aparece en la política activa
- Causa: no hubo commit.
- Solución: haz commit y espera el job.
El commit falla con errores de validación
- Causa: referencias a objetos que no existen, zonas inválidas o reglas duplicadas.
- Solución: ejecuta
validate fully corrige lo que indique.
Mi script cambia cosas de otro administrador
- Causa: la candidata es compartida, y el commit las incluye.
- Solución: usa config lock o commit por administrador, y coordina los cambios.
Error de certificado con curl
- Causa: el firewall usa un certificado autofirmado o de una CA que el equipo no conoce.
- Solución: instala la CA correcta (no uses
-ken producción).
La API key se filtró
- Causa: quedó en un script, historial o repositorio.
- Solución: genera una clave nueva (cambia la contraseña de la cuenta de servicio y regenera) y revoca la anterior; no guardes claves en Git, usa un gestor de secretos.
REST devuelve 404 o Invalid version
- Causa: la versión de la URL no coincide con la de PAN-OS, o el recurso no existe en esa versión.
- Solución: usa la versión correcta (
show system info> sw-version) y revisa la documentación de la API de esa versión.