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