Rsyslog-Graylog-Elasticsearch

De wikiGite

Installation de Graylog2/Elascticsearch sur CentOS 7

Rsyslog sera utilisé pour envoyer les logs à partir des serveurs

Composants

1. MongoDB – Stores the configurations and meta information.

2. Elasticsearch – Stores the log messages and offers a searching facility, nodes should have high memory as all the I/O operations are happens here.

3. GrayLog – Log parser, it collect the logs from various inputs.

4. GrayLog Web interface = provides you the web-based portal for managing the logs.


Pré-requis :

yum install screen wget ntp ntpdate
systemctl enable ntpd
systemctl start ntpd

ELASTICSEARCH

Elasticsearch stockera les lignes de logs en provenance des serveurs.

Installation

Installer Oracle jdk :

wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u11-b12/jdk-8u11-linux-x64.tar.gz
tar -zxvf jdk-8u11-linux-x64.tar.gz
mv jdk1.8.0_11/ /usr/

/usr/sbin/alternatives --install /usr/bin/java java /usr/jdk1.8.0_11/bin/java 2
/usr/sbin/alternatives --config java
    Selectionner le dernier java

Vérifier que la version installée est bien prise en compte :

java -version

Installer le dépôt EPEL

ATTENTION pour centos7, bizarrement le rpm met la clé centos6 dans epel.repo. Donc :

vi /etc/yum.repos.d/epel.repo

modifier RPM-GPG-KEY-EPEL-6 par RPM-GPG-KEY-EPEL-7


Importer la clé et créer le fichier de dépôt Elasticsearch :

rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
vi /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-1.7]
name=Elasticsearch repository for 1.7.x packages
baseurl=http://packages.elastic.co/elasticsearch/1.7/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
yum install elasticsearch

FORCER Elascticsearch A ECOUTER SUR IPV4 !

vi /etc/systemd/system/multi-user.target.wants/elasticsearch.service

