[help] Synchronisation PAM/LDAP sur plusieurs serveurs

Hello,

J’ai suivi ce tuto, concernant la configuration de PAM pour ldap, tout fonctionne très bien.

Je me suis fais un script me permettant d’ajouter simplement un utilisateur (grosso modo, mon script pose des questions (quel nom, groupe, gid, uid, homedirectory, etc…) et il génère un ldif qu’il soumet ensuite au serveur. Très pratique.

Mon script vérifie quand même que l’uid que j’entre n’existe pas déjà (il contrôle le résultat d’un getent passwd et renvoi 1 si l’uid est déjà pris, 0 si c’est pas le cas et continue). Ca aussi, ça fonctionne très bien.

Maintenant, je voudrais rajouter un paramètre au compte que je créé, mais avant tout, regardez le ldif d’un compte type :

[quote]dn: uid=coldroom,ou=People,dc=pwet,dc=org
uid: coldroom
cn: coldroom
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowLastChange: 14665
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1004
gecos: coldroom,
homeDirectory: /home/coldroom
userPassword: coldroom
gidNumber: 1004[/quote]

Je voudrais ajouter la possibilité suivante : Si un utilisateur est du type administrateur, il peut se loguer sur tel serveur et pas sur d’autre.
Pour faire ceci, je dois déjà dans le compte définir si mon utilisateur est administrateur ou non. Donc ma première question est : comment créer ce type de paramètre ? J’ai pensé à un booléen genre “admin : 1/0” que je rajouterais dans mon ldif en fonction de la réponse à la question “administrateur ou non”.
Donc rien que pour ça, il faudrait que je créé un nouvel attribut à mon template ldap User Account. 1) Comment faire ça proprement ?

Une fois que mon attribut est dans le compte, ça me fait une belle jambe, je ne sais toujours pas l’interpréter ! Quand je me connecter avec mon compte, toutes les infos sont traitées, sauf justement ce nouvel attribut. 2) Comment faire pour que lorsque je me log, mon nouvel attribut “admin” soit pris en compte et traité, en fonction de quoi je l’autorise ou non à accéder à la machine ?

bon, après une bonne recherche, je suis tombé làdessus :

[quote]Autoriser la connexion en fonction de l’hôte

Le module pam_ldap offre la possibilité de spécifier une liste d’hôtes sur lesquels un utilisateur sera autorisé à se connecter : cela correspond à l’attribut “host” dans LDAP. Cet attribut peut être renseigné plusieurs fois pour chaque utilisateur. Si l’une des entrées correspond au nom de l’hôte (sur lequel on tente de se connecter), la connexion est autorisée. Sinon, l’accès est refusé.

Cette fonctionnalité est activée en spécifiant pam_check_host_attr yes dans le fichier /etc/pam_ldap.conf. Lorsqu’elle est activé, la fonction account de pam_ldap va opérer des vérifications et retourner une erreur si aucun attribut host n’est présent.

Il est possible de mettre un préfixe “!” à l’attribut “host” d’un utilisateur pour lui refuser l’accès à cet hôte. C’est principalement utile en conjonction avec l’entrée spéciale “*” qui permet l’accès à tous les hôtes.

Pour ajouter l’attribut “host” à un utilisateur, celui-ci doit avoir un objectClass qui le supporte. L’objectClass “account” a cet attribut, mais n’est pas compatible avec l’objectClass “inetOrgPerson”. Pour contourner ceci, vous pouvez utiliser le schéma “ldapns” fournit avec le paquet libpam-ldap. Ce schéma fournit un objectClass “hostObject”, qui a le bon attribut “host”.

Pour activer ce schéma, ajouter la ligne suivante à votre fichier slapd.conf :

include /usr/share/doc/libpam-ldap/ldapns.schema

Enfin, veillez à ce que la résolution du nom d’hôte soit possible. pam_ldap va tenter de résoudre le nom de l’hôte, ou de trouver des alias (tels que ceux listés dans /etc/hosts). Si la résolution du nom d’hôte n’est pas possible, l’accès sera refusé.
[/quote]

C’est pas exactement ce que je veux. Si j’ai bien compris, ici on dit directement depuis le profile de l’user à quelles machines il a accès, via l’attribut host (ip) ou pas (!ip).

J’ai donc essayé, seulement, lorsque je me connecte, à l’ouverture de ma session, j’ai bien un “Access denied for this host”, mais, le process de login continue gentiment, et je peux naviguer sur ma machine… Ah oui, c’est sure, j’ai un message me disant que je n’ai pas accès à la machine, c’est donc que le truc fonctionne à moitié, mais je suis quand même logué présentement dessus :wink:

J’avance, j’avance…

J’ai trouvé ceci :

[quote]Host-based Authentication

