Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Tag: Système

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é : 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.

Niveau : Star Star Star Star Empty
Résumé :

Suite de la formidable série :

Et après les comptes ?

Il est aussi possible d'utiliser libnss-ldap pour autre chose que pour les comptes utilisateurs. La bibliothèque NSS étant une bibliothèque générique de résolution de nom, il est possible d'utiliser le ldap pour :

  • les groupes (attention pas de login pour newrp à travers pam de prévu)
  • les noms de machine
  • et d'autres qui ne pas très intéressants pour l'instant ...

Pour cela, rien de plus facile, tout est déjà fait, il suffit de modifier la ligne correspondante dans /etc/nsswitch.conf et de commencer à peupler le LDAP.

Un groupe est définit comme suit :

objectClass: posixGroup
cn: mongroupe
description: goupe a moi
gidNumber: 1000
memberUid: peck
memberUid: amiami

Notez que la description est optionnelle et que les membres sont décrits par uid. Le userPassword est aussi disponible mais n'est pas utilisable actuellement pour les groupes du système.

Exemple de machine (plus besoin de DNS local ;-) :

objectClass: ipHost
cn: mamachine
ipNetworkNumber: 1.2.3.4

S'adapter à l'existant

Il est possible que vous ayez à gérer un serveur ldap existant avec ses comptes et son propre schéma (active directory ?). C'est pourquoi il existe des options de mapping dans la configuration de pam_ldap et nss_ldap.

Ces options sont assez simples, il s'agit de reparcourir votre schéma et pour chaque entrée nécessaire pour le système, expliquer au fichier de configuration quel est le nom de l'attribut ou de la classe que vous utilisez sur le ldap. Ceci est à faire une fois pour nss et une fois pour pam.

