Hinweis zum Zeichnen der IP-Adresse mit Kibana + Elastic Search

Zweck

Ich verwende verschiedene Server, möchte aber zeichnen, aus welchem Land sie zugreifen! (Mit Elasticsearch + Kibana + Python3) Aber ich benutze kein Logstash (ich kann es aus irgendeinem Grund nicht benutzen) ... (normalerweise nicht)

Umgebung

ubuntu 18.04 Elasticsearch 7.4 Kibana 7.4

Installation der zu verwendenden Module

sudo pip3 install python-geohash
sudo pip3 install geoip2
sudo pip3 install elasticsearch
sudo pip3 install pytz

Laden Sie die Karte für geoip2 herunter

Laden Sie "GeoLite 2 City (MAXMIND DB-Version)" von der MAXMIND-Seite herunter MAXMIND

Werfen Sie in Elasticsearch

Beispiel für eine Protokolldatei

DATE,IP,SRC_PORT,DST_PORT,SIZE,DATA
2019/11/05 19:00:00,1.2.3.4,44455,80,180,474554202F20485454502F312E31 ・ ・ ・
2019/11/05 19:00:00,2.3.4.5,44456,80,180,474554202F20485454502F312E31 ・ ・ ・
・ ・ ・

Ich möchte diese IP als Standortinformation auf Kibana darstellen ...

Index erstellen

Geohash muss den Typ als "" type ":" geo_point "" angeben, damit er als Standortinformationen in Kibana erkannt wird. Gehen Sie zu Kibana und führen Sie die folgende Abfrage auf dem DevTool-Bildschirm aus.


PUT geoip_map
{
  "mappings": {
    "properties": {
      "add_time": {
        "type": "date",
        "format": "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
      },
      "data": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "geohash": {
        "type": "geo_point"
      },
      "ip": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "latitude": {
        "type": "float"
      },
      "longitude": {
        "type": "float"
      },
      "src_port": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "dst_port": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "size": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}

Der Container ist jetzt fertig.

Dateneingabe


import pytz
import geoip2.database
import geohash
from datetime import *
from elasticsearch import Elasticsearch

ELASTIC_HOST = "127.0.0.1"

elasticobj = Elasticsearch(ELASTIC_HOST + ":9200")

with open("logfile.txt","r") as f:
    logdata = f.read()
    loglst = logdata.replace('\r','').split('\n')

reader = geoip2.database.Reader('GeoLite2-City.mmdb')

for line in loglst:
    cols = line.split(',')

    #Stellen Sie Informationen wie Breiten- und Längengrade mit geoip2 ein
    resp = reader.city(cols[1])

    #Geohash-Genauigkeit berechnen ist standardmäßig
    str_geohash = geohash.encode(resp.location.latitude,resp.location.longitude)

    #Sie müssen sich nicht bei Elasticsearch registrieren, aber dieser Code speichert auch Rohdaten für Breiten- und Längengrade.
    #Ändern Sie diese Werte tatsächlich gemäß den tatsächlichen Protokolldaten
    elasticobj.index(index="geoip_map",doc_type="_doc",body={"geohash":str_geohash,"latitude":resp.location.latitude,"longitude":resp.location.longitude,"add_time":cols [0].replace("-"," "),"ip":cols [1],"src_port":cols [2],"dst_port":cols [3],"size":cols [4],"data":cols [5]}) 

Zeichnen in Kibana

Das Verfahren, um geoip_map in Kibana sichtbar zu machen, ist einfach ...

Erstellen eines Indexmusters

Schreiben Sie "geoip *" usw. an die Stelle, an der Management ⇒ Indexmuster usw. geschrieben ist, und klicken Sie auf die Schaltfläche Erstellen

Ich denke, dass das Feld mit Datums- und Uhrzeitinformationen automatisch erkannt wird. Wählen Sie also add_time aus und klicken Sie auf die Schaltfläche Erstellen.

Jetzt können Sie die Daten auf dem Discover-Bildschirm sehen.

Visualisierung erstellen

Klicken Sie im nächsten Bildschirm auf Karten (Sie können dies auch mit RegionMap und CoodinateMap tun).

Drücken Sie auf Ebene hinzufügen und wählen Sie das Element aus, das bereits die Verwendung von Index für Kibana angibt. Wählen Sie dort, wo Indexmuster auswählen, das mit "geoip *" usw. erstellte Muster aus. (Wenn Sie ein Standortfeld angeben müssen, wählen Sie das Geohash-Feld aus.)

Sie können so zeichnen.

Vorerst ist es fertig! Es scheint, dass Sie eine coolere Karte verwenden können, also versuchen wir es später.

Recommended Posts

Hinweis zum Zeichnen der IP-Adresse mit Kibana + Elastic Search
Konvertieren Sie die IP-Adresse in eine Dezimalzahl
Verwendung von Japanisch mit NLTK-Plot
Programmgesteuert eine lokale IP-Adresse abrufen
Versuch, SQLite3 mit Python zu handhaben [Hinweis]
Verkehrsüberwachung mit Kibana, ElasticSearch und Python
Übersetzen Sie den IP-Adressbereich 1: 1 in ein anderes Subnetz
Ich habe Sie dazu gebracht, das Ende der IP-Adresse mit L Chika auszudrücken
Senden Sie eine E-Mail mit Python an Spushis Adresse
Firewalld zu Amazon Linux 2 hinzugefügt (IP-Adressbeschränkungen)
So vermeiden Sie BrokenPipeError mit PyTorchs DataLoader Hinweis
So zeigen Sie Bilder kontinuierlich mit matplotlib Memo an
Ich möchte ip vrf mit SONiC verwenden
Python-Skript zum Abrufen von Notizinformationen mit REAPER
Vorsichtsmaßnahmen bei der Durchführung einer logistischen Regression mit Statsmodels
Ändern Sie die IP-Einstellungen mit Python in ACL von conoha
Lesehinweis: Einführung in die Datenanalyse mit Python
Geben Sie Zaim-Daten mit Logstash in den Amazon Elasticsearch Service ein
[Python] Wie zeichnet man mit Matplotlib ein Streudiagramm?