Comment utiliser Logrotate et S3cmd pour archiver les journaux sur le stockage d’objets sur Ubuntu 16.04

introduction

Les fichiers journaux produits par vos serveurs et vos applications regorgent d’informations potentiellement utiles pour le débogage de logiciels, l’enquête sur les incidents de sécurité et la génération de métriques et de statistiques pertinentes.

De nos jours, une stratégie de journalisation typique consiste à centraliser toutes ces informations via un service d’agrégation de journaux tel que https://www.digitalocean.com/community/tutorial_series/centralized-logging-with-elk-stack-elasticsearch-logstash-and-kibana- on-ubuntu-14-04 [la pile élastique] ou Graylog . C’est excellent pour l’analyse en temps réel et les analyses historiques à court et à moyen terme, mais il est souvent impossible de conserver des données à long terme dans ces systèmes en raison de contraintes de stockage ou de problèmes de ressources du serveur.

Une solution courante pour ces besoins de stockage à long terme est l’archivage des journaux avec un service de stockage d’objets. Les journaux peuvent rester indéfiniment disponibles pour une analyse ultérieure, des exigences de conservation légale ou à des fins de sauvegarde.

Dans ce tutoriel, nous utiliserons Logrotate sur un serveur Ubuntu 16.04 pour envoyer les journaux + syslog + à un service de stockage d’objets. Cette technique pourrait être appliquée à tous les journaux gérés par Logrotate.

Conditions préalables

Pour compléter ce tutoriel, vous aurez besoin des éléments suivants:

  • Un serveur Ubuntu 16.04, avec un utilisateur non-root sudo, tel que décrit dans Initial Initial Server Setup avec Ubuntu 16.04. Les configurations de ce didacticiel devraient fonctionner plus largement sur de nombreuses distributions Linux différentes, mais nécessiteront peut-être une certaine adaptation.

  • Vous devez être familiarisé avec Logrotate et avec la configuration de la configuration par défaut sous Ubuntu 16.04. Veuillez lire Comment gérer les fichiers de log avec Logrotate sur Ubuntu 16.04 pour plus d’informations.

  • Vous aurez besoin de connaître les détails suivants sur votre service de stockage d’objets:

  • Clef d’accès

  • Clef secrète

  • URL du serveur (ou «Endpoint»)

  • Nom du seau + Si vous utilisez DigitalOcean Spaces, vous pouvez lire Comment créer un espace DigitalOcean et API Key pour créer un nouveau compartiment et récupérer les informations ci-dessus.

Lorsque vous avez terminé les conditions préalables, commencez par SSH sur votre serveur.

Étape 1 - Installation de S3cmd

Nous allons utiliser un outil appelé * S3cmd * pour envoyer nos journaux à n’importe quel service de stockage d’objets compatible S3. Avant d’installer S3cmd, nous devons installer quelques outils pour nous aider à installer les programmes Python (S3cmd est écrit en Python):

sudo apt-get update
sudo apt-get install python-setuptools

Ensuite, accédez à un répertoire dans lequel vous pouvez écrire, puis téléchargez le fichier S3cmd + .tar.gz +:

cd /tmp
curl -LO https://github.com/s3tools/s3cmd/releases/download/v2.0.1/s3cmd-2.0.1.tar.gz

Une fois le téléchargement terminé, décompressez et décompressez le fichier à l’aide de l’utilitaire + tar +:

tar xf s3cmd-*.tar.gz

Ensuite, allez dans le répertoire résultant et installez le logiciel en utilisant + sudo +:

cd s3cmd-*
sudo python setup.py install