Les commandes sont :

  • nss_map_objectclass : changer une classe utilisée par libnss-ldap
  • nss_map_attribute : changer un attribut utilisé par libnss-ldap
  • nss_default_attribute_value : donner une valeur par défaut à un attribut (pratique pour le shell par exemple)
  • pam_login_attribute : change l'attribut servant à matcher le login pendant l'authentification
  • Il n'est pas possible de changer l'attribut utilisé par pam pour le mot de passe (normal c'est le serveur ldap qui gère).

Les classes modifiables (en restant dals le domaine utilisateur/groupe) sont

  • posixAccount : utilisateur ayant un compte unix
  • shadowAccount : utilisateur ayant un système avancé de gestion de mot de passe
  • posixGroup: groupe unix

Les attributs modifiables sont : uidNumber, gidNumber, gecos, homeDirectory, loginShell, shadowLastChange, shadowMin, shadowMax, shadowWarning, shadowInactive, shadowExpire, shadowFlag, memberUid

Plus de détails (et plus de clesses) dans la RFC 2307.

La configuration fournie avec le paquet donne des exemples pour les différents systèmes existants (aix, microsoft ...)

libnss-ldapd

Maintenant vous pourriez avoir d'autres problèmes, comme la performance ou quelques hoquets du réseau qui coupent des connexions. La solution traditionnelle pour cela est d'installer nscd qui fera un cache et vous évitera ces problèmes (et peut en créer d'autres puisque c'est un cache).

Mais il existe une autre solution : libnss-ldapd, notez bien le 'd' final. C'est une version de libnss-ldap réécrite pour parler à un démon qui est le seul à parler avec le serveur ldap. Ça a l'avantage de mutualiser les requêtes dans une seule connexion et donc d'éviter pas mal de problèmes, surtout en cas de forte charge.

Petit inconvénient pour les puristes, ça ouvre une faille potentielle (inconnue à ce jour) pour un utilisateur qui voudrait devenir administrateur via le serveur ldap, puisque ce n'est plus le noyau qui vérifie les droits root d'administration mais le démon.

Le démon se configure dans /etc/nss-ldapd.conf. La syntaxe est la même que pour pam_ldap et libnss-ldap, le contenu ne doit pas changer.

Le démon est du coup assez important, il faut vérifier qu'il est lancé (monitorer toussa ...). Il s'appelle nslcd.

Sécurité et performances

Si vous avez beaucoup d'utilisateurs vous pouvez vouloir restreindre les recherches.
Si vous avez des utilisateurs qui ne doivent pas tous avoir accès au système, vous pouvez vouloir restreindre les recherches.

C'est pourquoi nss et pam fournissent des directives pour réduire la taille des recherche et donc la liste des utilisateurs :

  • base : réduit l'accès à toutes les commandes LDAP à une seule branche
  • scope : indiquer si la recherche doit tester les sous branches ou non
  • nss_base_<map> : permet d'indiquer à ldap de se limiter à une requête pour un type donné de résolution, map peut valoir passwd, shadow ou group (ou hosts, services, networks, protocols, rpc, ethers, netmasks, bootparams, aliases ou netgroup). Exemple : nss_base_passwd ou=users,dc=linux-attitude,dc=fr?sub?uid>1000
  • pam_filter : permet de modifier la partir filtre pour pam (pas besoin de modifier le reste car il n'y a qu'une requête faite par pam). Exemple : pam_filter uid>1000

Niveau : Star Star Star Star Empty
Résumé : libmap-ldap ; passwd ; chsh ; chfn ; adduser

Désolé, j'ai oublié la suite de la série LDAP. On peut faire un peu mieux que la dernière fois.

Changer son mot de passe

Nous n'avons pas activé le changement de mot de passe. Pour cela, c'est assez simple, il suffit de modifier common-password (cela peut être ailleurs pour certaines distributions ...) :

password   sufficient   pam_unix.so nullok obscure min=4 max=8 md5
password   sufficient   pam_ldap.so

Il faut aussi modifier /etc/pam_ldap.conf pour que pam ne modifie pas directement le mot de passe, mais utilise les fonctions de ldap prévues à cet effet. Cela permet qu'il ne soit pas stocké en clair, mais avec la méthode définie dans la configuration de ldap ({SSHA} par défaut).

# A ajouter dans /etc/pam_ldap.conf
pam_password exop

Et voilà vous pouvez tester la commande passwd. Mais vous constaterez qu'il y a quelque chose qui cloche. Si vous lancez la commande en root, l'ancien mot de passe vous est quand même demandé. C'est parce que vous n'avez pas les droits d'administrateur sur le ldap.

Pour remédier à cela, il vous faut un compte ldap qui a le droit de modifier le champ password des autres utilisateurs, par exemple l'administrateur ldap. Puis renseignez ce compte dans pam_ldap.conf :

# /etc/pam_ldap.conf
# Il faudra stocker le mot de passe correspondant en clair dans /etc/pam_ldap.secret
# Ce fichier doit appartenir à root et être en mode 600
rootbinddn cn=admin,dc=linux-attitude,dc=fr

Ça y est vous êtes prêts.

chsh, chfn, adduser

Les utilisateurs ont le droit de changer leur shell ainsi que leurs informations personnelles. Pour cela ils ont les commandes chsh et chfn.

Malheureusement ces commandes manipulent /etc/passwd. Le paquet libpam-ldap fournit des script pour remplacer ces commandes, mais ils sont un peu basiques et nécessitent libnet-ldap-perl (Net::LDAP). Vous pouvez vous baser dessus pour faire les votres si vous pensez que ces fonctionnalités sont indispensables pour vos utilisateurs. On les trouve dans /usr/share/doc/libpam-ldap/examples/ . un certain nombre de paramètres sont codés en dur et peu de vérifications d'erreur sont faites.

Si vous modifiez vos binaires dans /usr/bin sur debian, faites attention la prochaine mise à jour risque de les remplacer. Pour éviter ce problème, il existe la commande dpkg-divert :

# On fait croire aux paquets qu'ils installent /usr/bin/chfn alors qu'ils installent en réalité /usr/bin/chfn.old
$ dpkg-divert --add --rename --divert /usr/bin/chfn.old /usr/bin/chfn
# voila, vous pouvez maintenant remplacer /usr/bin/chfn

Autre problème, adduser ne comprend pas non plus le ldap. Ici le problème est le même mais la solution un peu meilleure. Un paquet ldapscripts est disponible et il contient des commandes comme ldapadduser pour vous faciliter la création d'utilisateurs ldap. Les commandes sont configurées dans /etc/ldapscripts/ .

Tout ceci pourrait s'améliorer dans de prochaines versions, un patch a l'air en cours de développement pour le paquet shadow (qui contient ces outils) qui utiliserait la libnss pour effectuer ces actions. Les commandes fonctionneraient donc directement.

Quelques remarques

Depuis que nous avons des vrais comptes systèmes basés sur le ldap nous sommes contents. Mais quelques petites choses tout de même :

  • Gardez le compte root sur le système, on ne sait jamais, si le ldap tombe, vous seriez bien embêtés
  • Faites attentions aux droits dans le ldap, ils impactent les fonctionnalités des commandes systèmes (droit de lister les autres utilisateurs par exemple)
  • Avec un serveur distant, le ldap devient une forme de NIS
  • Vous pouvez utilisez la réplication ldap pour résister aux crash
  • Vous pouvez toujours garder une mot de passe local au cas où le ldap ne marche pas (pam fait les 2)
  • Vous pouvez vous connecter à un controleur de domaine windows
  • Si vous avez de problèmes les logs d'authentification sont dans /var/log/auth.log
  • Vous pouvez vouloir ne mettre en place que l'authentification via pam et ne pas utiliser libnss. Ce cas correspond à des utilisateurs virtuels (comme pour le ftp) qui n'utiliseront pas alors de vrai compte sur le système.

Niveau : Star Star Star Empty Empty
Résumé : libpam-ldap

Hier nous avons créé un compte sur le ldap. Bien, mais on ne pouvait pas en faire grand chose. Il faut maintenant pouvoir se connecter. Il est théoriquement possible de tout faire avec libnss mais c'est à la fois plus difficile et moins fonctionnel qu'avec pam.

Comme vous le savez l'authentification sous linux se fait avec PAM. Nous allons donc utiliser un module dédié : libpam-ldap (cool le paquet porte le même nom).

LDAP

Cette fois ne nous force à utiliser aucun objectClass, mais comme il sait utiliser les attributs de la classe shadowAccount, on peut utiliser celle-ci pour se simplifier la vie.

Ajoutons le mot de passe à notre utilisateur. On crée le mot de passe LDAP à la main, mais par la suite vous verrez que ce n'est pas indispensable.

$ slappasswd -s test
{SSHA}l5X6sBFomfk3tk02HEMWK4YLep7pqZDk

On ajoute ce mot de passe à l'utilisateur déjà créé :

$ ldapmodify -x -D "cn=admin,dc=linux-attitude,dc=fr" -W
dn: uid=peck,ou=people,dc=linux-attitude,dc=fr
changetype: modify
add: userPassword
userPassword: {SSHA}l5X6sBFomfk3tk02HEMWK4YLep7pqZDk

Un test de connexion avec ldapsearch vous montrera que le mot de passe est bien pris en compte :

$ ldapsearch -x -D "uid=peck,ou=people,dc=linux-attitude,dc=fr" -w test "uid=peck"

PAM

Maintenant il faut expliquer gentiment à PAM d'aller faire son authentification en utilisant LDAP. Pour cela hop, configuration dans /etc/pam.d/common-*. Certaines distributions devront peut-être configurer chaque élément un par un : su, login, ssh ...

# common-auth
# attention, le pam_unix devient sufficient
auth    sufficient    pam_unix.so nullok_secure nodelay
# use_first pass permet de ne demander qu'une fois les mot de passe pour les 2 modules
auth    sufficient    pam_ldap.so use_first_pass 
# common-account
account    required    pam_unix.so
account    sufficient   pam_ldap.so
# common-session
session    required    pam_unix.so
session    optional    pam_ldap.so

Maintenant attaquons-nous au fichier de configuration proprement dit : /etc/pam_ldap.conf. En voici l'essentiel :

# /etc/pam_ldap.conf
base ou=people,dc=linux-attitude,dc=fr
uri ldap://127.0.0.1/
ldap_version 3

Vous remarquerez que pam_ldap.conf et libnss-ldap.conf ne rentrent jamais en conflit. Vous pouvez faire un lien de l'un vers l'autre ou modifier la configuration pour que ce soient les mêmes fichiers. Cela peut vous éviter quelques désagréments.

Test

Maintenant tout marche, même l'authentification. Faites le test :

$ su - peck
Password:
$ id
peck

Youpi, ça marche même en ssh. Bon c'est bien gentil, mais c'est encore un peu léger. La prochaine fois , on voudrait pouvoir faire encore plus.

Niveau : Star Star Star Empty Empty
Résumé : nss-ldap

Il y a plusieurs façon de gérer ses comptes par ldap. Commençons par la plus simple. Plaçons-nous dans le cas d'une machine qui a des utilisateurs systèmes stockés sur le ldap.

Les utilisateurs sont gérés par la bibliothèque de nom nommée NSS (et là). Cette bibliothèque se configure dans /etc/nsswitch.conf. En supposant qu'on ait déjà un serveur ldap avec des utilisateurs, il suffit donc de modifier ce fichier ainsi que d'ajouter un fichier de configuration spécifique à nss-ldap.

Serveur LDAP

Supposons que vous ayez déjà un serveur installé (apt-get install slapd), avec un suffixe nommé dc=linux-attitude,dc=fr.

Si vous n'avez pas encore d'arborescence avec des utilisateurs, choisissez en une, par exemple ou=people,dc=linux-attitude,dc=fr.

Et peuplons d'utilisateurs notre arbre (je ne vais pas vous apprendre le LDAP). Attention, ici il faut utiliser la classe posixAccount pour les utilisateurs que nous allons créer. Il est possible de faire autrement, mais nous verrons ça plus tard.

Créons un utilisateur avec un uid qui ne rentrera pas en conflit avec les utilisateurs existants pour mieux tester. Utilisons un groupe non ldap pour simplifier le processus (attention, posixAccount est AUXILIARY, ce qui veut dire qu'il faut une autre classe pour l'utilisateur, inetOrgPerson par exemple) :

$ ldapadd -x -D "cn=admin,dc=linux-attitude,dc=fr" -W
dn: uid=peck,ou=people,dc=linux-attitude,dc=fr
uid: peck
objectClass: posixAccount
objectClass: inetOrgPerson
cn: peckname
sn: Peck Le bogoss
uidNumber: 2000
gidNumber: 1000
homeDirectory : /tmp

NSS

Il nous faut le paquet libnss-ldap. Pour que NSS le prenne en compte, il faut éditer /etc/nsswitch.conf :

# on donne la priorité à ldap
passwd:         ldap compat

Maintenant, il faut configurer libnss-ldap, c'est un peu plus compliqué, mais le fichier de config par défaut est plein de commentaires. Voici le minimum à configurer :

# /etc/libnss-ldap.conf
base ou=people,dc=nodomain
uri ldap://127.0.0.1/
ldap_version 3

Test

Ce test doit être fait en root car nous n'avons pas tout mis en place. Nous n'avons pour l'instant défini que l'existence de l'utilisateur.

$ su - peck
$ id
# Une autre façon de faire :
$ getent passwd peck

Youhou ça marche.
Demain nous ferons un peu mieux parce que là bon, c'est léger ...