J'utilise différents serveurs, mais je veux savoir de quel pays ils accèdent! (Avec Elasticsearch + Kibana + Python3) Mais je n'utilise pas Logstash (je ne peux pas l'utiliser pour une raison quelconque) ... (normalement pas)
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
Téléchargez "GeoLite 2 City (version MAXMIND DB)" depuis la page MAXMIND MAXMIND
Exemple de fichier journal
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 ・ ・ ・
・ ・ ・
Je veux tracer cette adresse IP en tant qu'informations de localisation sur Kibana ...
Geohash doit spécifier le type comme "" type ":" geo_point "" pour qu'il soit reconnu comme information de localisation sur Kibana. Accédez à Kibana et exécutez la requête suivante sur l'écran DevTool.
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
}
}
}
}
}
}
Le conteneur est maintenant terminé.
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(',')
#Définissez des informations telles que la latitude et la longitude à l'aide de geoip2
resp = reader.city(cols[1])
#Calculer la précision geohash est par défaut
str_geohash = geohash.encode(resp.location.latitude,resp.location.longitude)
#Vous n'avez pas besoin de vous inscrire auprès d'Elasticsearch, mais ce code enregistre également des données brutes pour la latitude et la longitude.
#Modifiez en fait ces valeurs en fonction des données réelles du journal
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]})
La procédure pour rendre geoip_map visible dans Kibana est simple ...
Écrivez "geoip *" etc. à l'endroit où Management ⇒ index pattern etc. est écrit et cliquez sur le bouton Create
Je pense que le champ d'informations de date et d'heure est automatiquement détecté, alors sélectionnez add_time et cliquez sur le bouton Créer.
Vous pouvez maintenant voir les données sur l'écran de découverte.
Cliquez sur Cartes sur l'écran suivant (vous pouvez faire de même avec RegionMap et CoodinateMap)
Appuyez sur Ajouter une couche et sélectionnez l'élément qui dit déjà d'utiliser Index sur Kibana, Là où il est dit Sélectionner un modèle d'index, sélectionnez le modèle créé avec "geoip *", etc. (Si vous devez spécifier un champ d'emplacement, sélectionnez le champ geohash.)
Vous pouvez tracer comme ça.
Pour le moment, c'est terminé! Il semble que vous puissiez utiliser une carte plus fraîche, alors essayons-la plus tard.
Recommended Posts