Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Archives pour août, 2009

Niveau : Star Star Star Star Empty
Résumé :accton ; ac ; sa ; lastcomm

Le noyau linux fournit une fonctionnalité ancienne, mais parfois bien utile nommée process accounting. Pour ceux qui compilent leur noyau elle est disponible dans les options générales sous le nom "BSD process accounting".

Pour pouvoir en profiter sur votre système, il faut aussi disposer des commandes disponibles dans le paquet acct. Ces commandes sont peu nombreuses. La première est accton qui active ou désactive l'accounting sur le système. La plupart des distributions incluent un fichier dans init.d appelant cette commande au démarrage.

Une fois l'accounting activé, les données liées aux processus sont stockées dans /var/log/account/pacct (ou équivalent). Les autres commandes du paquets servent à lire ces données.

Les plus importantes sont sa et lastcomm. Notons tout de même ac qui donne le temps de connexion total des utilisateurs et last (en provenance d'un autre paquet) indiquant les dates de connexion des utilisateurs. Un système non GNU vous proposerait des commandes supplémentaires.

sa permet d'obtenir des statistiques sur le lancement des processus.

lastcomm permet d'obtenir une liste de commandes lancées par utilisateur.

Usage

lastcomm permet de surveiller l'activité utilisateur sur le système. On peut ainsi retrouver qui a fait quoi en cas de problème (si vous pouvez garantir le fichier de log bien sûr :-). Un BOFH peut même s'amuser à espionner en temps réel ses utilisateurs avec un watch -d.

Quelques exemples :

# lister les commandes lancées récemment par un utilisateur
$ lastcomm user
# rechercher dans l'historique qui a lancé une commande donnée et quand
$ lastcomm apachectl
# savoir quelles commandes ont été lancées directement depuis le terminal physique de la machine 
$ lastcomm --tty tty1

sa de son côté permet de faire des statistiques et ainsi de savoir qui ou quoi consomme les ressources de la machine. Notez que le résultat inclue toujours une ligne sans nom, il s'agit du total. D'autre part il y a souvent une ligne ***other* contenant tout ce qui n'a été appelé qu'une fois résumé sur cette ligne.

Quelques exemples :

 
# lister commandes qui ont tourné le plus longtemps
$ sa --sort-real-time | head

# lister les commandes qui consomment le plus d'io
$ sa -d | head

# lister toutes les commandes avec l'utilisateur qui les a lancées
$ sa -u

# consommation par utilisateur
$ sa -m

La sortie contient en sortie le nombre d'appels, le temps passé, (re) la quantité de cpu consommé (cp en secondes), le nombre d'io moyen (avio, très pratique pour diagnostiquer quel processus utilise le disque), la mémoire consommée par seconde (k, cette valeur n'est pas très intuitive)

sa inclue aussi un système de summary des données que je n'ai jamais compris. Il est très mal documenté et n'a pas l'air de fonctionner sur GNU que sur les autres unix. La lecture du source ne m'a pas d'ailleurs convaincu sur son utilité. Si quelqu'un a une explication plus complète, je suis preneur.

Le manuel est un peu cryptique mais avec quelques essais on s'en sort. Si ces options ne vous conviennent pas, vous pouvez lire directement le fichier acct avec la commande dump-acct. Vous pouvez ainsi faire tout ce que vous voulez du contenu et scripter la récupération des résultats et le stockage pour des statistiques, par exemple dans rrdtool.

Niveau : Star Star Empty Empty Empty
Résumé :lo ; 127.0.0.1

L'interface de loopback se retrouve sur toutes les machines ou presque. pensez à l'activer si ce n'est pas fait par défaut car un certain nombre d'applications en dépendent et son absence peut parfois mener à des bugs inexplicables (à ce propos évitez de mettre un firewall bloquant 127.0.0.1 ...). Mais comment fonctionne-t-elle ?

Localhost

Tout d'abord l'adresse de loopback (127.0.0.1) permet par convention de contacter la machine locale sans passer par une interface qui serait accessible de l'extérieur. Cette fonctionnalité est en soit disponible sur n'importe quelle interface réseau. Il faut juste ajouter une entrée de firewall pour éviter l'accès depuis l'extérieur. Exemple pour prouver que c'est une ip comme une autre :

# on enlève le range d'ip de l'interface lo
$ ip addr del 127.0.0.1/8 dev lo
# on l'ajoute à une interface physique
$ ip addr add 127.0.0.1/8 dev eth0
# on teste
$ ping 127.0.0.1

En pratique, rien n'empêche cette ip d'être accessible publiquement si ce n'est que ce n'est pas recommandé et que linux ne répondra pas (je n'ai pas vraiment cherché à savoir pourquoi).

Device lo

Lo est l'interface de loopback. Celle sur laquelle on met habituellement l'adresse de localhost. Mais cela n'empêche de mettre d'autres ip sur cette interface. Dans un contexte de routeur c'est même très fréquent. Le routeur dispose d'un ip publique qui n'est sur aucune de ses interfaces.

Exemple :

$ ip addr add 172.16.20.1 dev lo
$ ping 172.16.20.1

Le but n'est pas de contacter localhost, mais de contacter le routeur depuis n'importe où, à travers n'importe quelle interface, cette ip est indépendante de l'état des différentes cartes réseaux.

Exemple dans lequel m1 serait un routeur ayant une interface 10.0.0.1 connectée à m2 directement sur le même réseau :

# Première machine
m1$ ip addr add 172.16.20.1 dev lo
m1$ echo 1 > /proc/sys/net/ipv4/ip_forward

# Deuxième machine, on contacte le loopback de m1
m2$ ip route add 172.16.20.1 via 10.0.0.1
m2$ ping 172.16.20.1

L'interface de m1 agit comme un routeur pour son ip de loopback.

Un autre usage particulier de cette adresse est d'autoriser plusieurs machines à disposer de la même ip, sans les annoncer sur le réseau (puisqu'elles ne sont sur aucune interface publique). On peut ainsi éviter les conflits (arp ...). C'est par exemple la solution retenue pour faire de la répartition de charge avec keepalived entre plusieurs serveurs ayant la même ip publique.

Niveau : Star Star Empty Empty Empty
Résumé : pam_unix sha512

Il y a quelques années, le format de stockage des mots de passe unix a changé, permettant de passer du trop simple DES à un algorithme de votre choix. Au passage le stockage s'est fait dans /etc/shadow pour limiter encore plus l'accès à la version chiffrée de ces mots de passe.

Traditionnellement on utilise un hashage MD5 des mots de passe, ce qui se reconnaît par un $1$ au début des mots de passe dans le fichier shadow.

Mais il se peut que vous n'ayez plus confiance en MD5, dans ce cas, rien ne vous empêche d'utiliser un autre algorithme. C'est très simple; il suffit de modifier /etc/pam.d/common-password ou l'équivalent de votre distribution avec la ligne suivante :

password   sufficient  pam_unix.so min=4 sha256

Et changez votre mot de passe, vous verrez alors le préfixe devenir $5$ dans le fichier shadow. Les valeurs possibles sont les suivantes :

  • md5 : $1$
  • sha265 : $5$
  • sha512 : $6$
  • blowfish : $2a$ (déclaré comme fonctionnel seulement sur certaines distributions)

Si la valeur n'est pas comprise par pam_unix c'est la valeur par défaut (MD5) qui sera utilisée.

Sinon tant que vous êtes là à regarder bêtement votre configuration pam, profitez-en pour mettre en place pam_cracklib.

Niveau : Star Star Star Empty Empty
Résumé : syslog-ng

Syslog-ng est un système de log qui est maintenant installé par défaut sur un certain nombre de distributions. Mais on l'utilise rarement au mieux de ses capacités.

Syslog-ng permet de faire un filtrage des logs, de centraliser un système de logs et d'avoir une configuration simple et plus souple.

Configuration de base

Le fichier de configuration de syslog-ng est très structuré. On y définit deux choses : des options et des logs.

Les options sont globales au système de log et les logs sont un ensemble de règles s'appliquant à une entrée de logs. Ces règles sont elles-mêmes définies par : des sources, des filtres, des destinations et éventuellement des flags.

Voila, je vous ai décrit la structure d'un fichier de configuration. Passons rapidement sur les éléments les plus importants, les logs.

Une entrée log se définit assez aisément comme suit :

source -> filtre -> destination

Syslog-ng sait lire un bon nombre de sources dont :

  • un pipe unix
  • un fichier spécial tel que /proc/kmsg sous linux
  • un pipe
  • un port tcp ou udp

Un filtre permet de ne garder qu'une partie des logs qu'on donne à syslog pour stockage. Syslog-ng sait filtrer en fonction de qui ou quoi a envoyé le message :

  • en fonction du niveau de gravité
  • en fonction de la "facility"
  • en fonction d'expression régulières ...

Une "facility" est en fait une catégorie de logs. Un certain nombre (24) de ces catégories sont prédéfinies, il est possible d'en définir de nouvelles, mais rares sont ceux qui le font.

Syslog-ng sait écrire dans un bon nombre de destinations dont :

  • un fichier
  • un pipe
  • une socket unix
  • une commande
  • un port udp ou tcp
  • et même un terminal

Une destination peut être accompagnée d'un template, qui est en fait un format de log.

Voila, maintenant, vous savez-tout, c'est parti.

Écriture de nouveau logs

Si vous développez un nouveau logiciel qui doit fournir des logs, vous pouvez utilisez les fonctions suivantes :

#include <syslog.h>

void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);

Si vous développez en shell, vous allez utiliser logger.

Et enfin, si vous voulez tester votre installation, vous allez utiliser loggen fourni avec syslog-ng, exemple :

$ loggen -r 10 -I 10 -D localhost 514

Attention, cela génère beaucoup de logs et utilise la "facility" auth.

Configuration serveur

Tout comme l'ancien syslog, syslog-ng permet de fonctionner en mode client-serveur, mais de façon beaucoup plus complète (possibilité de changer de port, d'utiliser tcp et ipv6). Vous pouvez vouloir externaliser le système de log pour plusieurs raisons. On peut faciliter le traitement des logs en les stockant sur une base de données, on peut aussi sécuriser les logs pour les protéger contre un effacement et faciliter l'analyse post-mortem en cas de problème.

