X

Utiliser awk pour analyser les fichiers journaux


Chaque administrateur système Linux sait que les fichiers journaux font partie de la vie. Chaque fois qu’il y a un problème, les fichiers journaux sont le premier endroit où aller pour diagnostiquer presque tous les types de problèmes possibles. Et, blague à part, ils peuvent même parfois proposer une solution. Les administrateurs système savent également que parcourir les fichiers journaux peut être fastidieux. Regarder ligne après ligne après ligne peut souvent conduire à voir “la même chose” partout et à manquer complètement le message d’erreur, surtout quand on n’est pas sûr de ce qu’il faut rechercher pour commencer.

Linux propose de nombreux outils d’analyse de journaux, à la fois open source et sous licence commerciale, à des fins d’analyse des fichiers journaux. Ce tutoriel introduira l’utilisation du très puissant ok utilitaire pour «extraire» les messages d’erreur de divers types de fichiers journaux afin de faciliter la recherche de l’endroit (et du moment) où les problèmes se produisent. Pour Linux en particulier, ok est implémenté via l’utilitaire gratuit GNU rester bouche béeet l’une ou l’autre commande peut être utilisée pour invoquer ok.

Décrire ok uniquement comme un utilitaire qui convertit le contenu textuel d’un fichier ou d’un flux en quelque chose qui peut être adressé de manière positionnelle est de faire ok un très mauvais service, mais cette fonctionnalité, combinée à la structure monotone et uniforme des fichiers journaux, en fait un outil très pratique pour rechercher très rapidement les fichiers journaux.

Pour cela, nous verrons comment travailler avec ok pour analyser les fichiers journaux dans ce didacticiel d’administration système.

Lire: Logiciels et outils de gestion de projet pour les développeurs

Comment cartographier les fichiers journaux

Toute personne familiarisée avec les fichiers de valeurs séparées par des virgules (CSV) ou les fichiers délimités par des tabulations comprend que ces fichiers ont la structure de base suivante :

  • Chaque ligne, ou ligne, du fichier est un enregistrement
  • Dans chaque ligne, la virgule ou la tabulation sépare les “colonnes” individuelles
  • Contrairement à une base de données, le format des données des “colonnes” n’est pas garanti d’être cohérent

Revenons à notre tutoriel, Scraping de texte en Python cela ressemble un peu à ce qui suit :

Figure 1 – Un exemple de fichier CSV avec de faux numéros de sécurité sociale

Figure 2 – Les mêmes données, examinées dans Microsoft Excel

Dans ces deux figures, la “grille de coordonnées” évidente saute aux yeux. Il est facile d’extraire une information particulière simplement en utilisant ladite grille. Par exemple, la valeur 4235 vit à rang 5, colonne D du fichier ci-dessus.

Certains lecteurs disent sans doute que “cela ne fonctionne bien que si les données sont uniformément structurées comme dans cet exemple idéalisé!” Mais la grande chose à propos ok est-ce ce n’est pas une exigence. La seule chose qui compte lors de l’utilisation ok pour l’analyse des fichiers journaux est que les lignes individuelles mises en correspondance ont une structure uniforme, et pour la plupart des fichiers journaux des systèmes Linux, c’est très certainement le cas.

Cette caractéristique peut être vue dans la figure ci-dessous pour un exemple /var/log/auth.log fichier sur un serveur Ubuntu 22.04.1 LTS :

Figure 3 – Un exemple de fichier journal, montrant une structure uniforme entre chacune des lignes.

Si chaque ligne d’un fichier journal est un enregistrement et si un espace est utilisé comme délimiteur, les identifiants numériques suivants peuvent être utilisés pour chaque mot de chaque ligne du fichier journal :

Figure 4 – Identifiants numériques pour chaque mot d’une ligne.

Chaque ligne du fichier journal commence par les mêmes informations :

  • Colonne 1 : Abréviation du mois
  • Colonne 2 : Jour du mois
  • Colonne 3 : Heure de l’événement au format 24 heures
  • Colonne 4 : Nom d’hôte
  • Colonne 5 : Nom du processus et PID

Notez que tous les fichiers journaux ne ressembleront pas à ceci ; les formats peuvent varier énormément d’une application à l’autre.

Ainsi, en examinant la figure ci-dessus, le moyen le plus simple de tirer a échoué chut logins pour cet hôte serait de rechercher les lignes de journal dans /var/log/auth.logqui ont le texte Échoué pour colonne 6 et mot de passe pour colonne 7. Les colonnes numériques sont précédées du signe dollar ($), avec 0 $ représentant toute la ligne en cours de traitement. En utilisant le ok commande ci-dessous :

$ awk '($6 == "Failed") && ($7 == "password") { print $0 }' /var/log/auth.log

Remarque : selon les configurations d’autorisation, il peut être nécessaire de préfixer la commande ci-dessus avec sudo.

Cela donne la sortie suivante :

Figure 5 – Les entrées de journal qui ne contiennent que des tentatives de connexion ssh infructueuses.

