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:09]
jango [QueryBuilder]
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 134: Zeile 164:
 =====Python===== =====Python=====
  
-====Query====+====Scroll Query====
 <code python> <code python>
 from elasticsearch import Elasticsearch from elasticsearch import Elasticsearch
Zeile 270: Zeile 300:
 </code> </code>
  
-=====Bash=====+====Query Builder Module====
  
-====Query Builder==== +<code python> 
-=====CLI=====+import json
  
-<code> +class ElasticsearchQueryBuilder: 
-elastic-search-users useradd manuel -p ToPsEcRet +    def __init__(self): 
-elasticsearch-users roles manuel -superuser +        self.query = { 
-elasticsearch-users roles manuel -r superuser+            "query":
 +                "bool":
 +                    "must": [], 
 +                    "should": [], 
 +                    "must_not": [] 
 +                } 
 +            } 
 +        } 
 + 
 +    def add_condition(self, method, field, value): 
 +        """ 
 +        Add 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> </code>
  
-=====Bash mit Scroll=====+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===== 
 + 
 +====Scroll Query====
 <code bash> <code bash>
 #!/bin/bash #!/bin/bash
Zeile 342: Zeile 526:
 echo "We had $res_c results" echo "We had $res_c results"
 </code> </code>
 +====Query Builder====
 +
 +<code bash>
 +#!/bin/bash
 +
 +add_condition() {
 +  local method="$1"
 +  local field="$2"
 +  local value="$3"
 +
 +  case "$method" in
 +    "match")
 +      echo "{\"match\": {\"$field\": \"$value\"}}"
 +      ;;
 +    "wildcard")
 +      echo "{\"wildcard\": {\"$field\": \"$value\"}}"
 +      ;;
 +    "term")
 +      echo "{\"term\": {\"$field\": \"$value\"}}"
 +      ;;
 +    "range")
 +      echo "{\"range\": {\"$field\": {\"gte\": \"$value\"}}}"
 +      ;;
 +    *)
 +      echo "Unsupported method: $method"
 +      return 1
 +      ;;
 +  esac
 +}
 +
 +add_nested_condition() {
 +  local method="$1"
 +  local field="$2"
 +  local value="$3"
 +
 +  local condition
 +  condition=$(add_condition "$method" "$field" "$value")
 +
 +  echo "{\"bool\": {\"must\": [$condition]}}"
 +}
 +
 +build_query() {
 +  local conditions="$1"
 +  local operator="$2"
 +  local sort_field="$3"
 +  local sort_order="$4"
 +
 +  local query="{\"query\": {\"bool\": {\"must\": [], \"should\": [], \"must_not\": []}}}"
 +
 +  if [[ "$operator" == "AND" ]]; then
 +    query=$(echo "$query" | jq ".query.bool.must = $conditions")
 +  elif [[ "$operator" == "OR" ]]; then
 +    query=$(echo "$query" | jq ".query.bool.should = $conditions | .query.bool.minimum_should_match = 1")
 +  else
 +    echo "Operator must be 'AND' or 'OR'"
 +    return 1
 +  fi
 +
 +  if [[ -n "$sort_field" ]]; then
 +    query=$(echo "$query" | jq ".sort = [{\"$sort_field\": {\"order\": \"$sort_order\"}}]")
 +  fi
 +
 +  echo "$query"
 +}
 +
 +display_query() {
 +  local query="$1"
 +  echo "$query" | jq .
 +}
 +</code>
 +
 +<code bash>
 +# Example
 +and_conditions=()
 +and_conditions+=("$(add_condition "match" "data.win.eventdata.authenticationPackageName" "NTLM")")
 +and_conditions+=("$(add_condition "wildcard" "data.win.eventdata.targetUserName" "*")")
 +
 +nested_condition=$(add_nested_condition "term" "data.win.eventdata.lmPackageName" "NTLM V1")
 +and_conditions+=("$nested_condition")
 +
 +and_conditions_json=$(printf "%s\n" "${and_conditions[@]}" | jq -s add)
 +
 +query=$(build_query "$and_conditions_json" "AND" "timestamp" "desc")
 +
 +display_query "$query"
 +</code>
 +=====CLI=====
 +
 +<code>
 +elastic-search-users useradd manuel -p ToPsEcRet
 +elasticsearch-users roles manuel -a superuser
 +elasticsearch-users roles manuel -r superuser
 +</code>
 +
 +
 =====Links===== =====Links=====
  
   * [[https://kruschecompany.com/de/elastic-stack-elk|Elastic Stack (ELK) Tutorial]]   * [[https://kruschecompany.com/de/elastic-stack-elk|Elastic Stack (ELK) Tutorial]]
   * [[https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html|Setting up Elasticsearch]]   * [[https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html|Setting up Elasticsearch]]
elasticsearch.1743070173.txt.gz · Zuletzt geändert: 2025/03/27 11:09 von jango