Testez l’installation en demandant à + s3cmd + `ses informations de version:

s3cmd --version
Outputs3cmd version

Si vous voyez une sortie similaire, S3cmd a été installé avec succès. Ensuite, nous allons configurer S3cmd pour qu’il se connecte à notre service de stockage d’objets.

Étape 2 - Configuration de S3cmd

S3cmd a un processus de configuration interactif qui permet de créer le fichier de configuration nécessaire pour se connecter à notre serveur de stockage d’objets. L’utilisateur * root * aura besoin de l’accès à ce fichier de configuration. Nous allons donc lancer le processus de configuration avec + sudo + et placer le fichier de configuration dans le répertoire de base de l’utilisateur * root *:

sudo s3cmd --configure --config=/root/logrotate-s3cmd.config

La configuration interactive va commencer. Le cas échéant, vous pouvez accepter les réponses par défaut (entre parenthèses) en appuyant sur + ENTER. Nous allons parcourir les options ci-dessous, avec des réponses suggérées pour un espace dans la région NYC3 de DigitalOcean. Remplacez le modèle de noeud final S3 et de compartiment selon les besoins pour les autres centres de données DigitalOcean ou autres fournisseurs de stockage d’objets:

  • Clé d’accès: ++

  • Clé secrète: ++

  • Région par défaut [US]: + ENTER +

  • S3 Endpoint [s3.amazonaws.com]: ++

  • Seau de style DNS + nomhôte: modèle de port permettant d’accéder à un seau [% (seau) s.s3.amazonaws.com]: ++

  • Mot de passe de cryptage: + ENTER +, ou spécifiez un mot de passe à crypter

  • Chemin du programme GPG [/ usr / bin / gpg]: + ENTER +

  • Utiliser le protocole HTTPS [Oui]: + ENTER +

  • Nom du serveur proxy HTTP: + ENTER +, ou remplissez vos informations de proxy

À ce stade, + s3cmd + résumera vos réponses, puis vous demandera de tester la connexion. Appuyez sur + y + puis + ENTER + pour lancer le test:

OutputTest access with supplied credentials? [Y/n]
Please wait, attempting to list all buckets...

Après le test, vous serez invité à enregistrer les paramètres. A nouveau, tapez + y + puis + ENTER + pour le faire. Le fichier de configuration sera écrit à l’emplacement précédemment spécifié à l’aide de l’option de ligne de commande + - config +.

Dans l’étape suivante, nous allons configurer Logrotate pour qu’il utilise S3cmd pour télécharger nos journaux.

Étape 3 - Configuration de Logrotate pour l’envoi de journaux pivotés au stockage d’objets

Logrotate est un système puissant et flexible permettant de gérer la rotation et la compression des fichiers journaux. Ubuntu l’utilise par défaut pour conserver tous les journaux système trouvés dans + / var / log +.

Pour ce tutoriel, nous allons mettre à jour la configuration afin d’envoyer le journal + syslog + au stockage d’objets à chaque rotation.

Tout d’abord, ouvrez le fichier de configuration Logrotate pour + rsyslog +, le processeur de journaux système:

sudo nano /etc/logrotate.d/rsyslog

Il y aura deux blocs de configuration. Nous sommes intéressés par le premier, qui concerne + / var / log / syslog +:

/etc/logrotate.d/rsyslog

/var/log/syslog
{
   rotate 7
   daily
   missingok
   notifempty

   compress
   postrotate
       invoke-rc.d rsyslog rotate > /dev/null
   endscript
}
. . .

Cette configuration spécifie que + / var / log / syslog + sera soumis à une rotation quotidienne (+ daily +), avec sept anciens journaux conservés (+ rotation 7 +). Il ne générera pas d’erreur si le fichier journal est manquant (+ missingok +) et il ne fera pas pivoter le journal s’il est vide (+ notifempty +). Les journaux pivotés seront compressés (+ compress +), mais pas le plus récent (+ delaycompress +). Enfin, le script + postrotate + dit `` + rsyslog + `de basculer vers le nouveau fichier journal après la rotation de l’ancien.

Avant d’ajouter nos nouvelles directives de configuration, supprimez la ligne + delaycompress +, mise en évidence ci-dessus. Nous voulons que tous nos anciens journaux soient compressés immédiatement avant de les envoyer au stockage d’objets.

Ensuite, ajoutez les lignes suivantes à la fin du bloc de configuration (en dehors du bloc + postrotate ++ endcript + mais à l’intérieur du crochet +} + fermant):

/etc/logrotate.d/rsyslog

. . .
       dateext
       dateformat -%Y-%m-%d-%s
       lastaction
               HOSTNAME=`hostname`
               /usr/local/bin/s3cmd sync --config=/root/logrotate-s3cmd.config /var/log/syslog*.gz "s3:///$HOSTNAME/"
       endscript
. . .

Assurez-vous de remplacer le nom de compartiment correspondant à la partie mise en surbrillance ci-dessus. Ces options activeront les extensions de nom de fichier basées sur la date (+ dateext +) afin que nous puissions horodater nos fichiers journaux. Nous définissons ensuite le format de ces extensions avec + dateformat +. Les fichiers se retrouveront avec des noms de fichiers tels que + syslog-2017-11-07-1510091490.gz +: année, mois, date, puis horodatage. L’horodatage garantit que nous pouvons expédier deux fichiers journaux le même jour sans conflit de noms de fichiers. Cela est nécessaire dans le cas où nous aurions besoin de forcer une rotation du journal pour une raison quelconque (plus à ce sujet dans l’étape suivante).

Le script + lastaction + est exécuté après la compression de tous les fichiers journaux. Il définit une variable avec le nom d’hôte du serveur, puis utilise + s3cmd sync + pour synchroniser tous les fichiers syslog jusqu’à votre compartiment de stockage d’objets, en les plaçant dans un dossier portant le nom d’hôte. Notez que la barre oblique finale dans " s3: /// $ HOSTNAME / " est significative. Sans lui, + s3cmd + traiterait + / $ HOSTNAME + comme un fichier unique, et non comme un répertoire plein de fichiers journaux.

