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)
ubuntu 18.04 Elasticsearch 7.4 Kibana 7.4
sudo pip3 install python-geohash
sudo pip3 install geoip2
sudo pip3 install elasticsearch
sudo pip3 install pytz
Laden Sie "GeoLite 2 City (MAXMIND DB-Version)" von der MAXMIND-Seite herunter MAXMIND
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 ...
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.
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]})
Das Verfahren, um geoip_map in Kibana sichtbar zu machen, ist einfach ...
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.
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