Utiliza la API de consulta de eventos REST de FortiSIEM. Publica una consulta XML en /phoenix/rest/query/eventQuery, lo que devuelve un ID de consulta, verifica el progreso hasta que alcance 100, y luego recupera los eventos. Los resultados se devuelven como XML. La línea de registro original de cada evento está en el atributo rawEventMsg, por lo que unas pocas líneas de Python convierten el resultado en registros sin procesar. Las exportaciones de la pantalla de Analytics aparecen en formatos que LogTotal no lee hoy.
FortiSIEM es común dondequiera que Fortinet administre la red, y a menudo contiene mucho más que registros de firewall. Prime Core tiene 19,692 reglas de detección para FortiSIEM, mapeadas a 664 técnicas de MITRE ATT&CK. A continuación se muestra cómo extraer eventos, sanitizarlos e investigarlos gratis en LogTotal.
Antes de empezar
Un usuario de API. Utiliza una cuenta con permisos para ejecutar consultas analíticas. La API se autentica con autenticación básica, con la organización en el nombre de usuario: super/<usuario> en una instalación empresarial, <org>/<usuario> para una organización específica en una instalación de proveedor de servicios.
Retención. El almacenamiento de eventos en línea es limitado. Los eventos más antiguos pueden estar en el almacenamiento de archivo que necesita pasos adicionales.
Nombres de atributos. Las consultas FortiSIEM utilizan sus propios nombres de atributos, como reptDevName (dispositivo reportante), reptDevIpAddr, eventType y phRecvTime. Construye el filtro primero en Analytics.
Exportar con la API de consulta de eventos
Guarda la consulta como query.xml:
<?xml version=»1.0″ encoding=»UTF-8″?>
<Reports><Report><Name>Exportación LogTotal</Name><Description/>
<SelectClause><AttrList>phRecvTime,reptDevIpAddr,eventType,rawEventMsg</AttrList></SelectClause>
<ReportInterval><Low>1792368000</Low><High>1792454400</High></ReportInterval>
<PatternClause><SubPattern id=»1″ name=»Filter»>
<SingleEvtConstr>reptDevName = «web-03″</SingleEvtConstr>
</SubPattern></PatternClause>
</Report></Reports>
El intervalo es en segundos epoch para 2026-10-19 00:00 UTC a 2026-10-20 00:00 UTC. Luego ejecútalo:
FSM=»https://fortisiem.example.com»
AUTH=»super/apiuser:$FSM_PASS»
QID=$(curl -sS -u «$AUTH» -X POST -H ‘Content-Type: text/xml’ –data @query.xml «$FSM/phoenix/rest/query/eventQuery»)
until [ «$(curl -sS -u «$AUTH» «$FSM/phoenix/rest/query/progress/$QID»)» = «100» ]; do sleep 5; done
curl -sS -u «$AUTH» «$FSM/phoenix/rest/query/events/$QID/0/1000» > fsm_web03_1019.xml
Los dos últimos segmentos de ruta son el desplazamiento de inicio y el conteo. Recorre resultados grandes en pasos de 1,000. Luego extrae los mensajes sin procesar:
import xml.etree.ElementTree as ET
root = ET.parse(«fsm_web03_1019.xml»).getroot()
with open(«fsm_web03_1019.log», «w») as out:
for attr in root.iter(«attribute»):
if attr.get(«name») == «rawEventMsg» and attr.text:
out.write(attr.text.strip() + «n»)
Subir, sanitizar y revisar en LogTotal
- Subir. Abre logtotal.com y carga el archivo.
- Sanitizar.
- Revisar.
Cómo se ve esto con datos reales.
Cuando algo sale mal
| Síntoma | Causa probable | Fix |
|---|---|---|
| 401 | Organización ausente en el nombre de usuario | Usa super/<usuario> o <org>/<usuario> |
| La consulta devuelve un error en lugar de un ID | Sintaxis XML o un nombre de atributo desconocido | Prueba el filtro en Analytics; verifica los nombres de los atributos |
| El progreso nunca llega a 100 | Consulta demasiado amplia | Reduce el rango temporal y el filtro |
| rawEventMsg vacío | El atributo no fue seleccionado | Agrega rawEventMsg a AttrList |
| Eventos antiguos faltantes | Están en almacenamiento de archivo | Verifica las opciones de archivo |
FAQ
¿Por qué XML?
Eso es lo que habla esta API de FortiSIEM. El paso en Python lo convierte a las líneas sin procesar originales, que generalmente es lo que quieres subir de todos modos.
¿Puedo exportar incidentes en lugar de eventos?
Los incidentes tienen sus propias llamadas API. Para LogTotal, exporta los eventos detrás de ellos.