ajouter : " -Djava.net.preferIPv4Stack=true" à la fin de la ligne ExecStart (comme les "-D" déjà existants, ne pas oublier d'ajouter un "\" a la ligne du dessus)

Configuration

vi /etc/elasticsearch/elasticsearch.yml

Modifier :

cluster.name: graylog2
# limiter les connexions à localhost, tout est sur le même serveur
network.host: 127.0.0.1
# important, ces 2 lignes lues par Graylog qui ne sait pas les lire dans son propre .conf !! :
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: ["localhost"]

et ajouter à la fin du fichier :

script.disable_dynamic: true

Modifier éventuellement le chemin des bases :

path.data: /home/elasticsearch/data

Activer et charger le tout :

systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl restart elasticsearch.service

Tester l'accès :

curl -X GET http://localhost:9200
{
 "status" : 200,
 "name" : "Glob Herman",
 "cluster_name" : "graylog2",
 "version" : {
   "number" : "1.7.2",
   "build_hash" : "e43676b1385b8125d647f593f7202acbd816e8ec",
   "build_timestamp" : "2015-09-14T09:49:53Z",
   "build_snapshot" : false,
   "lucene_version" : "4.10.4"
 },
 "tagline" : "You Know, for Search"
}

MONGODB

MongDB stockera uniquement les paramètres de Graylog.

Installation

Créer le fichier de dépôt :

vi /etc/yum.repos.d/mongodb-org-3.0.repo
[mongodb-org-3.0]
name=MongoDB Repository
baseurl=http://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.0/x86_64/
gpgcheck=0
enabled=1
yum install mongodb-org
chkconfig mongod on #(pas encore de fichier d'init systemd)
systemctl start mongod

GRAYLOG2

Graylog receptionnera les logs en provenance des rsyslog et les enverra vers Elasticsearch

Installation

Importer le fichier de dépôt et installer le rpm :

rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-1.2-repository-el7_latest.rpm
yum install graylog-server

Générer une passphrase :

yum install pwgen --enablerepo=epel
pwgen -N 1 -s 96 # Copier la phrase

Puis récupérer le SHA d'un mot de passe pour l'admin Graylog (à ne pas confondre avec le "root" du système)

echo -n mot_de_passe_admin_graylog | sha256sum # Copier le SHA

Configuration

vi /etc/graylog/server/server.conf

Mettre la première phrase sur "password_secret =", et le SHA sur "root_password_sha2 ="

Modifier

root_email = "admin@domain.com"
root_timezone = Europe/Paris
elasticsearch_shards = 1
# Limiter à localhost (seule l'interface web a besoin de s'y connecter) :
rest_transport_uri = http://127.0.0.1:12900/
# Retention 1 index par semaine, 52 semaines (à valider sur un an):
rotation_strategy = time
#elasticsearch_max_docs_per_index = 20000000 # commenter
elasticsearch_max_time_per_index = 7d # à vérifier "1w" pas pris en compte ?
elasticsearch_max_number_of_indices = 52
# Décommenter au cas où (ligne déjà existantes dans elasticsearch.yml, qui sera relu par Graylog) :
elasticsearch_discovery_zen_ping_multicast_enabled = false
elasticsearch_discovery_zen_ping_unicast_hosts = localhost:9300
systemctl restart graylog-server

Vérifier s'il y a des erreurs :

tailf /var/log/graylog-server/server.log

on doit avoir vers la fin : "2015-10-10T13:07:16.078+02:00 INFO [ServerBootstrap] Graylog server up and running."

GRAYLOG WEB INTERFACE

Installation

yum install graylog-web
pwgen -N 1 -s 96 # Générer une nouvelle passphrase
vi /etc/graylog/web/web.conf

ajouter l'URI du serveur Graylog :

graylog2-server.uris="http://127.0.0.1:12900/"
Coller la passphrase sur "application.secret="

Relancer l'interface

systemctl restart graylog-web

et s'y connecter : http://<serveur-log>:9000.

Dans l'interface, configurer une input pour syslog dans system > inputs

sélectionner syslog UDP (ou TCP) et cliquer "launch new input"

Dans la fenêtre qui s'ouvre, donner :

le titre "Syslog"
port 5514
bind_IP l'ip du serveur graylog
FORCER RDNS car les messages syslog ne contiennent pas toujours le hostname mais l'ip

et cliquer sur "launch"

NOTE : on ne peut pas utiliser le port par défaut 514 car il faut être root pour binder un port < 1024, et ce n'est pas conseillé de lancer graylog en root !

RSYSLOG

Rsyslog sera installé à la place de Syslogd sur les système qui ne l'ont pas par défaut, ou mis à jour en V8 sur les autres. Il enverra les logs vers Graylog.

Installation

yum install rsyslog
mkdir /etc/rsyslog.d
vi /etc/rsyslog.conf

ajouter si ça n'y est pas :

 $IncludeConfig /etc/rsyslog.d/*.conf

et exclure local4 de messages

*.info;mail.none;authpriv.none;cron.none:local4.none                /var/log/messages
service syslog stop
service rsyslog restart
chkconfig syslog off
chkconfig rsyslog on

Importer le fichier de dépôt rsyslog

vi /etc/yum.repos.d/rsyslog.repo
[rsyslog-v8-stable]
name=Adiscon Rsyslog v8-stable for CentOS-$releasever-$basearch
baseurl=http://rpms.adiscon.com/v8-stable/epel-$releasever/$basearch
enabled=0
gpgcheck=0
protect=1

Et installer :

yum install rsyslog --enablerepo=rsyslog-v8-stable

Configuration

vi /etc/rsyslog.d/90-graylog2.conf
# Template de mise en forme au format Graylog des logs envoyés. La propriété "syslogtag" a été ajoutée au message.
$template GRAYLOGRFC5424,"<%PRI%>%PROTOCOL-VERSION% %TIMESTAMP:::date-rfc3339% %HOSTNAME% %APP-NAME% %PROCID% %MSGID% %STRUCTURED-DATA% %syslogtag% %msg%\n"
# Quelques filtres
:programname, isequal, "cced(smd)" stop
:msg, contains, "(127.0.0.1[127.0.0.1]) - FTP session closed." stop
# Envoi des données. Les logs Apache sont formatés différemment, par un template à part.
kern.* @<IP du serveur Graylog>:5514;GRAYLOGRFC5424
*.info;mail.none;cron.none;local4.none @<IP du serveur Graylog>:5514;GRAYLOGRFC5424
local4.* @<IP du serveur Graylog>:5514;TagApacheLog

Pour d'autres logs que le système :

vi /etc/rsyslog.d/10-http-graylog2.conf
  • LOG APACHES UNIQUES
# Forward apache logs to graylog2 server
$template TagApacheLog,"<%PRI%>%PROTOCOL-VERSION% %TIMESTAMP:::date-rfc3339% %HOSTNAME% %APP-NAME% %PROCID% %MSGID% %STRUCTURED-DATA% %msg%\n"

input (type="imfile"
  File="/var/log/httpd/access_log"
  Tag="ApacheAccessLog"
  Severity="info"
  Facility="local4"
  addMetadata="on"
)

input (type="imfile"
  File="/var/log/httpd/error_log"
  Tag="ApacheErrorLog"
  Severity="info"
  Facility="local4"
  addMetadata="on"
)

# Filtres AccessLog
:msg, contains, "\"HEAD / HTTP/1.0\" 200 - \"-\" \"-\"" stop
:msg, contains, "GET /seafhttp/repo" stop
:msg, contains, "GET /api2/ping/ HTTP/1.1" stop
:msg, contains, "GET /api2/unseen_messages/ HTTP/1.1" stop
:msg, contains, "GET /api2/repos/ HTTP/1.1" stop
:msg, contains, "GET /apc_info.php?auto HTTP/1.1" stop
:msg, contains, "GET /server-status?auto HTTP/1.0" stop
:msg, contains, "GET /server-status?auto HTTP/1.1" stop
# Filtres ErrorLog
:msg, contains, "client denied by server configuration: /var/www/html/server-status" stop
  • LOG APACHE MULTIPLES (traitement par wildcard)
# Forward apache logs to graylog2 server
if $!metadata!filename contains(".error.log") then {
  set $.tag = 'ErrorLog';
} else {
  set $.tag = 'AccessLog';
}
$template TagApacheLog,"<%PRI%>%PROTOCOL-VERSION% %TIMESTAMP:::date-rfc3339% %HOSTNAME% %APP-NAME% %PROCID% %MSGID% %STRUCTURED-DATA% %$.tag% (%$!metadata!filename%): %msg%\n"

input (type="imfile"
  File="/var/log/httpd/domains/*.log"
  Tag="ApacheLog"
  Severity="info"
  Facility="local4"
  addMetadata="on"
)

# Filtres AccessLog
:msg, contains, "\"HEAD / HTTP/1.0\" 200 - \"-\" \"-\"" stop
:msg, contains, "GET /seafhttp/repo" stop
:msg, contains, "GET /api2/ping/ HTTP/1.1" stop
:msg, contains, "GET /api2/unseen_messages/ HTTP/1.1" stop
:msg, contains, "GET /api2/repos/ HTTP/1.1" stop
:msg, contains, "GET /apc_info.php?auto HTTP/1.1" stop
:msg, contains, "GET /server-status?auto HTTP/1.0" stop
:msg, contains, "GET /server-status?auto HTTP/1.1" stop
# Filtres ErrorLog
:msg, contains, "client denied by server configuration: /var/www/html/server-status" stop


Si pas déjà fait, ajouter local4.none dans /etc/syslog/conf pour éviter la double écriture des logs Apache dans /var/log/messages

*.info;mail.none;authpriv.none;cron.none;local4.none          /var/log/messages

Relancer le service

service rsyslog restart

TIPS & TRICKS

SUPPRIMER DES MESSAGES par l'API ElasticSearch

curl -XDELETE 'http://localhost:9200/graylog2_0/message/_query?q=host:"<nom_du_serveur>"'

Ou pour tout supprimer :

curl -XDELETE 'http://127.0.0.1:9200/graylog2_*/message/_query?q=host:*'

Vider la base Elasticsearch

Pour tout supprimer après les tests par exemple, arrêter graylog-server et elasticsearch, supprimer tous les répertoires identifié sous la racine identifiée par "path.data". L'arborescence et les bases seront recréées au redémarrage.