ElasticSearch: Création d’un Index avec PowerShell

La suite de produits ElasticSearch et Beats permettent de créer des index très facilement sans avoir à se soucier du format. Tout est fait pour nous.

Il est bien sûr possible de créer son propre index avec des données propres et je propose dans cet article de voir comment avec PowerShell.

Imaginons que nous voulons stocker dans ElasticSearch des informations relatives à un folder. Par exemple, le chemin complet du répertoire, ainsi que le groupe qui y à accès, de quel domaine, avec quel droit, et pourquoi pas le type de groupe.

Dans notre cas, les données à créer au format json ont le format suivant:

A noter l’attribut @timestamp, il sera utilisé lors des recherches dans ElasticSearch, c’est ici la date et l’heure à laquelle la donnée est insérée dans ElasticSearch.

Il faut qu’il soit au format utilisé par ElasticSearch et on peut le créer ainsi:

Les autres données proviennent d’autres scripts qui ont pour but d’aller chercher ces information en utilisant Get-Acl, Get-ChildItem, ou toute autre méthode.

Nous allons créer le hashtable qui nous servira à générer la donnée au format JSON ainsi:

Une fois $body créé on pourra le transformer en JSON ainsi:

Dernière conversion, il faut absolument que le JSON soit au format UTF8 sinon nous allons avoir des problèmes avec les accents et autres caractères complexes.

 

Une donnée dans ElasticSearch est toujours insérée en mentionnant trois propriétés:

  • Le nom de l’index, par exemple Shares-2016.10.30, ce qui veut dire Shares est la collection des index du même type, suivi de la date de création de l’index.
  • Le Type d’objet à insérer, dans notre cas par exemple Share
  • un identifiant unique optionnel, il vaut mieux d’ailleurs ne pas le mentionner, ainsi ElasticSearch va le créer pour nous.

La ressource URL que nous pouvons créer est alors:

L’adresse à utiliser pour envoyer nos données devient donc:

$server est le serveur où ElasticSearch est installé et $port est par défaut 9200, port de ElasticSearch.

Si nous utilisons des credentials avec ElasticSearch (avec Shield par exemple), nous devons créer un header:

Nous pouvons maintenant utiliser Invoke-RestMethod et envoyer nos données:

 

Nous pouvons faire du tout une cmdlet, la voici:

Bonne indexation!