Host based authentication allows you to restrict who can log into a machine that uses LDAP for authentication. The basic gist is you add an attribute to each LDAP user’s record that includes hostnames that they are allowed to log in to. Each client system then checks this field against its own hostname and either allows or denies login based upon the attribute field. There are two methods to enforce host-based authentication, the first is to use libpam-ldap, the second method is to use an LDAP pam_filter.

libpam-ldap authentication

Using the pam_check_host_attr directive to enforce host authentication has the effect that users are explicitly informed they are not permitted to access the host with an error message: Access denied for this host.

Libpam-ldap requires that you use the host attribute. The package documentation includes a schema which provides this attribute, located at /usr/share/doc/libpam-ldap/ldapns.schema, which can be added to slapd.conf if needed. To populate that attribute, you can use a web tool such as phpldapadmin, or you can create a modification LDIF such as:

dn: uid=user_to_change,ou=Users,dc=example,dc=com
changetype: modify
add: host
host: thehostname

“thehostname” should match the output from the hostname command. When in doubt, check the slapd logs on the server. Make the change using:

ldapmodify -H ldaps://ldapserver -D “cn=admin,dc=example,dc=com” -x -W -f your_file.ldif

On the client side, simply modify /etc/ldap.conf (or other appropriate configuration file as defined in pam.d) to include the line:

pam_check_host_attr yes

Warning: /etc/nsswitch.conf should not contain “ldap” in the “shadow” entry, or host-based authentication will always succeed. See /usr/share/doc/libpam-ldap/ for additional information.

pam_filter authentication

Using the pam_filter directive in /etc/ldap.conf it is possible to enforce PAM to only access accounts with attributes of our choosing. Users who are not permitted access to the host will receive no error, instead PAM responds as if they have entered an incorrect password.

An example using the libpam-ldap host attribute, we can create a filter which matches thehostname or * in /etc/ldap.conf:

pam_filter |(host=thehostname)(host=*)

Another example using Gosa’s accessTo and trustModel attributes would look like the following:

pam_filter |(&(accessTo=thehostname)(trustModel=byhost))(trustModel=fullaccess)[/quote]

Seulement, quand l’enlève la directive “ldap” de shadow, je ne peux plus du tout me connecter à ma machine quel que soit l’utilisateur ldap…

Bon, voilà où j’en suis (pour ce monologue très intéressant) :

cat /etc/nsswitch :

[quote]# /etc/nsswitch.conf

Example configuration of GNU Name Service Switch functionality.

If you have the glibc-doc-reference' andinfo’ packages installed, try:

`info libc “Name Service Switch”’ for information about this file.

passwd: compat ldap
group: compat ldap
shadow: compat

hosts: files dns
networks: files

protocols: db files
services: db files
ethers: db files
rpc: db files

netgroup: nis[/quote]

cat /etc/pam_ldap.conf

[quote]base dc=lab3
uri ldap://127.0.0.1/
ldap_version 3
rootbinddn cn=admin,dc=lab3
port 389
pam_password crypt
pam_check_host_attr yes[/quote]

cat /etc/pam.d/common-access

[quote]account sufficient pam_unix.so
account sufficient pam_ldap.so
account required pam_deny.so[/quote]

cat /etc/pam.d/common-auth

[quote]auth required pam_env.so
auth sufficient pam_unix.so likeauth nullok
auth required pam_group.so use_first_pass
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so[/quote]

cat /etc/pam.d/common-passwd

password sufficient pam_ldap.so use_first_pass
password required pam_deny.so

cat /etc/pam.d/common-session

[quote]session required pam_limits.so
session required pam_mkhomedir.so skel=/etc/skel/
session required pam_unix.so
session optional pam_ldap.so[/quote]

Actuellement, lorsque je mets comme attribut host à mon utilisateur, voilà comment ça réagit :

  • si host = 10.0.0.1 => le client refuse de se connecter (anormal, je crois…)

  • si host = !10.0.0.1 => le client refuse de se connecter (normal)

  • si host = * => le client se connecte (normal)

  • si host = 10.0.0.1
    host = *
    => le client refuse de se connecter (anormal)

A noter que visiblement "" veut dire toutes les machines, donc il est normal que mon user se connecte, “!” veut expressément dire qu’il ne peut pas se connecter, et normalement, la combinaison des deux doit marcher, c’est à dire que si je mets [b][/b] et !10.0.0.1, ça veut dire qu’il peut se connecter partout, sauf sur 10.0.0.1. Or là il ne s’y connecte même pas. Je pense que quelquechose ne va pas dans mes fichiers common*, mais quoi…

Bon, eh bien j’ai trouvé.

Alors pour ceux qui passeront par là et qui rencontreront le même problème, il faut savoir que l’attribut host ne prend en compte QUE les noms des machines (ce que nous renvoi la commande hostname) et non les adresses ip !

Merci… moi :slightly_smiling: