Mise en place de Splunk sur des logs LDAP

Dans une architecture LDAP de production, on met généralement en place plusieurs instances d'annuaires, qui sont répliquées entre elles. L'inconvénient dans ce cas est que les logs sont répartis sur chaque serveur, et qu'il devient difficile d'avoir une vue d'ensemble des opérations.

Il existe cependant des solutions de centralisation, aggrégation et visualisation de données. Les plus connues étant Splunk et ELK.

Splunk est une solution permettant la centralisation, l'agrégation et l'analyse de données.
On peut la comparer à la stack ELK (ElasticSearch / LogStashs / Kibana). A la différence de ELK, c'est une solution propriétaire. Il existe cependant une version gratuite, limitée à 500 Mo / jour.

La tarification s'effectue en fonction du volume de Go indexés par jour (de l'ordre de 1000 $ / Go pour un an).

Installation de Splunk

Récupérer le tgz (ou le rpm selon le cas). Il faut pour cela s'enregistrer sur le site (https://www.splunk.com/en_us/download.html).

tar zxf /xchange/Software/splunk-6.6.3-e21ee54bc796-Linux-x86_64.tgz -C /opt/splunk

L'installation est auto-suffisante. Pas de java à installer, pas de base de données. C'est à mon sens une des forces par rapport à ELK, qui demande plus d'efforts pour la mise en place.

Création d'un index

Par défaut, toutes les données vont dans un index unique, main. On peut cependant avoir des index différents selon les données que l'on veut analyser, notamment pour gagner en souplesse dans la gestion de l'espace disque ou avoir des durées de rétention différentes.

Les actions sont à faire sur le serveur Splunk principal (indexer). Plusieurs options possibles :
Via la console Web, dans Settings / Indexes
Cliquer sur New Index
Entrer un nom, la taille et éventuellement les répertoires

En ligne de commande

splunk add index opends

 

Via le fichier indexes.conf. Ajouter un fichier dans $SPLUNK_HOME/etc/system/local :

[opends]
homePath   = $SPLUNK_DB/opends/db
coldPath   = $SPLUNK_DB/opends/colddb
thawedPath = $SPLUNK_DB/opends/thaweddb
tstatsHomePath = volume:_splunk_summaries/opends/datamodel_summary
maxMemMB = 20
maxConcurrentOptimizes = 6
maxHotIdleSecs = 86400
maxHotBuckets = 5
maxDataSize = auto

Note : certains paramètres ne sont accessibles qu'en modifiant le fichier indexes.conf

Autoriser la réception

Si on veut utiliser une instance Splunk globale (pour centraliser des logs par exemple), il faut mettre en place une architecture avec un receiver et des forwarders

Pour autoriser la réception, via la console Web :

  • Settings / Forwarding and Receiving
  • Receive data
  • Cliquer sur New
  • entrer le port d'écoute (9997 par défaut)

 

Mise en place d'un forwarder

Installer via le tgz splunkforwarder ou le rpm

cd /opt
tar zxf splunkforwarder-6.6.3-e21ee54bc796-Linux-x86_64.tgz

ou

rpm -ivh splunkforwarder-6.6.3-e21ee54bc796-linux-2.6-x86_64.rpm 

Puis il faut paramétrer le forwarding vers le serveur / indexer Splunk :

./splunk add forward-server splunkserver.exemple.com:9997 -auth admin:changeme

Activation du démarrage au boot

Splunk fournit une commande permettant de démarrer le forwarder lors du boot.

# ./splunk enable boot-start
Init script installed at /etc/init.d/splunk.
Init script is configured to run at boot.

 

Définition des inputs

Dans le répertoire $SPLUNKFORWARDER/etc/system/local
Fichier inputs.conf :

[default]
host = ds2dj.hebinweb

[monitor:///opt/OpenDS-2.3.0/logs/access]
sourcetype = LDAP_DS_ACCESS

[monitor:///opt/OpenDS-2.3.0/logs/errors]
sourcetype = LDAP_DS_ERRORS

[monitor:///opt/opendj/logs/access]
sourcetype = LDAP_DJ_ACCESS

[monitor:///opt/opendj/logs/errors]
sourcetype = LDAP_DJ_ERRORS

Définition de l'output

Fichier outputs.conf

[tcpout]
defaultGroup = default-autolb-group

[tcpout:default-autolb-group]
server = splunkserver.exemple.com:9997

[tcpout-server://splunkserver.exemple.com:9997]

Utilisation d'un index spécifique pour la source

Sur le serveur forwarder, ajouter dans le fichier $SPLUNKHOME/etc/system/local/inputs.conf :

[monitor:///opt/OpenDS-2.3.0/logs/access]
sourcetype = LDAP_DS_ACCESS
disabled = false
index = opends

[monitor:///opt/OpenDS-2.3.0/logs/errors]
sourcetype = LDAP_DS_ERRORS
disabled = false
index = opends

[monitor:///opt/opendj/logs/access]
sourcetype = LDAP_DJ_ACCESS
index = ldap

Filtrage des events

Sur le serveur indexer, ajouter / modifier les fichiers props.conf et transforms.conf

Fichier props.conf

[LDAP_DS_ACCESS]
TRANSFORMS-null = sendToNull

[LDAP_DS_ERRORS]
TRANSFORMS-null = sendToNull

[LDAP_DJ_ACCESS]
TRANSFORMS-null = sendToNull

[LDAP_DJ_ERRORS]
TRANSFORMS-null = sendToNull

Fichier transforms.conf

[sendToNull]
REGEX=UNBIND|DISCONNECT
DEST_KEY=queue
FORMAT=nullQueue

Il faut ensuite redémarrer splunk pour prendre en compte les modifications

$SPLUNK_HOME/bin/splunk restart

 

Purge les données des index

Dans la fenêtre de recherche Splunk, on peut "piper" le verbe delete avec la recherche. Par exemple

index=ldap UNBIND |delete

Note : le compte utilisé doit avoir le rôle can_delete. Par défaut, même le compte admin ne dispose pas d'un tel droit. En fait, ceci ne supprime pas les données de l'index, mais l'opération delete marque les données comme "non cherchables". Pour supprimer les données, il faut lancer une opération sur l'indexer. Par contre ceci supprime toutes les données de l'index. A utiliser avec précaution, par exemple sur un index de test.

$SPLUNK_JHOME/bin/splunk stop
$SPLUNK_JHOME/bin/splunk clean eventdata -index ldap
This action will permanently erase all events from the index 'ldap'; it cannot be undone.
Are you sure you want to continue [y/n]?

Configuration Splunk pour les logs Sun / Oracle DSEE

Les logs d'accès de l'annuaire DSEE (Directory Server Enterprise Edition) sont très verbeux par rapport aux besoins d'analyse.

Par exemple, sur un fichier de 200 Mo, représentant 1 865 484 lignes, on a quasiment 80% de lignes composées des actions suivantes :

  • RESULT err=0 : la requête est correcte...
  • EXT oid=x.x. : logs de la réplication, extension interne de l'annuaire, pas exploitable
  • UNBIND : déconnexions
  • closed / closing : fermeture des connexions LDAP

Il est donc possible de définir une REGEX de transformations pour soulager l'indexer.
Notre fichier transforms.conf est le suivant :

[setnull]
REGEX=EXT\ oid|closed|UNBIND|closing|err=0
DEST_KEY=queue
FORMAT=nullQueue

Le fichier props.conf étant :

[LDAP_DATA_ACCESS]
TRANSFORMS-null=setnull

[LDAP_ADM_ACCESS]
TRANSFORMS-null=setnull

 

Catégorie