Importer des données externes dans votre système ExtraHop
L'API ExtraHop Open Data Context vous permet d'importer des données d'un hôte externe dans la table des sessions de votre capteur ExtraHop. Ces données peuvent ensuite être utilisées pour créer des mesures personnalisées que vous pouvez ajouter aux graphiques ExtraHop, stocker dans des enregistrements sur un magasin d'enregistrements ou exporter vers un outil d'analyse externe.
Après avoir activé l'API Open Data Context sur votre capteur, vous pouvez importer des données en exécutant un script Python à partir d'un client memcached sur un hôte externe. Ces données externes sont stockées dans des paires clé-valeur et sont accessibles par l'écriture d'un déclencheur.
Par exemple, vous pouvez exécuter un script client memcached sur un hôte externe pour importer des données de charge CPU dans la table de session de votre capteur. Ensuite, vous pouvez écrire un déclencheur qui accède à la table de session et commute les données en tant que métriques personnalisées.
Avertissement : | La connexion entre l'hôte externe et le système ExtraHop n'est pas cryptée et ne doit pas transmettre d'informations sensibles. |
Activer l'API Open Data Context
Vous devez activer l'API Open Data Context sur votre capteur avant qu'il ne puisse recevoir des données d'un hôte externe.
Before you begin
- Vous devez disposer de privilèges de configuration ou d'administration du système et des accès pour accéder à la page Administration de votre système ExtraHop.
- Si vous disposez d'un pare-feu, vos règles de pare-feu doivent permettre aux hôtes externes d'accéder aux ports TCP et UDP spécifiés. Le numéro de port par défaut est 11211.
Écrire un script Python pour importer des données externes
Avant de pouvoir importer des données externes dans la table des sessions de votre capteur, vous devez écrire un script Python qui identifie votre capteur et contient les données que vous souhaitez importer dans la table des sessions. Le script est ensuite exécuté à partir d'un client memcached sur l'hôte externe.
Cette rubrique fournit des conseils syntaxiques et des bonnes pratiques pour l'écriture du script Python. Un exemple de script complet est disponible à la fin de ce guide.
Before you begin
Assurez-vous que vous disposez d'un client memcached sur la machine hôte externe. Vous pouvez installer n'importe quelle bibliothèque client memcached standard, telle que http://libmemcached.org/ ou https://pypi.python.org/pypi/pymemcache. Le capteur agit comme un serveur memcached version 1.4.
Voici quelques considérations importantes concernant l'API Open Data Context :- L'API Open Data Context prend en charge la plupart des commandes memcached, telles que get, set et increment.
- Toutes les données doivent être insérées sous forme de chaînes lisibles par le capteur. Certains clients memcached tentent de stocker des informations de type dans les valeurs. Par exemple, la bibliothèque memcache de Python stocke les flottants en tant que valeurs décapées, ce qui entraîne des résultats non valides lors de l'appel à Session.lookup dans les déclencheurs. La syntaxe Python suivante insère correctement un flottant sous la forme d'une chaîne
: mc.set("my_float", str(1.5)
) - Bien que les valeurs de la table de session puissent être d'une taille pratiquement illimitée, l'enregistrement de valeurs importantes dans la table de session peut entraîner une dégradation des performances. En outre, les mesures transmises au magasin de données doivent être inférieures ou égales à 4096 octets, et des valeurs de table surdimensionnées peuvent donner lieu à des mesures tronquées ou imprécises.
- Les rapports statistiques de base sont pris en charge, mais les rapports statistiques détaillés par taille d'élément ou préfixe de clé ne sont pas pris en charge.
- La définition de l'expiration des éléments lors de l'ajout ou de la mise à jour d'éléments est prise en charge, mais l'expiration en bloc par le biais de la commande flush n'est pas prise en charge.
- Les clés expirent toutes les 30 secondes. Par exemple, si une clé est définie pour expirer dans 50 secondes, elle peut prendre entre 50 et 79 secondes pour expirer.
- Toutes les clés définies à l'aide de l'API Open Data Context sont exposées par le biais de l'événement déclencheur SESSION_EXPIRE au fur et à mesure de leur expiration. Ce comportement est différent de celui de l'API Trigger, qui n'expose pas les clés arrivant à expiration par le biais de l'événement SESSION_EXPIRE.
Écrire un déclencheur pour accéder aux données importées
Vous devez écrire un déclencheur avant de pouvoir accéder aux données de la table de session.
Before you begin
Cette rubrique suppose une certaine expérience de l'écriture de déclencheurs. Si vous n'êtes pas familiarisé avec les déclencheurs, consultez les rubriques suivantes :Que faire ensuite
Vous devez affecter le déclencheur à un appareil ou à un groupe d'appareils. Le déclencheur ne s'exécutera pas tant qu'il n'aura pas été affecté.Exemple d'API Open Data Context
Dans cet exemple, vous apprendrez à vérifier le score de réputation et le risque potentiel des domaines qui communiquent avec les appareils de votre réseau. L'exemple de script Python vous montre tout d'abord comment importer des données de réputation de domaine dans la table de session de votre capteur. Ensuite, l'exemple de script de déclenchement vous montre comment vérifier les adresses IP sur les événements DNS par rapport aux données de réputation de domaine importées et comment créer une métrique personnalisée à partir des résultats.
Exemple de script Python
Ce script Python contient une liste de 20 noms de domaine populaires et peut référencer des scores de réputation de domaine obtenus à partir d'une source telle que DomainTools.
Ce script est une API REST qui accepte une opération POST où le corps est le nom de domaine. Lors d'une opération POST, le client memcached met à jour la table de session avec les informations sur le domaine.
#!/usr/bin/python import flask import flask_restful import memcache import sqlite3 top20 = { "google.com", "facebook.com", "youtube.com", "twitter.com", "microsoft.com", "wikipedia.org", "linkedin.com", "apple.com", "adobe.com", "wordpress.org", "instagram.com", "wordpress.com", "vimeo.com", "blogspot.com", "youtu.be", "pinterest.com", "yahoo.com", "goo.gl", "amazon.com", "bit.ly} dnsnames = {} mc = memcache.Client(['10.0.0.115:11211']) for dnsname in top20 : dnsnames[dnsname] = 0.0 dbc = sqlite3.Connection('./dnsreputation.db') cur = dbc.cursor() cur.execute('select dnsname, score from dnsreputation;') for row in cur : dnsnames[row[0]] = row[1] dbc.close() app = flask.Flask(__name__) api = flask_restful.Api(app) class DnsReputation(flask_restful.Resource) : def post(self) : dnsname = flask.request.get_data() #print dnsname mc.set(dnsname, str(dnsnames.get(dnsname, 50.0)), 120) return 'ajouté à la table des sessions' api.add_resource(DnsReputation, '/dnsreputation') if __name__ == '__main__' : app.run(debug=True,host='0.0.0.0')
Exemple de script de déclenchement
Cet exemple de script déclencheur canonise (ou convertit) les adresses IP renvoyées par les événements DNS en noms de domaine, puis vérifie le domaine et son score de réputation dans la table des sessions. Si la valeur du score est supérieure à 75, le déclencheur ajoute le domaine à un conteneur d'application appelé "DNSReputation" en tant que métrique détaillée appelée "Mauvaise réputation DNS".
//Configurer les paramètres de déclenchement suivants : //Nom : DNSReputation //Debugging : Activé //Evénements : DNS_REQUEST, DNS_RESPONSE if (DNS.errorNum != 0 || DNS.qname == null || DNS.qname.endsWith("in-addr.arpa") || DNS.qname.endsWith("local") || DNS.qname.indexOf('.') == -1 ) { // erreur ou null ou recherche inversée, ou recherche de nom local return return ; } //var canonicalname = DNS.qname.split('.').slice(-2).join('.') ; var canonicalname = DNS.qname.substring(DNS.qname.lastIndexOf('.', DNS.qname.lastIndexOf('.')-1)+1) //debug(canonicalname) ; /Recherche de ce nom DNS dans la table de session var score = Session.lookup(canonicalname) if (score === null) { // Envoyer au service pour la recherche Remote.HTTP("dnsrep").post({path : "/dnsreputation", payload : canonicalname}) ; } else { debug(canonicalname + ':' +score) ; if (parseFloat(score) > 75) { //Créer une application dans le système ExtraHop et ajouter des métriques personnalisées //Note : L'application n'est pas affichée dans le système ExtraHop après la //requête initiale, mais elle est affichée après les requêtes suivantes. Application('DNSReputation').metricAddDetailCount('Bad DNS reputation', canonicalname + ':' + score, 1) ; } }
Nous vous remercions pour vos commentaires. Pouvons-nous vous contacter pour vous poser des questions complémentaires ?