Comme ok est également un langage de script à part entière, il n’est pas surprenant que sa syntaxe puisse sembler familière aux administrateurs système qui connaissent également le codage. Par exemple, la commande ci-dessus peut être implémentée comme suit, si l’on préfère un style plus “codant” :

$ awk '{ if ( ($6 == "Failed") && ($7 == "password") ) { print $0 } }' /var/log/auth.log

Ou:

$ awk '\
{ \
 if ( ($6 == "Failed") && ($7 == "password") ) \
  { \
   print $0 \
  } \
}' /var/log/auth.log

Dans les deux lignes de commande ci-dessus, les crochets et parenthèses supplémentaires sont en gras. Les deux donneront le même résultat :

Figure 6 – Mélanger et assortir les entrées awk

La logique de correspondance de texte peut être aussi simple ou aussi complexe que nécessaire, comme indiqué ci-dessous.

Lire: Les meilleurs outils pour les développeurs distants

Comment effectuer une correspondance étendue

Bien sûr, une connexion invalide via chut n’est pas le seul moyen d’être répertorié comme une connexion ayant échoué dans le /var/log/auth.log déposer. Considérez l’extrait suivant du même fichier :

Figure 7 – Entrées de journal pour les échecs de connexion directe

Dans ce cas, les colonnes 6 $ et 7 $ avoir les valeurs ÉCHOUÉ et CONNEXION, respectivement. Ces échecs de connexion proviennent de tentatives de connexion à partir de la console.

Il serait, bien sûr, commode d’utiliser un seul ok call pour gérer les deux conditions, par opposition à plusieurs appels, et, naturellement, essayer de taper un script quelque peu complexe sur une seule ligne serait fastidieux. Pour “avoir notre gâteau et le manger aussi”, un script peut être utilisé pour contenir la logique des deux conditions :

#!/usr/bin/awk -f

# parse-failed-logins.awk

{
 if ( ( ($6 == "Failed") && ($7 == "password") ) ||
  ( ($6 == "FAILED") && ($7 == "LOGIN") ) )
  {
   print $0
  }
}

Noter que ok les scripts ne sont pas du texte de forme libre. Bien qu’il soit tentant de “mieux” organiser ce code, cela conduira probablement à des erreurs de syntaxe.

Alors que le code du ok le script ressemble beaucoup à “C-Like”, malheureusement, il ressemble le plus à n’importe quel autre script Linux ; le fichier parse-failed-logins.awk nécessite des autorisations d’exécution :

$ chmod +x parse-failed-logins.awk

La ligne de commande suivante exécute ce script, en supposant qu’il se trouve dans le répertoire de travail actuel :

$ ./parse-failed-logins.awk /var/log/auth.log

Par défaut, le répertoire courant ne fait pas partie du chemin par défaut sous Linux. C’est pourquoi il faut préfixer un script dans le répertoire courant avec ./ lors de son exécution.

La sortie de ce script est illustrée ci-dessous :

Figure 8 – Les deux types d’échecs de connexion

Le seul inconvénient du journal est que les noms d’utilisateur non valides ne sont pas enregistrés lorsqu’ils tentent de se connecter à partir de la console. Ce script peut être encore simplifié en utilisant le baisser fonction pour convertir la valeur en 6 $ en minuscule :

#!/usr/bin/awk -f

# parse-failed-logins-ci.awk

{
 if ( tolower($6) == "failed" )
  {
   if ( ($7 == "password") || ($7 == "LOGIN") )
    {
     print $0
    }
  }
}

Notez que le -F t la fin de #!/usr/bin/awk-f en haut de ces scripts est très important !

Autres sources de journalisation

Vous trouverez ci-dessous une liste de certaines des autres sources de journalisation potentielles que les administrateurs système peuvent rencontrer.

journald/journalctl

Bien entendu, le texte des fichiers journaux n’est pas la seule source d’informations relatives à la sécurité. CentOS et Red Hat Enterprise Linux (RHEL), par exemple, utilisent journald pour faciliter l’accès aux informations de connexion :

$ journalctl -u sshd -u gdm --no-pager

Cette commande passe deux unitésà savoir sshd et gdmdans journalctlcar c’est ce qui est nécessaire pour accéder aux informations de connexion dans CentOS et RHEL.

Notez que, par défaut, journalctl pages sa sortie. Cela rend difficile pour ok travailler avec. Le –pas de téléavertisseur l’option désactive la pagination.

Cela donne la sortie suivante :

Figure 9 – Utilisation de journalctl pour obtenir les informations de connexion liées à ssh

Comme on peut le voir ci-dessus, alors que gdm indique qu’une tentative de connexion a échoué, il ne précise pas le nom d’utilisateur associé à la tentative. Par conséquent, cette unité ne sera pas utilisée dans les démonstrations ultérieures de ce didacticiel ; cependant, d’autres unités spécifiques à une distribution Linux particulière pourraient être utilisées si elles fournissent ces informations.

Ce qui suit ok Le script peut analyser les échecs de connexion pour CentOS :

#!/usr/bin/awk -f

# parse-failed-logins-centos.awk

