Comment centraliser les journaux avec Rsyslog, Logstash et Elasticsearch sur Ubuntu 14.04

Un article deElastic

introduction

Comprendre les millions de lignes de journal générées par votre organisation peut constituer un défi de taille. D'une part, ces lignes de journal fournissent un aperçu des performances de l'application, des métriques de performance du serveur et de la sécurité. D'autre part, la gestion et l'analyse des journaux peuvent prendre beaucoup de temps, ce qui peut entraver l'adoption de ces services de plus en plus nécessaires.

Les logiciels open source, tels quersyslog,Elasticsearch etLogstash, fournissent les outils pour transmettre, transformer et stocker vos données de journal.

Dans ce didacticiel, vous apprendrez à créer un serveur rsyslog centralisé pour stocker les fichiers journaux de plusieurs systèmes, puis à utiliser Logstash pour les envoyer à un serveur Elasticsearch. À partir de là, vous pouvez décider de la meilleure manière d’analyser les données.

Buts

Ce tutoriel vous apprend à centraliser les journaux générés ou reçus par syslog, en particulier la variante connue sous le nom dersyslog. Syslog et des outils basés sur syslog tels que rsyslog, collectent des informations importantes à partir du noyau et de nombreux programmes exécutés pour maintenir les serveurs de type UNIX en cours d'exécution. Comme syslog est une norme et pas seulement un programme, de nombreux projets logiciels prennent en charge l’envoi de données à syslog. En centralisant ces données, vous pouvez plus facilement auditer la sécurité, surveiller le comportement des applications et suivre d'autres informations vitales sur le serveur.

À partir d'un serveur rsyslog centralisé ou agrégé, vous pouvez ensuite transférer les données vers Logstash, qui peut ensuite analyser et enrichir vos données de journal avant de les envoyer à Elasticsearch.

Les objectifs finaux de ce tutoriel sont les suivants:

  1. Configurer un seul serveur rsyslog client (ou de transfert)

  2. Configurez un seul serveur rsyslog serveur (ou collecte) pour recevoir les journaux du client rsyslog

  3. Configurez une instance Logstash pour recevoir les messages du serveur de collecte rsyslog

  4. Configurer un serveur Elasticsearch pour recevoir les données de Logstash

Conditions préalables

Dans lessame DigitalOcean data center, créez les gouttelettes suivantes avecprivate networking enabled:

  • Ubuntu 14.04 Droplet nommérsyslog-client

  • Ubuntu 14.04 Droplet (1 GB ou supérieur) nommérsyslog-server où les journaux centralisés seront stockés et Logstash sera installé

  • Droplet Ubuntu 14.04 avec Elasticsearch installé à partir deHow To Install and Configure Elasticsearch on Ubuntu 14.04

Vous aurez également besoin d'un utilisateur non root disposant des privilèges sudo pour chacun de ces serveurs. Initial Server Setup with Ubuntu 14.04 explique comment configurer cela.

[.note] #Note: Pour maximiser les performances, Logstash essaiera d'allouer 1 gigaoctet de mémoire par défaut, assurez-vous donc que l'instance de serveur centralisé est dimensionnée en conséquence.
#

Reportez-vous àHow To Set Up And Use DigitalOcean Private Networking pour obtenir de l'aide sur l'activation du réseau privé lors de la création des gouttelettes.

Si vous avez créé les Droplets sans réseau privé, reportez-vous àHow To Enable DigitalOcean Private Networking on Existing Droplets.

[[step-1 -—- Determining-private-ip-addresses]] == Étape 1 - Détermination des adresses IP privées

Dans cette section, vous allez déterminer quelles adresses IP privées sont attribuées à chaque droplet. Cette information sera nécessaire à travers le tutoriel.

Sur chaque droplet, recherchez ses adresses IP avec la commandeifconfig:

sudo ifconfig -a

L'option-a est utilisée pour afficher toutes les interfaces. L'interface Ethernet principale est généralement appeléeeth0. Dans ce cas, cependant, nous voulons que l'adresse IP deeth1, l'adresse IP deprivate. Ces adresses IP privées ne sont pas routables sur Internet et sont utilisées pour communiquer dans des réseaux locaux privés - dans ce cas, entre des serveurs du même centre de données sur des interfaces secondaires.

La sortie ressemblera à:

Sortie de ifconfig -a

eth0      Link encap:Ethernet  HWaddr 04:01:06:a7:6f:01
          inet addr:123.456.78.90  Bcast:123.456.78.255  Mask:255.255.255.0
          inet6 addr: fe80::601:6ff:fea7:6f01/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:168 errors:0 dropped:0 overruns:0 frame:0
          TX packets:137 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:18903 (18.9 KB)  TX bytes:15024 (15.0 KB)

