Usa le API di query XQL. Avvia una query con /public_api/v1/xql/start_xql_query, che restituisce un ID di esecuzione. Recupera i risultati con /public_api/v1/xql/get_query_results in formato JSON. Quella chiamata restituisce fino a 1000 risultati inline; qualsiasi cosa più grande viene restituita come un ID di flusso che passi a /public_api/v1/xql/get_query_results_stream. L’autenticazione utilizza due intestazioni: il tuo API key in Authorization e il suo ID in x-xdr-auth-id.
Cortex XDR raccoglie dati dettagliati di telemetria degli endpoint, oltre a dati di rete e identità in molte implementazioni. Prime Core ha oltre 24.000 regole di rilevamento uniche, mappate a 676 tecniche MITRE ATT&CK. Di seguito è riportato come estrarre, sanificare e indagare gratuitamente i dati in LogTotal.
Prima di iniziare
Una chiave API. Crea una nelle impostazioni di Cortex XDR (il tipo di chiave standard è il più semplice) con un ruolo che può eseguire query XQL. Annota la chiave e il suo ID.
Il tuo URL API. Viene mostrato quando crei la chiave, nel formato https://api-<tenant>.xdr.<region>.paloaltonetworks.com.
Licenza e quota. Le API XQL necessitano di una licenza Cortex XDR Pro. Le query attingono alla tua quota XQL, e puoi eseguire fino a quattro query API in parallelo.
Il dataset. La telemetria degli endpoint è in xdr_data, con campi come agent_hostname, event_type, action_process_image_command_line e actor_process_image_name. Costruisci la query prima nel Query Builder.
Esporta con le API XQL
XDR="https://api-<tenant>.xdr.<region>.paloaltonetworks.com"
H1="Authorization: $XDR_API_KEY"
H2="x-xdr-auth-id: $XDR_API_KEY_ID"
# 1. avvia la query (intervallo di tempo in millisecondi epoch)
QID=$(curl -sS -X POST "$XDR/public_api/v1/xql/start_xql_query" -H "$H1" -H "$H2" -H 'Content-Type: application/json'
-d '{"request_data": {"query": "dataset = xdr_data | filter agent_hostname = "WS-042" | fields _time, agent_hostname, event_type, action_process_image_name, action_process_image_command_line, actor_process_image_name", "timeframe": {"from": 1792368000000, "to": 1792454400000}}}'
| jq -r '.reply')
# 2. aspetta i risultati
while :; do
RESP=$(curl -sS -X POST "$XDR/public_api/v1/xql/get_query_results" -H "$H1" -H "$H2" -H 'Content-Type: application/json'
-d "{"request_data": {"query_id": "$QID", "pending_flag": true, "format": "json"}}")
[ "$(echo "$RESP" | jq -r '.reply.status')" != "PENDING" ] && break
sleep 5
done
# 3. fino a 1.000 risultati inline; di più tramite il flusso
STREAM=$(echo "$RESP" | jq -r '.reply.results.stream_id // empty')
if [ -n "$STREAM" ]; then
curl -sS -X POST "$XDR/public_api/v1/xql/get_query_results_stream" -H "$H1" -H "$H2" -H 'Content-Type: application/json'
-d "{"request_data": {"stream_id": "$STREAM", "is_gzip_compressed": false}}" > xdr_ws042_1019.jsonl
else
echo "$RESP" | jq -c '.reply.results.data[]' > xdr_ws042_1019.jsonl
fi
L’intervallo di tempo sopra è 2026-10-19 00:00 UTC a 2026-10-20 00:00 UTC.
Carica, sanifica e esamina in LogTotal
- Carica. Apri logtotal.com e inserisci il file.
- Sanifica.
- Esamina.
Quando qualcosa va storto
| Sintomo | Causa probabile | Fix |
|---|---|---|
| 401 | Chiave e ID della chiave scambiati, o la chiave è scaduta | Chiave in Authorization, ID in x-xdr-auth-id |
| Errore di licenza | Nessuna licenza XDR Pro | Le API XQL necessitano di XDR Pro |
| Errori di quota | Quota XQL esaurita, o più di quattro query parallele | Aspetta; restringi la query |
| Esattamente 1.000 risultati | Flusso non utilizzato | Recupera il resto con l’ID del flusso |
| Errori di query | Sintassi XQL | Testa prima nel Query Builder |
FAQ
Posso esportare incidenti e avvisi?
Sì, tramite API separate per incidenti e avvisi. Per LogTotal, esporta la telemetria dietro di loro.
E per quanto riguarda i log grezzi di terze parti?
Se li ingesti in Cortex, vivono nei loro propri dataset ed escono nello stesso modo.