Enregistrez et fermez le fichier de configuration. La prochaine fois que Logrotate effectuera son travail quotidien, + / var / log / syslog + sera déplacé vers un nom de fichier basé sur la date, compressé et téléchargé.

Nous pouvons forcer cela à se produire immédiatement pour vérifier son bon fonctionnement:

sudo logrotate /etc/logrotate.conf --verbose --force
Outputrotating pattern: /var/log/syslog
. . .


. . .

switching euid to 0 and egid to 0
upload: '/var/log/syslog-2017-11-08-1510175806.gz' -> 's3://example-bucket/example-hostname/syslog-2017-11-08-1510175806.gz'  [1 of 1]
36236 of 36236   100% in    0s   361.16 kB/s  done

Cela produira beaucoup d’informations pour de nombreux fichiers journaux. Les parties pertinentes pour le journal + syslog et votre téléchargement sont extraites ci-dessus. Votre sortie devrait ressembler, avec quelques preuves d’un téléchargement réussi. Vous pouvez avoir plus de fichiers en cours de téléchargement si le serveur n’est pas neuf.

Ensuite, nous allons éventuellement configurer un service pour nous aider à télécharger les journaux avant les arrêts du système.

Étape 4 - Envoi des journaux à l’arrêt

Cette étape est facultative et n’est nécessaire que si vous configurez des serveurs éphémères qui sont fréquemment arrêtés et détruits. Si tel est le cas, vous pouvez perdre jusqu’à un jour de journaux chaque fois que vous détruisez un serveur.

Pour résoudre ce problème, nous devons obliger Logrotate à s’exécuter une dernière fois avant la fermeture du système. Pour ce faire, nous allons créer un service systemd qui exécute la commande + logrotate + lorsqu’il est arrêté.

Commencez par ouvrir un nouveau fichier de service dans un éditeur de texte:

sudo nano /etc/systemd/system/logrotate-shutdown.service

Collez dans la définition de service suivante:

/etc/systemd/system/logrotate-shutdown.service

[Unit]
Description=Archive logs before shutdown
After=network.target

[Service]
RemainAfterExit=yes
ExecStop=/usr/sbin/logrotate /etc/logrotate.conf --force

[Install]
WantedBy=multi-user.target

Ce fichier définit un service qui ne fait rien au démarrage (il manque une instruction + ExecStart +), et exécute + logrotate + (avec l’option + - force +) à l’arrêt. Il sera exécuté avant que la connexion réseau ne soit fermée en raison de la ligne + After = network.target +.

Enregistrez le fichier et quittez votre éditeur de texte, puis + start + et + enable + le service en utilisant + systemctl +:

sudo systemctl start logrotate-shutdown.service
sudo systemctl enable logrotate-shutdown.service

Vérifiez l’état du nouveau service:

sudo systemctl status logrotate-shutdown.service
Output● logrotate-shutdown.service - Archive logs before shutdown
  Loaded: loaded (/etc/systemd/system/logrotate-shutdown.service; enabled; vendor preset: enabled)
   since Wed 2017-11-08 20:00:05 UTC; 8s ago

Nov 08 20:00:05 example-host systemd[1]: Started Archive logs before shutdown.

Nous voulons voir qu’il est + actif +. Le fait qu’il ait + exited + convient, cela est dû au fait qu’il n’ya pas de commande + ExecStart +.

Vous pouvez tester le fonctionnement du nouveau service en l’arrêtant manuellement:

sudo systemctl stop logrotate-shutdown.service

ou en redémarrant votre système:

sudo reboot

Quelle que soit la méthode utilisée, la commande Logrotate est déclenchée et un nouveau fichier journal est chargé. Désormais, à moins d’un arrêt ingrat, vous ne perdrez aucun journal lors de la destruction d’un serveur.

Conclusion

Dans ce didacticiel, nous avons installé S3cmd, configuré pour se connecter à notre service de stockage d’objets et configuré pour charger les fichiers journaux Logrotate lorsqu’il fait pivoter + / var / log / syslog +. Nous avons ensuite configuré un service systemd pour exécuter + logrotate --force + à l’arrêt, afin de nous assurer de ne perdre aucun journal lors de la destruction de serveurs éphémères.

Pour en savoir plus sur les configurations disponibles pour Logrotate, reportez-vous à la page de manuel correspondante en tapant + man logrotate + sur la ligne de commande. Plus d’informations sur S3cmd sont disponibles sur their leur site web.