{
 if ( (tolower($6) == "failed") && ($7 = "password") )
	{
 	print $0
	}
}

La sortie de journalctl peut être raccordé directement dans ok via la commande :

$ ./parse-failed-logins-centos.awk < <(journalctl -u sshd -u gdm --no-pager)

Ce type de tuyauterie est connu sous le nom de Substitution de processus. La substitution de processus permet d’utiliser la sortie de la commande de la même manière qu’un fichier.

Notez que l’espacement des signes inférieur à et des parenthèses est essentiel. Cette commande ne fonctionnera pas si l’espacement et la disposition des parenthèses ne sont pas corrects.

Cette commande donne le résultat suivant :

Figure 10 – Canalisation de la sortie journalctl dans awk

Une autre façon d’effectuer cette tuyauterie consiste à utiliser la commande :

$ journalctl --no-page -u sshd | ./parse-failed-logins-centos.awk

SELinux/audit.log

SELinux peut être une bouée de sauvetage pour un administrateur système, mais un cauchemar pour un développeur de logiciels. Il est de par sa conception opaque avec sa messagerie, sauf en ce qui concerne la journalisation, auquel cas il peut être presque aussi utile.

Les journaux SELinux sont généralement stockés dans /var/log/audit/audit.log. Comme c’est le cas avec tout autre fichier journal soumis à rotation, des itérations précédentes de ces journaux peuvent également être présentes dans le /var/log/audit annuaire. Vous trouverez ci-dessous un exemple d’un tel fichier, avec les refusé drapeau mis en surbrillance.

Figure 11 – Un fichier audit.log typique de SELinux

Dans ce contexte précis, SELinux interdit l’Apache httpd démon d’écrire dans des fichiers spécifiques. Ce n’est pas la même chose que les permissions Linux interdisant une telle écriture. Même si le compte utilisateur sous lequel Apache httpd est en cours d’exécution a un accès en écriture à ces fichiers, SELinux interdira la tentative d’écriture. Il s’agit d’une bonne pratique de sécurité courante qui peut aider à empêcher le code malveillant qui a pu être téléchargé sur un site Web d’écraser le site Web lui-même. Cependant, si une application Web est conçue en partant du principe qu’elle doit pouvoir écraser les fichiers de son répertoire, cela peut entraîner des problèmes.

Il convient de noter que, si une application Web est conçue pour avoir un accès en écriture à son propre répertoire Web et qu’elle est bloquée par SELinux, la meilleure pratique consiste à “retravailler” l’application afin qu’elle écrive dans un autre répertoire à la place. La modification des politiques SELinux peut être très risquée et ouvrir un serveur à de nombreux autres vecteurs d’attaque.

SELinux contrôle généralement de nombreux processus différents dans de nombreux contextes différents au sein de Linux. Le résultat de ceci est que le /var/log/audit/audit.log le fichier peut être trop volumineux et “désordonné” pour pouvoir les analyser simplement en regardant. À cause de ce, ok peut être un outil utile pour filtrer les parties du /var/log/audit/audit.log fichier qu’un administrateur système n’est pas intéressé à voir. L’appel simplifié suivant à ok le filtre donnera les résultats souhaités, dans ce cas la recherche de valeurs correspondantes dans les colonnes 4 $ et 10 $:

$ sudo awk '($4 == "denied" ) && ($10=="comm=\"httpd\"") { print $0 }' /var/log/audit/audit.log

Notez comment cette commande intègre à la fois sudo car ce fichier appartient à root, ainsi que l’échappement pour le com = “httpd” entrée. Vous trouverez ci-dessous un exemple de sortie de cet appel :

Figure 12 – Sortie filtrée via la commande awk.

Il est typique qu’il y ait beaucoup, beaucoup, beaucoup d’entrées qui correspondent aux critères ci-dessus, car les serveurs Web accessibles au public sont souvent soumis à des attaques constantes.

Réflexions finales sur l’utilisation d’Awk pour analyser les fichiers journaux

Comme indiqué précédemment, le ok Le langage est vaste et tout à fait capable de toutes sortes de tâches utiles d’analyse de fichiers. La Free Software Foundation maintient actuellement le rester bouche bée utilitaire, ainsi que sa documentation officielle. C’est l’outil gratuit idéal pour effectuer une analyse de journal de précision étant donné l’avalanche d’informations que Linux et ses logiciels fournissent généralement dans les fichiers journaux. Comme le langage est conçu strictement pour extraire des flux de texte, ses programmes sont beaucoup plus concis et plus courts que les programmes écrits dans des langages plus généraux pour les mêmes types de tâches.

Le ok L’utilitaire peut être incorporé dans l’analyse de fichiers texte sans surveillance pour à peu près n’importe quel format de fichier texte structuré, ou si l’on ose, même les formats de fichiers texte non structurés. C’est l’un des outils “méconnus” et parfois négligés de l’arsenal d’un administrateur système qui peut rendre ce travail beaucoup plus facile, en particulier lorsqu’il s’agit de volumes de données en constante augmentation.

Lire: Meilleurs outils de productivité pour les développeurs