Stockage sur une base de données

Syslog-ng permet un un stockage des logs sur une base mysql. Ceci permet pour ceux qui traitent beaucoup de logs ou disposent de système de traitement personnels de leur faciliter le travail.

La méthode sera plus simple lorsque syslog-ng 3 sera dans les bacs, mais en attendant, il faut écrire soi même la ligne de commande permettant d'envoyer des logs à mysql.

Exemple :

#attention, c'est à vous de faire un .my.cnf contenant login et mot de passe pour éviter de les voir apparaitre en ligne de commande
# Vous pouvez choisir le format de table que vous voulez
destination d_mysql {
        program("mysql -B -s --reconnect database > /dev/null"
        template("INSERT INTO logs (host, facility, priority,
			level, tag, datetime, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL',
			'$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n")
        template-escape(yes)
	);
};

Et voilà, il ne vous reste plus qu'à effectuer votre traitement personnalisé en SQL.

Par contre, pour ceux qui espéraient se simplifier le traitement des logs apache ... vous avez perdu, apache n'utilise pas nativement syslog. Vous pouvez soit modifier la configuration apache pour le forcer à utiliser syslog (plus besoin de reloader apache pour le logrotate), soit lui dire d'envoyer ses logs directement à mysql, soit de charger les logs une fois par jour dans un serveur sql juste avant le traitement.

Centralisation sur un serveur distant

Il existe un protocole syslog (mis à jour depuis) définissant un moyen de communiquer des logs sur le réseau en UDP. Syslog-ng implémente ce protocole à la fois d'un point de vue client et d'un point de vue serveur. Vous pourrez ainsi garantir à votre patron que vous êtes capables de lui fournir les logs quoi qu'il arrive au serveur.

Coté client : il suffit de définit une destination de type udp et de créer une entrée logs pour envoyer les logs que vous avez sélectionné.

source distant_hosts { udp(); };

Coté serveur, qu'on appelle généralement loghost : il suffit de définir une source de type udp et de créer une entrée logs pour stocker tous ces logs quelque part.

destination loghost { udp("loghost.work.net" port (514)); };

Notez qu'il y a plusieurs inconvénients à utiliser udp : les paquets peuvent être perdus, le traffic transite en clair sur le réseau, et n'importe qui peut envoyer des paquets. Pour palier le premier problème, syslog-ng implémente un protocole TCP, pour les deux autres, il est possible de passer par des tunnels sécurisés.

Notez qu'il y a aussi un inconvénient à utiliser tcp : la machine qui reçoit les logs est un peu plus chargée car elle doit deviner d'elle même quand commence et quand se termine un log et donc gérer des morceaux de logs et le buffer associé.

Dans les deux cas pensez à implémenter un firewall local pour éviter les surprises.

Pour mettre en place un chiffrement des communications, voici un exemple de solution à base de stunnel.

Attention à votre configuration lorsque vous transmettez des logs, le format est modifié car ceux-ci sont traités plusieurs fois. Certaines options comme chain_hostnames peuvent vous en casser le parsing. Regarder aussi keep_hostname qu'il est préférable de mettre à yes sur les loghost et ne bidouillez pas trop vos template, sauf sur le loghost final.

Astuces

  • Que vous soyez sur un loghost ou non, évitez d'utiliser les dns vous risquez de surcharger la machine
options { use_dns(no); };
  • Si vous avez des serveurs un peu chargés ou des loghost qui font de l'archivage, il peut être intéressant d'utiliser un nom de fichier variable pour stocker vos logs : pas besoin de relancer syslog, pas besoin de renommer vos fichiers.
destination my_file { file("/var/log/file-$YEAR-$MONTH-$DAY"); };
  • Essayez de bien définir les droits de lecture pour le groupe et les droits d'écriture pour le démon, pour permettre d'autoriser certains utilisateurs à lire les logs mais de leur interdire d'y écrire.
options {
  owner(root);
  group(adm);
  perm(0640);
  dir_owner(root);
  dir_group(adm);
  dir_perm(0750);
};
  • Si vous êtes fréquemment connectés sur vos machines ou vos loghosts, essayez de mettre en place une destination usertty(vous) pour les logs les plus graves.
destination tty { usertty("administrator"); };
  • Si vous avez des machines utilisant un ancien démon syslog, il est toujours possible de l'utiliser pour envoyer des logs à distance à un serveur syslog-ng en udp. Exemple de configuration :
kern.* @loghost #(udp IPv4 port 514 uniquement)
  • Si votre serveur de log est un tant soit peu chargé, essayez de jouer avec l'option flush_lines pour regrouper les écritures. Attention, cela veut dire qu'il se peut que les dernières lignes de logs ne soient pas encore écrites lorsque vous les lirez
options {
  flush_lines(10);
# écrire les lignes si le buffer n'est pas plein après 1000ms
  flush_timeout(1000);
};
  • Si vous êtes un adepte de jabber, vous pouvez vous envoyer vos logs les plus importants directement par xmpp

Pour une référence sur la configuration, suivez mon doigt.

Un peu de lecture pour vous faire patienter avant un prochain article plus intéressant.

Ça y est, c'est le grand jour !

Le moteur du site a changé et au passage son apparence. Pour info j'utilise maintenant wordpress.
Il y a encore quelques petites choses à mettre à jour et quelques petits bugs. Il est possible qu'un certain nombre de flux, par catégorie notamment, ne fonctionne plus. Je vais tenter de les remettre.

Répondez au nouveau sondage visible à droite, et si vous rencontrez un quelconque problème, n'hésitez pas à me le signaler en commentaire.

Non je ne suis pas mort. Imaginez simplement que j'étais en vacances.

Je suis en train de refaire le site et de changer de moteur. Cela implique un certain nombre de tests pour garder les fonctionnalités. Mais cela me permettra de m'amuser avec plein de nouveaux plugins, et surtout je pourrai choisir un thème convenable.

Par contre cela veut dire qu'il est possible qu'un certain nombre de choses ne marchent plus. Je fais tout mon possible pour conserver toutes les url, mais je ne pourrai peut-être pas garder les flux de commentaires tous fonctionnels, il y aura des redirect, mais il semble que certains lecteurs de flux ne les supportent pas.

Cela veut aussi dire que dès que le site est refait, c'est reparti pour de nouveaux articles, que j'espère toujours aussi passionnants, et toujours plus nombreux.