eth1      Link encap:Ethernet  HWaddr 04:01:06:a7:6f:02
          inet addr:10.128.2.25  Bcast:10.128.255.255  Mask:255.255.0.0
          inet6 addr: fe80::601:6ff:fea7:6f02/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:468 (468.0 B)  TX bytes:398 (398.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

La section à noter ici esteth1 et à l'intérieur de ceinet addr. Dans ce cas, l'adresse du réseau privé est10.128.2.25. Cette adresse est uniquement accessible à partir d'autres serveurs, au sein de la même région, sur lesquels la mise en réseau privée est activée.

Assurez-vous de répéter cette étape pour les 3 gouttelettes. Enregistrez ces adresses IP privées dans un endroit sécurisé. Ils seront utilisés tout au long de ce tutoriel.

[[step-2 -—- setting-the-bind-address-for-elasticsearch]] == Étape 2 - Définition de l'adresse de liaison pour Elasticsearch

Dans le cadre des conditions préalables, vous configurez Elasticsearch sur son propre Droplet. Le didacticielHow To Install and Configure Elasticsearch on Ubuntu 14.04 vous montre comment définir l'adresse de liaison surlocalhost afin que les autres serveurs ne puissent pas accéder au service. Cependant, nous devons changer cela pour que Logstash puisse lui envoyer des données via son adresse réseau privée.

Nous allons lier Elasticsearch à son adresse IP privée. Elasticsearch will only listen to requests to this IP address.

Sur le serveur Elasticsearch, éditez le fichier de configuration:

sudo nano /etc/elasticsearch/elasticsearch.yml

Trouvez la ligne qui contientnetwork.bind_host. S'il est commenté, supprimez-le en supprimant le caractère# au début de la ligne. Remplacez la valeur par l'adresse IP privée du serveur Elasticsearch de la manière suivante:

/etc/elasticsearch/elasticsearch.yml

network.bind_host: private_ip_address

Enfin, redémarrez Elasticsearch pour activer le changement.

sudo service elasticsearch restart

[.warning] #Warning: Il est très important d'autoriser uniquement les serveurs de confiance à se connecter à Elasticsearch. L'utilisation deiptables est fortement recommandée. Pour ce didacticiel, vous ne voulez faire confiance qu'à l'adresse IP privée du dropletrsyslog-server, sur lequel Logstash est exécuté.
#

[[step-3 -—- configuration-the-centralized-server-to-receive-data]] == Étape 3 - Configuration du serveur centralisé pour recevoir des données

Dans cette section, nous allons configurer la Dropletrsyslog-server pour qu'elle soit le serveurcentralized capable de recevoir des données d'autres serveurs syslog sur le port 514.

Pour configurer lesrsyslog-server pour recevoir des données d'autres serveurs syslog, modifiez/etc/rsyslog.conf sur le dropletrsyslog-server:

sudo nano /etc/rsyslog.conf

Retrouvez ces lignes déjà commentées dans vosrsyslog.conf:

/etc/rsyslog.conf

# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514

Les premières lignes de chaque section ($ModLoad imudp et$ModLoad imtcp) chargent respectivement les modulesimudp etimtcp. imudp représenteinputmoduleudp, etimtcp représenteinputmoduletcp. Ces modules écoutent les données entrantes provenant d'autres serveurs Syslog.

Les secondes lignes de chaque section ($UDPSerververRun 514 et$TCPServerRun 514) indiquent que rsyslog doit démarrer les serveurs UDP et TCP respectifs pour ces protocoles à l'écoute sur le port 514 (qui est le port par défaut de syslog).

Pour activer ces modules et serveurs, décommentez les lignes afin que le fichier contienne maintenant:

/etc/rsyslog.conf

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

Enregistrez et fermez le fichier de configuration rsyslog.

Redémarrez rsyslog en lançant:

sudo service rsyslog restart

Votre serveur rsyslog centralisé est maintenant configuré pour écouter les messages provenant d'instances syslog distantes (y compris rsyslog).

[.tip] #Tip: Pour valider votre fichier de configuration rsyslog, vous pouvez exécuter la commandesudo rsyslogd -N1.
#

[[step-4 -—- configuration-rsyslog-to-send-data-remote]] == Étape 4 - Configuration de rsyslog pour envoyer des données à distance

Dans cette section, nous allons configurer lesrsyslog-client pour envoyer les données du journal au dropletryslog-server que nous avons configuré à la dernière étape.

Dans une configuration rsyslog par défaut sur Ubuntu, vous trouverez deux fichiers dans/etc/rsyslog.d:

  • 20-ufw.conf

  • 50-default.conf

Sur lesrsyslog-client, éditez le fichier de configuration par défaut:

sudo nano /etc/rsyslog.d/50-default.conf

Ajoutez la ligne suivante en haut du fichier avant la sectionlog by facility, en remplaçantprivate_ip_of_ryslog_server par l'IPprivate de votre serveurcentralized:

/etc/rsyslog.d/50-default.conf

*.*                         @private_ip_of_ryslog_server:514

Enregistrez et quittez le fichier.

La première partie de la ligne (.) signifie que nous voulons envoyer tous les messages. Bien que cela ne relève pas de ce didacticiel, vous pouvez configurer rsyslog pour n’envoyer que certains messages. Le reste de la ligne explique comment envoyer les données et où envoyer les données. Dans notre cas, le symbole@ devant l'adresse IP indique à rsyslog d'utiliser UDP pour envoyer les messages. Remplacez-le par@@ pour utiliser TCP. Ceci est suivi de l'adresse IP privée dersyslog-server avec rsyslog et Logstash installés dessus. Le numéro après les deux points est le numéro de port à utiliser.

Redémarrez rsyslog pour activer les modifications:

sudo service rsyslog restart

Toutes nos félicitations! Vous envoyez maintenant vos messages syslog à un serveur centralisé!

[.tip] #Tip: Pour valider votre fichier de configuration rsyslog, vous pouvez exécuter la commandesudo rsyslogd -N1.
#

[[step-5 -—- formatting-the-log-data-to-json]] == Étape 5 - Formatage des données de journal en JSON

Elasticsearch exige que tous les documents reçus soient au format JSON, et rsyslog fournit un moyen d'accomplir cela au moyen d'un modèle.

Dans cette étape, nous allons configurer notre serveur rsyslog centralisé pour utiliser un modèle JSON afin de formater les données de journal avant de les envoyer à Logstash, qui les enverra ensuite à Elasticsearch sur un autre serveur.

De retour sur le serveurrsyslog-server, créez un nouveau fichier de configuration pour formater les messages au format JSON avant de les envoyer à Logstash:

sudo nano /etc/rsyslog.d/01-json-template.conf

Copiez le contenu suivant dans le fichier exactement comme indiqué:

/etc/rsyslog.d/01-json-template.conf

template(name="json-template"
  type="list") {
    constant(value="{")
      constant(value="\"@timestamp\":\"")     property(name="timereported" dateFormat="rfc3339")
      constant(value="\",\"@version\":\"1")
      constant(value="\",\"message\":\"")     property(name="msg" format="json")
      constant(value="\",\"sysloghost\":\"")  property(name="hostname")
      constant(value="\",\"severity\":\"")    property(name="syslogseverity-text")
      constant(value="\",\"facility\":\"")    property(name="syslogfacility-text")
      constant(value="\",\"programname\":\"") property(name="programname")
      constant(value="\",\"procid\":\"")      property(name="procid")
    constant(value="\"}\n")
}

Outre le premier et le dernier, notez que les lignes générées par ce modèle ont une virgule au début. Il s'agit de maintenir la structure JSONand aide à garder le fichier lisible en alignant tout proprement. Ce modèle formate vos messages de la manière attendue par Elasticsearch et Logstash. Voici à quoi ils ressembleront:

Exemple de message JSON

{
  "@timestamp" : "2015-11-18T18:45:00Z",
  "@version" : "1",
  "message" : "Your syslog message here",
  "sysloghost" : "hostname.example.com",
  "severity" : "info",
  "facility" : "daemon",
  "programname" : "my_program",
  "procid" : "1234"
}

[.tip] #Tip: Lesrsyslog.com docs affichent les variables disponibles à partir de rsyslog si vous souhaitez personnaliser les données du journal. Cependant, vous devez l'envoyer au format JSON à Logstash puis à Elasticsearch.
#

Les données envoyées n'utilisent pas encore ce format. L'étape suivante montre comment configurer le serveur pour utiliser ce fichier de modèle.

[[step-6 -—- configuration-du-serveur-centralisé-pour-envoyer-à-logstash]] == Étape 6 - Configuration du serveur centralisé pour envoyer à Logstash

Maintenant que nous avons le fichier modèle qui définit le format JSON approprié, configurons le serveur centralisé rsyslog pour qu’il envoie les données à Logstash, qui se trouve dans le même Droplet que ce didacticiel.

Au démarrage, rsyslog examinera les fichiers dans/etc/rsyslog.d et créera sa configuration à partir d'eux. Ajoutons notre propre fichier de configuration pour étendre la configuration.

Sur lesrsyslog-server, créez/etc/rsyslog.d/60-output.conf:

sudo nano /etc/rsyslog.d/60-output.conf

Copiez les lignes suivantes dans ce fichier:

/etc/rsyslog.d/60-output.conf

# This line sends all lines to defined IP address at port 10514,
# using the "json-template" format template

*.*                         @private_ip_logstash:10514;json-template

Le*.* au début signifie traiter le reste de la ligne pour tous les messages du journal. Les symboles@ signifie utiliser UDP (utilisez@@ pour utiliser TCP à la place). L'adresse IP ou le nom d'hôte après les@ est l'endroit où transférer les messages. Dans notre cas, nous utilisons l'adresse IP privée pourrsyslog-server puisque le serveur centralisé rsyslog et le serveur Logstash sont installés sur le même Droplet. This must match the private IP address you configure Logstash to listen on in the next step.

Le numéro de port est le suivant. Ce tutoriel utilise le port 10514. Notez que le serveur Logstash doit écouter sur le même port en utilisant le même protocole. La dernière partie est notre fichier de modèle qui montre comment formater les données avant de les transmettre.

Ne redémarrez pas encore rsyslog. Premièrement, nous devons configurer Logstash pour recevoir les messages.

[[step-7 -—- configure-logstash-to-receive-json-messages]] == Étape 7 - Configurer Logstash pour recevoir des messages JSON

Dans cette étape, vous allez installer Logstash, le configurer pour recevoir les messages JSON de rsyslog, et le configurer pour envoyer les messages JSON à Elasticsearch.

Logstash nécessite Java 7 ou une version ultérieure. Utilisez les instructions deStep 1 duElasticsearch tutorial pour installer Java 7 ou 8 sur le dropletrsyslog-server.

Ensuite, installez la clé de sécurité pour le référentiel Logstash:

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Ajoutez la définition du référentiel à votre fichier/etc/apt/sources.list:

echo "deb http://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list

[.note] #Note: Utilisez la méthodeecho décrite ci-dessus pour ajouter le référentiel Logstash. N'utilisez pasadd-apt-repository car cela ajoutera également une entréedeb-src, mais Elastic ne fournit pas de paquet source. Cela entraînera une erreur lorsque vous tenterez d'exécuterapt-get update.
#

Mettez à jour vos listes de paquets pour inclure le référentiel Logstash:

sudo apt-get update

Enfin, installez Logstash:

sudo apt-get install logstash

Maintenant que Logstash est installé, configurons-le pour écouter les messages de rsyslog.

L'installation par défaut de Logstash recherche les fichiers de configuration dans/etc/logstash/conf.d. Editez le fichier de configuration principal:

sudo nano /etc/logstash/conf.d/logstash.conf

Ensuite, ajoutez ces lignes à/etc/logstash/conf.d/logstash.conf:

/etc/logstash/conf.d/logstash.conf`

# This input block will listen on port 10514 for logs to come in.
# host should be an IP on the Logstash server.
# codec => "json" indicates that we expect the lines we're receiving to be in JSON format
# type => "rsyslog" is an optional identifier to help identify messaging streams in the pipeline.

input {
  udp {
    host => "logstash_private_ip"
    port => 10514
    codec => "json"
    type => "rsyslog"
  }
}

# This is an empty filter block.  You can later add other filters here to further process
# your log lines

filter { }

# This output block will send all events of type "rsyslog" to Elasticsearch at the configured
# host and port into daily indices of the pattern, "rsyslog-YYYY.MM.DD"

output {
  if [type] == "rsyslog" {
    elasticsearch {
      hosts => [ "elasticsearch_private_ip:9200" ]
    }
  }
}

Le protocole syslog est par définition UDP; cette configuration reflète donc cette norme.

Dans le bloc d'entrée, définissez l'adresse de l'hôte Logstash en remplaçantlogstashprivateip par l'adresse IP privée dersyslog-server, sur laquelle Logstash est également installé.

Le bloc d'entrée configure Logstash pour écouter sur le port10514 afin qu'il ne soit pas en concurrence avec les instances syslog sur la même machine. Un port inférieur à 1024 nécessiterait que Logstash soit exécuté en tant qu'utilisateur root, ce qui n'est pas une bonne pratique de sécurité.

Assurez-vous de remplacerelasticsearchprivateip par lesprivate IP address de votre droplet Elasticsearch. Le bloc de sortie affiche une configurationconditional simple. Son objet est d'autoriser uniquement les événements correspondants. Dans ce cas, il s’agit uniquement d’événements avec un «type» de «rsyslog».

Testez vos modifications de configuration Logstash:

sudo service logstash configtest

Il devrait afficherConfiguration OK s'il n'y a pas d'erreurs de syntaxe. Sinon, essayez de lire la sortie d'erreur pour voir ce qui ne va pas avec votre configuration Logstash.

Lorsque toutes ces étapes sont terminées, vous pouvez démarrer votre instance Logstash en exécutant:

sudo service logstash start

Redémarrez également rsyslog sur le même serveur car il possède une instance Logstash à transférer à maintenant:

sudo service rsyslog restart

Pour vérifier que Logstash écoute sur le port 10514:

netstat -na | grep 10514

Vous devriez voir quelque chose comme ça:

Sortie de netstat

udp6       0      0 10.128.33.68:10514     :::*

Vous verrez l'adresse IP privée dersyslog-server et le numéro de port 10514 que nous utilisons pour écouter les données rsyslog.

[.pointe]##

Tip: Pour dépanner Logstash, arrêtez le service avecsudo service logstash stop et exécutez-le au premier plan avec des messages détaillés:

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf --verbose

Il contiendra des informations habituelles telles que la vérification avec l'adresse IP et le port UDP que Logstash utilise:

Starting UDP listener {:address=>"10.128.33.68:10514", :level=>:info}

[[step-8 -—- verifying-elasticsearch-input]] == Étape 8 - Vérification de l'entrée Elasticsearch

Auparavant, nous avions configuré Elasticsearch pour écouter sur son adresse IP privée. Il devrait maintenant recevoir des messages de Logstash. Dans cette étape, nous vérifierons qu'Elasticsearch reçoit les données du journal.

Les dropletsrsyslog-client etrsyslog-server doivent envoyer toutes leurs données de journal à Logstash, qui sont ensuite transmises à Elasticsearch. Générons un message de sécurité pour vérifier qu'Elasticsearch reçoit effectivement ces messages.

Surrsyslog-client, exécutez la commande suivante:

sudo tail /var/log/auth.log

Vous verrez le journal de sécurité sur le système local à la fin de la sortie. Cela ressemblera à:

Sortie de la queue /var/log/auth.log

May  2 16:43:15 rsyslog-client sudo:    sammy : TTY=pts/0 ; PWD=/etc/rsyslog.d ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log
May  2 16:43:15 rsyslog-client sudo: pam_unix(sudo:session): session opened for user root by sammy(uid=0)

Avec une simple requête, vous pouvez vérifier Elasticsearch:

Exécutez la commande suivante sur le serveur Elasticsearch ou sur tout système autorisé à y accéder. Remplacezelasticsearch_ip par l'adresse IP privée du serveur Elasticsearch. Cette adresse IP doit également être celle sur laquelle vous avez configuré Elasticsearch pour écouter précédemment dans ce didacticiel.

curl -XGET 'http://elasticsearch_ip:9200/_all/_search?q=*&pretty'

Dans la sortie, vous verrez quelque chose de similaire à ce qui suit:

Sortie de curl

{
      "_index" : "logstash-2016.05.04",
      "_type" : "rsyslog",
      "_id" : "AVR8fpR-e6FP4Elp89Ww",
      "_score" : 1.0,
      "_source":{"@timestamp":"2016-05-04T15:59:10.000Z","@version":"1","message":"    sammy : TTY=pts/0 ; PWD=/home/sammy ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log","sysloghost":"rsyslog-client","severity":"notice","facility":"authpriv","programname":"sudo","procid":"-","type":"rsyslog","host":"10.128.33.68"}
    },

Notez que le nom du droplet qui a généré le message rsyslog se trouve dans le journal (rsyslog-client).

Avec cette simple étape de vérification, votre configuration centralisée de rsyslog est complète et pleinement opérationnelle!

Conclusion

Vos journaux sont maintenant dans Elasticsearch. Et après? Envisagez de lire ce queKibana peut faire pour visualiser les données que vous avez dans Elasticsearch, y compris les graphiques en courbes et à barres, les graphiques à secteurs, les cartes, etc. How To Use Logstash and Kibana To Centralize Logs On Ubuntu 14.04 explique comment utiliser l'interface Web de Kibana pour rechercher et visualiser les journaux.

Peut-être que vos données seraient plus utiles si l’on procédait à une analyse syntaxique et à une tokenisation. Si tel est le cas, en savoir plus surLogstash vous aidera à atteindre ce résultat.

Related