Estrai documenti con l’API _search, o lascia che un breve script Python li esplori attraverso helpers.scan. Se la tua pipeline ha mantenuto la linea di log originale, solitamente in message o event.original, estrai solo quel campo e ottieni i log grezzi indietro. OpenSearch Dashboards può generare report da ricerche salvate, ma non in un formato che LogTotal legge oggi.
OpenSearch supporta molti SIEM e piattaforme di log fatte in casa, inclusi Amazon OpenSearch Service e l’indicizzatore Wazuh. Prime Core ha 23.466 regole di rilevamento per OpenSearch, mappate su 671 tecniche MITRE ATT&CK. Qui sotto è mostrato come ottenere una fetta pulita di dati, sanificarla e investigarla gratuitamente su LogTotal.
Prima di iniziare
Permessi. Con il plugin di sicurezza abilitato, il tuo ruolo necessita di accesso in lettura al pattern dell’indice: il gruppo di azioni di lettura, o almeno indices:data/read/search* e indices:data/read/scroll*. Su Amazon OpenSearch Service, si tratta di un utente di controllo accessi a grana fine o di credenziali IAM con firma SigV4.
Trova i campi giusti. I pattern di indice differiscono tra le pipeline. Controlla un documento e la mappatura prima di scrivere una query:
GET logs-*/_search?size=1
GET logs-*/_mapping
Stai cercando il campo temporale (@timestamp o timestamp) e, idealmente, un campo che contenga la linea originale (message, event.original, full_log in Wazuh).
Conta prima. Esegui GET logs-*/_count con la stessa query per vedere cosa stai per estrarre.
I comandi seguenti seguono la documentazione di OpenSearch 2.x, verificata ad ottobre 2026.
Opzione 1: Python con opensearch-py (consigliato)
helpers.scan gestisce la paginazione e si pulisce dopo. Installa opensearch-py, poi:
import json, os
from opensearchpy import OpenSearch, helpers
client = OpenSearch(
"https://opensearch.example.com:9200",
http_auth=("reader", os.environ["OS_PASSWORD"]),
verify_certs=True,
)
query = {"query": {"range": {"@timestamp": {
"gte": "2026-10-19T00:00:00Z", "lt": "2026-10-20T00:00:00Z"}}}}
with open("opensearch_1019.jsonl", "w") as out:
for hit in helpers.scan(client, index="logs-*", query=query, size=1000):
out.write(json.dumps(hit["_source"]) + "n")
Per ottenere linee grezze invece di documenti, scrivi hit[“_source”].get(“message”, “”) invece dell’intero _source. Per mantenere il file piccolo, aggiungi “_source”: [“@timestamp”, “host.name”, “message”] alla query.
Opzione 2: curl per esportazioni piccole
Fino a 10.000 documenti, una richiesta è sufficiente:
curl -sS -u reader -H 'Content-Type: application/json'
"https://opensearch.example.com:9200/logs-*/_search" -d '{
"size": 10000,
"query": {"range": {"@timestamp": {"gte": "2026-10-19T00:00:00Z", "lt": "2026-10-20T00:00:00Z"}}},
"sort": [{"@timestamp": "asc"}]
}' | jq -c '.hits.hits[]._source' > opensearch_small.jsonl
10.000 è l’indice predefinito.max_result_window. Superato questo limite, la richiesta fallisce, e vuoi l’Opzione 1, o un point in time (PIT) con search_after se preferisci gestirlo da solo con uno script.
Passaggio 3: Carica, sanifica e rivedi su LogTotal
- Carica. Apri logtotal.com e carica il file .jsonl.
- Sanifica. Esamina prima di continuare.
- Rivedi.
Quando qualcosa va storto
| Sintomo | Probabile causa | Fix |
|---|---|---|
| security_exception / 403 | Il ruolo non ha i permessi di ricerca o scorrimento | Richiedi lettura sul pattern dell’indice |
| Finestra del risultato troppo ampia | Più di 10.000 riscontri in una richiesta | Usa helpers.scan o PIT con search_after |
| Zero riscontri, ma i dati sono presenti | Nome campo temporale errato, o un’indicazione di fuso orario sbagliata | Controlla la mappatura; usa esplicitamente timestamp Z |
| Nessun contesto di ricerca trovato | Lo scroll è scaduto tra le pagine | Passa scroll=”5m” a helpers.scan; usa pagine più piccole |
| Errori di firma su Amazon OpenSearch Service | Il dominio basato su IAM si aspetta SigV4 | Usa AWSV4SignerAuth da opensearch-py |
FAQ
Funziona con Wazuh?
Sì. L’indicizzatore Wazuh è basato su OpenSearch. Gli avvisi solitamente si trovano in wazuh-alerts-*, e la linea di log originale in full_log.
Devo esportare tutto in _source?
Solo se necessario. Le pipeline spesso aggiungono decine di campi di arricchimento. Ridurre a tempo, host e il messaggio grezzo mantiene i file piccoli e i caricamenti veloci.