2. La suite ELK
• Elasticsearch
o Moteur de recherche distribué basé sur Lucène
o Stockage type document
• Logstash
o Collecte/Réception de données
o Analyse/Formattage
o Stockage (vers ES)
• Kibana
o Outil de visualisation
3. Les objectifs
• Mettre en place ELK pour centraliser nos
logs (et pas que…)
• Satisfaire nos interlocuteurs
o Exploitants
o Maîtrises d’œuvre
o RSSI
o DSI
10. Premiers problèmes
• Comment ne pas éparpiller la configuration ?
• Comment gérer les serveurs non Linux
(Windows, Solaris) ?
• Les exploitants n’ont pas envie d’installer
Logstash sur tous les serveurs !
11. Quelques solutions
• Identifier des outils de collecte pour chaque
OS
o Rsyslog pour Linux
o Nxlog pour Windows et Solaris
o Filebeat ( RDV à 17h30 en Amphi A)
• Remonter des logs sans les analyser : ajout
de méta-données à la collecte
o devient
07/03/2016 16:15:04.654 Thread-522 [INFO ] c.c.m.d.i.InterfaceImpl.rechercher (126) : appel OK
METAS:fmt=JAVA,path=/var/log/breizhcamp/application.log|||07/03/2016 16:15:04.654 Thread-522
[INFO ] c.c.m.d.i.InterfaceImpl.rechercher (126) : appel OK
18. C’est là que le RSSI dit « Stop ! »
• « Je ne veux pas de flux sortant des DMZ, ni
des zones de sécurité »
19. Une solution
• Ajout d’un tampon pour inverser la logique du
flux
• Ajout de nouvelles méta-données
o Host
o Flag multi-ligne pour reconstituer les événements dès le
tampon (stack-trace Java)
METAS:host=my-server,ml=y,fmt=JAVA,path=/var/log/breizhcamp/application.log|||07/03/2016
16:15:04.654 Thread-522 [INFO ] c.c.m.d.i.InterfaceImpl.rechercher (126) : appel OK
20. Configuration Logstash tampon (1/2)
• /etc/logstash/conf.d/02_filter.conf
filter {
grok {
match => ["message", "METAS:%{DATA:metas}|||%{GREEDYDATA:message}" ]
overwrite => "message"
}
kv {
source => "metas"
field_split => ","
value_split => "="
prefix => "meta_"
}
if [meta_ml] == "y" {
# Gestion du multi-ligne / format par format
if [meta_fmt] == "JAVA" {
multiline {
pattern => "^%{DATESTAMP}"
negate => "true"
what => "previous"
}
}
[...]
}
}
25. Synthèse
• Collecter avec ce qui est disponible sans impacter l’existant
• Utiliser des buffers pour scaler, lisser la charge, respecter la
politique de sécurité
• Définir des méta-données pour factoriser et standardiser la
configuration
• Utiliser Excel pour
o Inventorier les formats (essayer de restreindre le nombre de champs)
o Lister les infos propres à chaque logs/appli
Volume par jour
Besoins de réplication
Rétention
26. Et revoilà le RSSI…
• « Et la confidentialité dans tout ça ? Toutes
les données vont dans le même index ! »
27. Solution
• Faire du multi-tenants
o Segmenter les données dans Elasticsearch : Utiliser
des index distincts
Syslog
SIRH
Finance
App1
o Déployer autant de Kibana que de tenants
28. Implémentation
• Ajout de méta-données :
o « app » domaine
• Séparer les Kibana
o Instancier N Kibana
o Mettre un frontal WEB pour protéger les accès
METAS:app=appX,host=my-server,ml=y,fmt=JAVA,path=/var/log/breizhcamp/application.log|||07/03/2016
16:15:04.654 Thread-522 [INFO ] c.c.m.d.i.InterfaceImpl.rechercher (126) : appel OK
33. Comment faire ?
• 2 solutions
o Aller chercher des sous et souscrire pour disposer de
Shield
o Bloquer les requêtes…
34. Ajout d’une restriction dans Apache
• /etc/apache2/sites-enabled/kibana-x
<VirtualHost hostname:80>
# On vérifie s'il s'agit d'un accès aux settings
# Init
SetEnvIfNoCase Remote_Addr "^" post_delete=0
SetEnvIfNoCase Remote_Addr "^" url_admin=0
SetEnvIfNoCase Remote_Addr "^" acces_admin=1
# 1ere passe de tests
SetEnvIfNoCase Request_Method "POST" post_delete=1
SetEnvIfNoCase Request_Method "DELETE" post_delete=1
# URL à interdire
SetEnvIfNoCase Request_URI "/elasticsearch/.kibana-x/index-pattern/" url_admin=1
SetEnvIfNoCase Request_URI "/elasticsearch/.kibana-x/config/" url_admin=1
# URL à autoriser
SetEnvIfNoCase Request_URI "/elasticsearch/.kibana-x/index-pattern/_" url_admin=0
# Conjonction (Si une des sous-var vaut 0 => résultat vaut 0)
SetEnvIfNoCase post_delete 0 acces_admin=0
SetEnvIfNoCase url_admin 0 acces_admin=0
SetEnvIfNoCase acces_admin 1 block_admin
# Accès pour les utilisateurs autorisés
<LocationMatch "^/(.*)$">
[...]
Order allow,deny
Allow from All
Deny from env=block_admin
</LocationMatch>
</VirtualHost>
35. Synthèse V2
• Utilisation des méta-données pour passer
dans un mode multi-tenants
o Permet une scalabilité optimale
o Permet d’avoir une plate-forme unique, avec des
niveaux de service différents entre les tenants
36. La suite…
• Utiliser les méta-données pour segmenter encore plus
(différencier dev/staging, les composants techniques, les
instances, les hyperviseurs, les DC…)
• Utiliser Excel à tous les niveaux
o Synthèse des formats de logs
o Applis :
Requirements (réplication, perfs, rétention…)
Volume
• Faire un capacity planning
o Dimensionner les tampons :
Combien un tampon peut-il encaisser avant un OOM ?
Combien de downtime ES peut/doit-il gérer ?
o Dimensionner les indexer (LS ES)
o Dimensionner le cluster ES
37. Références
• ELK : http://www.elastic.co
• Nxlog : http://nxlog-ce.sourceforge.net/
• Rsyslog : http://www.rsyslog.com/
• Sources utilisés lors de cette présentation :
https://github.com/geoffroya/BzhCmp2016