Freitag, 4. Februar 2022

Winlogbeat 7.15 mit OpenSearch

 Irgendwie habe ich nie das XPack von Elastic Search verstanden. Unter welchen Umständen kann man das nun kostenlos verwenden, etc.

Da waren die Security Plugins von OpenDistro einfach nützlich und klar. Nun ist OpenDistro inzwischen OpenSearch und Elastic versucht im Überlebenskampf gegen Amazon seine Geschäftsgrundlage mit proprietären Lizenzen zu sichern. Als Nebeneffekt werden künstlich die APIs gegen die die Beats Module laufen auf Elastic-Konformität geprüft.

Die Dashboards, Visualizations, Searches sollten allerdings weitestgehend unabhängig von Elastic Search und Kibana sein (zumindest innerhalb der Version 7). Deshalb habe ich mit ein paar Tricks die aktuellen JSON Dateien von Winlogbeat extrahiert und in OpenDashboards hochgeldaten.

Mein Setup ist:

  • WinlogBeat 7.15
  • Fluentd 1.14
  • Opensearch 1.2.4
  • OpenDashboards 1.2.0

Dashboard, Searches und Visualizations liegen bei Winlogbeat im ordner kibana/7/ als JSON Dateien. OpenSearch kann vernünftig nur NDJSON Dateien importieren, wobei es sich um Zusammengefügte JSON Dateien pro Zeile handelt.

Mit dem JSON Allzwecktool jq kann man die vorhandenen JSON Dateien recht einfach umwandeln:

jq -c '.attributes.kibanaSavedObjectMeta.searchSourceJSON = "\( .attributes.kibanaSavedObjectMeta.searchSourceJSON )"' \
kibana/7/search/*.json > search.ndjson
jq -c '.attributes.kibanaSavedObjectMeta.searchSourceJSON = "\( .attributes.kibanaSavedObjectMeta.searchSourceJSON )" | .attributes.visState = "\( .attributes.visState )" | .attributes.uiStateJSON = "\( .attributes.uiStateJSON )"' \
kibana/7/visualization/*.json | sed 's/7\.14/7.10/g' > visualization.ndjson

Die Dashboard Dateien waren etwas störrischer, dafür brauchte ich eine Schleife:

rm -f dashboard.ndjson
for I in kibana/7/dashboard/*.json ; do
	if [ $(grep -c '\\\\\\' "$I") -gt 0 ] ; then
		jq -c '.attributes.optionsJSON = (.attributes.optionsJSON | fromjson) | .attributes.kibanaSavedObjectMeta.searchSourceJSON = ( .attributes.kibanaSavedObjectMeta.searchSourceJSON | fromjson ) | .attributes.panelsJSON = ( .attributes.panelsJSON | fromjson )' \ 
        "$I" | sed 's/7\.14\.0/7.9.3/g' >> dashboard.ndjson
	else
		jq -c '.' "$I" | sed -E -e 's/7\.14\.0/7.9.3/g' -e 's/"name":"[^:]*:/"name":"/g' >> dashboard.ndjson
	fi
done

Zwei entscheidende Komponenten können direkt aus Winlogbeat.exe exportiert werden:

Das Index-Pattern für OpenDashboards:

./winlogbeat.exe export index-pattern | jq -c '.' > index-pattern.ndjson

Unabdingbar ist das index-template für OpenSearch (FluentD erstellt bei mir Indexes mit dem Namen winlogbeat-YYYYMMDD). Einige Typen gibt es nicht bzw. heißen sie anders, deshalb ist am Template ein wenig Zusatzaufwanderforderlich.

./winlogbeat.exe export template | sed -e 's/"winlogbeat-.*"/"winlogbeat-*"/' \
 -e 's/flattened/keyword/g' -e 's/constant_keyword/keyword/g' | \
  jq '.template = { "settings": .settings, "mappings": .mappings } | .priority = .order | del( .mappings ) | del( .settings ) | del( .order )' \
   > index-template.json

Anschließend können die gewonnenen Dateien in OpenSearch bzw. OpenDashboards importiert werden. Z.B. direkt per cURL:

curl -u admin:admin -X POST http://localhost:9200/_index_template/winlogbeat \
 -H 'content-type: application/json' -d @index-template.json
curl -u admin:admin -X POST http://localhost:5601/api/saved_objects/_import?overwrite=true \
 -H "kbn-xsrf: true" --form file=@index-pattern.ndjson
curl -u admin:admin -X POST http://localhost:5601/api/saved_objects/_import?overwrite=true \
 -H "kbn-xsrf: true" --form file=@search.ndjson
curl -u admin:admin -X POST http://localhost:5601/api/saved_objects/_import?overwrite=true \
 -H "kbn-xsrf: true" --form file=@visualization.ndjson
curl -u admin:admin -X POST http://localhost:5601/api/saved_objects/_import?overwrite=true \
-H "kbn-xsrf: true" --form file=@dashboard.ndjson

Nachtrag:

Da Fluentd für alle Quellen täglich einen neuen Index erstellt (ähnlich wie Logstash), habe ich eine Index-Policy erstellt, die alle Indexes löscht, die älter als 30 Tage sind:

{
    "policy": {
        "policy_id": "Cleanup",
        "description": "Cold after 1d, delete after 30d",
        "last_updated_time": 1620255437480,
        "schema_version": 1,
        "error_notification": null,
        "default_state": "hot",
        "states": [
            {
                "name": "hot",
                "actions": [
                    {
                        "replica_count": {
                            "number_of_replicas": 1
                        }
                    }
                ],
                "transitions": [
                    {
                        "state_name": "cold",
                        "conditions": {
                            "min_index_age": "1d"
                        }
                    }
                ]
            },
            {
                "name": "cold",
                "actions": [
                    {
                        "read_only": {}
                    }
                ],
                "transitions": [
                    {
                        "state_name": "delete",
                        "conditions": {
                            "min_index_age": "30d"
                        }
                    }
                ]
            },
            {
                "name": "delete",
                "actions": [
                    {
                        "delete": {}
                    }
                ],
                "transitions": []
            }
        ],
        "ism_template": [
            {
                "index_patterns": [
                    "*"
                ],
                "priority": 100,
                "last_updated_time": 1620255078516
            }
        ]
    }
}

Keine Kommentare:

Kommentar veröffentlichen