Remarque pour tracer l'adresse IP avec Kibana + Elastic Search

Objectif

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)

environnement

ubuntu 18.04 Elasticsearch 7.4 Kibana 7.4

Installation des modules à utiliser

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

Téléchargez la carte pour geoip2

Téléchargez "GeoLite 2 City (version MAXMIND DB)" depuis la page MAXMIND MAXMIND

Jetez-vous dans Elasticsearch

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 ...

Créer un index

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é.

Entrée de données


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]}) 

Dessin à Kibana

La procédure pour rendre geoip_map visible dans Kibana est simple ...

Créer un modèle d'index

É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.

Créer une visualisation

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

Remarque pour tracer l'adresse IP avec Kibana + Elastic Search
Convertir l'adresse IP en décimal
Comment utiliser le japonais avec le tracé NLTK
Pour obtenir une adresse IP locale par programme
Essayer de gérer SQLite3 avec Python [Note]
Surveillance du trafic avec Kibana, ElasticSearch et Python
Traduire la plage d'adresses IP en un autre sous-réseau 1: 1
Je t'ai fait exprimer la fin de l'adresse IP avec L Chika
Envoyez un email à l'adresse de Spushi avec python
Firewalld ajouté à Amazon Linux 2 (restrictions d'adresse IP)
Comment éviter BrokenPipeError avec la note DataLoader de PyTorch
Comment afficher des images en continu avec matplotlib Memo
Je souhaite utiliser ip vrf avec SONiC
Script Python pour obtenir des informations de note avec REAPER
Précautions lors de l'exécution de la régression logistique avec Statsmodels
Changer les paramètres IP en ACL de conoha avec python
Note de lecture: Introduction à l'analyse de données avec Python
Entrez les données Zaim dans Amazon Elasticsearch Service avec Logstash
[Python] Comment dessiner un diagramme de dispersion avec Matplotlib