Benutzer-Werkzeuge

Webseiten-Werkzeuge


elasticsearch

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
elasticsearch [2025/03/27 11:15]
jango [Bash mit Scroll]
elasticsearch [2025/04/16 14:47] (aktuell)
jango
Zeile 1: Zeile 1:
 [[https://www.elastic.co/de/elasticsearch|Elasticsearch]] ist eine Open-Source-Such- und Analyselösung in [[coding:java|Java]], die hauptsächlich für das **Durchsuchen und Analysieren großer Mengen von Daten in Echtzeit** verwendet wird. Es wurde ursprünglich von der Firma Elastic entwickelt und ist ein wichtiger Bestandteil des sogenannten [[elk-stack|ELK-Stacks]] (Elasticsearch, [[Logstash]] und [[Kibana]]), der häufig zur Verarbeitung und Visualisierung von Logdaten eingesetzt wird. Elasticsearch **basiert auf Apache Lucene**, einer leistungsstarken, Open-Source-Textsuchbibliothek.  [[https://www.elastic.co/de/elasticsearch|Elasticsearch]] ist eine Open-Source-Such- und Analyselösung in [[coding:java|Java]], die hauptsächlich für das **Durchsuchen und Analysieren großer Mengen von Daten in Echtzeit** verwendet wird. Es wurde ursprünglich von der Firma Elastic entwickelt und ist ein wichtiger Bestandteil des sogenannten [[elk-stack|ELK-Stacks]] (Elasticsearch, [[Logstash]] und [[Kibana]]), der häufig zur Verarbeitung und Visualisierung von Logdaten eingesetzt wird. Elasticsearch **basiert auf Apache Lucene**, einer leistungsstarken, Open-Source-Textsuchbibliothek. 
  
-Siehe auch [[OpenSearch]]+Siehe auch [[OpenSearch]], [[Wazuh]] 
 + 
 +<code> 
 +
 +    "query": {  
 +        "match_all": {}  
 +    }, 
 +    "sort": [{ "@timestamp": "asc" }] 
 +
 +</code> 
 + 
 +<code> 
 +#Delete datastream 
 +curl -X DELETE "https://172.21.0.134:9200/_data_stream/test-vie-srv-ex01" 
 + 
 +# find all agents 
 +# windows 
 +curl -X GET "https://172.21.0.134:9200/winlogbeat-8.17.4/_search?pretty" --insecure -u "xxxxxxx:xxxxxx" -d "{\"size\":0,\"aggs\":{\"unique_agents\":{\"terms\":{\"field\":\"agent.name\",\"size\":10000}}}}" -H "Content-Type:application/json" 
 +# linux 
 +curl -X GET "https://172.21.0.134:9200/winlogbeat-8.17.4/_search?pretty" --insecure -u "xxxxxxx:xxxxxx" -d '{"size":0,"aggs":{"unique_agents":{"terms":{"field":"agent.name","size":10000}}}}' -H "Content-Type:application/json" | jq -r '.aggregations.unique_agents.buckets[] | "\(.key)"' 
 +</code>
  
 [[https://www.elastic.co/de/what-is/open-x-pack|X-Pack]] ist eine Plugin-Suite und bietet eine Sammlung von kommerziellen Erweiterungen und Funktionen, um die Fähigkeiten von Elasticsearch zu erweitern. **X-Pack bietet verschiedene Module in den Bereichen Sicherheit, Überwachung, Reporting und [[machine_learning|maschinelles Lernen]]**. [[https://www.elastic.co/de/what-is/open-x-pack|X-Pack]] ist eine Plugin-Suite und bietet eine Sammlung von kommerziellen Erweiterungen und Funktionen, um die Fähigkeiten von Elasticsearch zu erweitern. **X-Pack bietet verschiedene Module in den Bereichen Sicherheit, Überwachung, Reporting und [[machine_learning|maschinelles Lernen]]**.
 +
 +=====Service=====
 +
 +Als Service einrichten: Im Ordner elasticsearch/bin gibt es das Script elasticsearch-service.bat.
 +<code>
 +elasticsearch-service.bat install
 +elasticsearch-service.bat start
 +elasticsearch-service.bat stop
 +elasticsearch-service.bat remove
 +</code>
  
 =====Shards===== =====Shards=====
Zeile 26: Zeile 56:
 =====Datatypes===== =====Datatypes=====
  
-  * **Text**: Wird für Volltextsuche verwendet. Inhalte werden analysiert (z. B. in Tokens zerlegt) und in einem inversen Index gespeichert. Ideal für große, durchsuchbare Textblöcke (z. B. Artikel oder Beschreibungen). +  * **Text**: Wird für Volltextsuche verwendet. Inhalte werden analysiert (z. B. in Tokens zerlegt) und in einem inversen Index gespeichert. Ideal für große, durchsuchbare Textblöcke (z. B. Artikel oder Beschreibungen). (KEIN wildcard) 
-  * **Keyword**: Eignet sich für nicht-analysierte Werte. Inhalte werden genau so gespeichert, wie sie eingegeben wurden. Geeignet für Filter, Sortierung und Aggregationen (z. B. Tags, Kategorien, IDs).+  * **Keyword**: Eignet sich für nicht-analysierte Werte. Inhalte werden genau so gespeichert, wie sie eingegeben wurden. Geeignet für Filter, Sortierung und Aggregationen (z. B. Tags, Kategorien, IDs). (wildcard)
   * **Integer**, Long, Short, Byte: Unterschiedliche Ganzzahltypen mit verschiedenen Größenbereichen.   * **Integer**, Long, Short, Byte: Unterschiedliche Ganzzahltypen mit verschiedenen Größenbereichen.
   * **Float**, **Double**: Gleitkommazahlen für präzise numerische Berechnungen.   * **Float**, **Double**: Gleitkommazahlen für präzise numerische Berechnungen.
Zeile 270: Zeile 300:
 </code> </code>
  
 +====Query Builder Module====
 +
 +<code python>
 +import json
 +
 +class ElasticsearchQueryBuilder:
 +    def __init__(self):
 +        self.query = {
 +            "query": {
 +                "bool": {
 +                    "must": [],
 +                    "should": [],
 +                    "must_not": []
 +                }
 +            }
 +        }
 +
 +    def add_condition(self, method, field, value):
 +        """
 +        Add a condition to the query.
 +        The method is one of: 'match', 'wildcard', 'term', 'range'
 +        """
 +        if method == "match":
 +            return {"match": {field: value}}
 +        elif method == "wildcard":
 +            return {"wildcard": {field: value}}
 +        elif method == "term":
 +            return {"term": {field: value}}
 +        elif method == "range":
 +            return {"range": {field: {"gte": value}}}
 +        else:
 +            raise ValueError(f"Unsupported method: {method}")
 +
 +    def build_query(self, conditions, operator="AND", sort_field=None, sort_order="asc"):
 +        """
 +        Build the query with the provided conditions, logical operator, and optional sorting.
 +        'AND' means all conditions must match, 'OR' means any condition can match.
 +        """
 +        if operator == "AND":
 +            self.query["query"]["bool"]["must"] = conditions
 +        elif operator == "OR":
 +            self.query["query"]["bool"]["should"] = conditions
 +            self.query["query"]["bool"]["minimum_should_match"] = 1
 +        else:
 +            raise ValueError("Operator must be 'AND' or 'OR'")
 +
 +        # Füge die Sortierung hinzu, falls ein Sortierfeld angegeben wurde
 +        if sort_field:
 +            self.query["sort"] = [{sort_field: {"order": sort_order}}]
 +
 +        return self.query
 +
 +    def display_query(self):
 +        """Print the generated query in a pretty JSON format."""
 +        print(json.dumps(self.query, indent=2))
 +
 +    def add_nested_condition(self, method, field, value):
 +        """
 +        Add a nested condition, creating a bool query within another bool query.
 +        """
 +        nested_condition = {
 +            "bool": {
 +                "must": [self.add_condition(method, field, value)]
 +            }
 +        }
 +        return nested_condition
 +</code>
 +
 +Usage:
 +
 +<code python>
 +from elasticsearch_query_builder import ElasticsearchQueryBuilder
 +
 +# Initialisierung des Query Builders
 +builder = ElasticsearchQueryBuilder()
 +
 +# Verschachtelte Bedingungen erstellen
 +must_conditions = []
 +must_conditions.append(builder.add_condition("match", "data.win.eventdata.authenticationPackageName", "NTLM"))
 +must_conditions.append(builder.add_condition("wildcard", "data.win.eventdata.targetUserName", "*"))
 +
 +# Eine verschachtelte "bool" Abfrage innerhalb der "must" Bedingungen
 +nested_condition = builder.add_nested_condition("term", "data.win.eventdata.lmPackageName", "NTLM V1")
 +must_conditions.append(nested_condition)
 +
 +# Die Bedingungen zur Query hinzufügen (Operator AND)
 +query = builder.build_query(must_conditions, operator="AND", sort_field="timestamp", sort_order="desc")
 +
 +# Die erzeugte Query ausgeben
 +builder.display_query()
 +</code>
 +
 +<code python>
 +# Initialisierung des Query Builders
 +builder = ElasticsearchQueryBuilder()
 +
 +# Verschachtelte Bedingungen erstellen
 +must_conditions = []
 +must_conditions.append(builder.add_condition("match", "data.win.eventdata.authenticationPackageName", "NTLM"))
 +must_conditions.append(builder.add_condition("wildcard", "data.win.eventdata.targetUserName", "*"))
 +
 +# Erste verschachtelte Bedingung
 +nested_condition_1 = builder.add_nested_condition("term", "data.win.eventdata.lmPackageName", "NTLM V1")
 +
 +# Zweite verschachtelte Bedingung
 +nested_condition_2 = builder.add_nested_condition("term", "data.win.eventdata.targetDomainName", "example.com")
 +
 +# Die verschachtelten Bedingungen zur Liste der "must" Bedingungen hinzufügen
 +must_conditions.append(nested_condition_1)
 +must_conditions.append(nested_condition_2)
 +
 +# Die Bedingungen zur Query hinzufügen (Operator AND)
 +query = builder.build_query(must_conditions, operator="AND", sort_field="timestamp", sort_order="desc")
 +
 +# Die erzeugte Query ausgeben
 +builder.display_query()
 +</code>
 +
 +<code python>
 +# Initialisierung des Query Builders
 +builder = ElasticsearchQueryBuilder()
 +
 +# Verschachtelte Bedingungen erstellen
 +must_conditions = []
 +must_conditions.append(builder.add_condition("match", "data.win.eventdata.authenticationPackageName", "NTLM"))
 +must_conditions.append(builder.add_condition("wildcard", "data.win.eventdata.targetUserName", "*"))
 +
 +# Erste verschachtelte Bedingung mit zwei "should" Bedingungen
 +nested_condition_1 = {
 +    "bool": {
 +        "should": [
 +            builder.add_condition("term", "data.win.eventdata.lmPackageName", "NTLM V1"),
 +            builder.add_condition("wildcard", "data.win.eventdata.targetDomainName", "example*")
 +        ],
 +        "minimum_should_match": 1  # Minimum eine der "should" Bedingungen muss zutreffen
 +    }
 +}
 +
 +# Zweite verschachtelte Bedingung mit zwei "should" Bedingungen
 +nested_condition_2 = {
 +    "bool": {
 +        "should": [
 +            builder.add_condition("term", "data.win.eventdata.lmPackageName", "NTLM V1"),
 +            builder.add_condition("wildcard", "data.win.eventdata.targetDomainName", "example*")
 +        ],
 +        "minimum_should_match": 1  # Minimum eine der "should" Bedingungen muss zutreffen
 +    }
 +}
 +
 +# Die verschachtelten Bedingungen zur Liste der "must" und "should" Bedingungen hinzufügen
 +should_conditions = []
 +should_conditions.append(nested_condition_1)
 +should_conditions.append(nested_condition_2)
 +
 +# Die "must"-Bedingungen und "should"-Bedingungen kombinieren
 +query = builder.build_query(must_conditions, operator="AND", sort_field="timestamp", sort_order="desc")
 +
 +# Füge die "should"-Bedingungen in den "bool" Block ein
 +query["query"]["bool"]["should"] = should_conditions
 +
 +# Die erzeugte Query ausgeben
 +builder.display_query()
 +</code>
 =====Bash===== =====Bash=====
  
 +====Scroll Query====
 +<code bash>
 +#!/bin/bash
 +
 +# Elasticsearch-Server-URL
 +ES_HOST="https://localhost:9200"
 +INDEX="wazuh-alerts*"
 +USER="admin"
 +PASS="SecretPassword"
 +
 +# Erste Suchanfrage mit Scroll
 +response=$(curl -X POST "$ES_HOST/$INDEX/_search?scroll=1m" -u "$USER:$PASS" -H "Content-Type: application/json" -d '{
 +  "size": 10,
 +  "query": {
 +    "match_all": {}
 +  }
 +}' --insecure)
 +
 +# Scroll-ID extrahieren
 +scroll_id=$(echo "$response" | jq -r '._scroll_id')
 +
 +# Anzahl der Treffer zählen
 +res_c=0
 +
 +# Loop über die Ergebnisse
 +while true; do
 +
 +    read -p "Press enter to continue"
 +
 +    # Treffer verarbeiten
 +    hits=$(echo "$response" | jq -c '.hits.hits[]?')
 +
 +    # Wenn keine Treffer mehr vorhanden sind, abbrechen
 +    if [[ -z "$hits" ]]; then
 +        break
 +    fi
 +
 +    # Treffer ausgeben
 +    echo "$hits" | while read -r hit; do
 +        #folder_path=$(echo "$hit" | jq -r '._source.FolderPath // empty')
 +        echo $hit |jq
 +        ((res_c++))
 +    done
 +
 +    # Nächste Scroll-Anfrage senden
 +    response=$(curl -X POST "$ES_HOST/_search/scroll" -u "$USER:$PASS" -H "Content-Type: application/json" -d "{
 +      \"scroll\": \"1m\",
 +      \"scroll_id\": \"$scroll_id\"
 +    }" --insecure)
 +
 +    # Neuen Scroll-ID extrahieren
 +    scroll_id=$(echo "$response" | jq -r '._scroll_id')
 +done
 +
 +# Scroll-Context aufräumen
 +curl -s -X DELETE "$ES_HOST/_search/scroll" -u "$USER:$PASS" -H "Content-Type: application/json" -d "{
 +  \"scroll_id\": \"$scroll_id\"
 +}" > /dev/null
 +
 +echo "We had $res_c results"
 +</code>
 ====Query Builder==== ====Query Builder====
  
elasticsearch.1743070512.txt.gz · Zuletzt geändert: 2025/03/27 11:15 von jango