Extrae documentos con la API _search, o deja que un script corto de Python los recorra con helpers.scan. Si tu canal mantuvo la línea de registro original, generalmente en message o event.original, extrae solo ese campo y obtén los registros en bruto de vuelta. OpenSearch Dashboards puede generar informes a partir de búsquedas guardadas, pero no en un formato que LogTotal lea hoy.
OpenSearch respalda muchas SIEMs caseras y plataformas de registros, incluyendo Amazon OpenSearch Service y el indexador de Wazuh. Prime Core tiene 23,466 reglas de detección para OpenSearch, mapeadas a 671 técnicas de MITRE ATT&CK. A continuación se muestra cómo obtener un segmento limpio de datos, sanitizarlo e investigarlo gratuitamente en LogTotal.
Antes de empezar
Permisos. Con el plugin de seguridad habilitado, tu rol necesita acceso de lectura en el patrón del índice: el grupo de acciones de lectura, o al menos indices:data/read/search* e indices:data/read/scroll*. En Amazon OpenSearch Service, eso es un usuario con control de acceso detallado o credenciales IAM con firma SigV4.
Encuentra los campos correctos. Los patrones de índice difieren entre canales. Verifica un documento y el mapeo antes de que escribas una consulta:
GET logs-*/_search?size=1
GET logs-*/_mapping
Está buscando el campo de tiempo (@timestamp o timestamp) y, idealmente, un campo que contenga la línea original (message, event.original, full_log en Wazuh).
Cuenta primero. Ejecuta GET logs-*/_count con la misma consulta para ver lo que estás a punto de extraer.
Los siguientes comandos siguen la documentación de OpenSearch 2.x, revisada en octubre de 2026.
Opción 1: Python con opensearch-py (recomendado)
helpers.scan maneja el paginado y se limpia a sí mismo. Instala opensearch-py, luego:
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")
Para obtener líneas en bruto en lugar de documentos, escribe hit[«_source»].get(«message», «») en lugar de toda la _source. Para mantener el archivo pequeño, añade «_source»: [«@timestamp», «host.name», «message»] a la consulta.
Opción 2: curl para exportaciones pequeñas
Para hasta 10,000 documentos, una solicitud es suficiente:
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 es la ventana de resultado máximo predeterminada del índice. Más allá de eso, la solicitud falla, y deseas la Opción 1, o un punto en el tiempo (PIT) con search_after si prefieres scriptarlo tú mismo.
Paso 3: Cargar, sanitizar y revisar en LogTotal
- Cargar. Abre logtotal.com y suelta el archivo .jsonl.
- Sanitizar. Revísalo antes de continuar.
- Revisar.
Cuando algo sale mal
| Síntoma | Causa probable | Fix |
|---|---|---|
| security_exception / 403 | El rol carece de permisos de búsqueda o scroll | Solicita lectura en el patrón del índice |
| El resultado es demasiado grande | Más de 10,000 aciertos en una solicitud | Usa helpers.scan o PIT con search_after |
| Cero hits, pero los datos están ahí | Nombre del campo de tiempo incorrecto, o un error de zona horaria | Revisa el mapeo; utiliza timestamps Z explícitos |
| No se encontró el contexto de búsqueda | El scroll expiró entre páginas | Pasa scroll=»5m» a helpers.scan; usa páginas más pequeñas |
| Errores de firma en Amazon OpenSearch Service | El dominio basado en IAM espera SigV4 | Usa AWSV4SignerAuth de opensearch-py |
FAQ
¿Funciona esto para Wazuh?
Sí. El indexador de Wazuh está basado en OpenSearch. Las alertas usualmente están en wazuh-alerts-*, y la línea de registro original en full_log.
¿Debería exportar todo en _source?
Solo si lo necesitas. Los canales a menudo agregan docenas de campos de enriquecimiento. Recortar al tiempo, host y el mensaje en bruto mantiene los archivos pequeños y las cargas rápidas.