Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

PAM/LDAP avec CVS: est-ce cela fonctionne ?

5 réponses
Avatar
Stephane
Bonjour,

Je cherche à utiliser PAM avec CVS (version 1.12.2 donc la dernière hors
dev-cvs). Mais si l'authentification se déroule bien (avec LDAP), lors d'un
*checkout* j'ai l'erreur suivante:

Fatal error, aborting.
monuser: no such system user

J'en suis à regarger dans les sources de CVS et dans le fichier
src/server.c, ma requête passe par la fonction "switch_to_user" qui va
regarder avec la fonction C *getpwnam* si l'utilisateur LDAP existe dans le
fichier /etc/passwd ou bien sur il n'existe pas puisqu'il est dans le LDAP.

Soit il y a quelque chose que je ne comprends pas pour utiliser CVS avec PAM
(et LDAP) soit il y a un bogue. Est-ce c'est vraiment possible d'utiliser
ces 3 programmes ensembles ?

Merci pour votre aide.
Stéphane VANPOPERYNGHE

--
MINOTAUR (un projet francophone de CMS en PHP/MySQL)
N'hésitez pas à rejoindre le projet et participer ainsi aux logiciels
libres.
http://projects.freelinuxdev.net/minotaur/

--
Pour contacter l'équipe de modération : moderateurs-fcolm@efrei.fr
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.

5 réponses

Avatar
Loic Minier
* Stephane ,
16 Nov 2003 17:02:30 GMT:

J'en suis à regarger dans les sources de CVS et dans le fichier
src/server.c, ma requête passe par la fonction "switch_to_user" qui va
regarder avec la fonction C *getpwnam* si l'utilisateur LDAP existe dans le
fichier /etc/passwd ou bien sur il n'existe pas puisqu'il est dans le LDAP.



Je suggère d'essayer de faire "getent passwd <ton user>", par exemple
"getent passwd toto". Cela appellera la même fonction (getpwnam), et
vérifiera ainsi si tout se passe bien. Les bibliothèques clientes LDAP
n'ont pas forcément le même comportement lorsqu'elles sont appelées
en root ou en user, il faut faire l'essai du getent en utilisateur
non-privilégié ainsi qu'en root.

À mon humble avis, c'est un problème de droit de lecture sur le
fichier qui contient le mot de passe LDAP ou de droit de requête
anonyme au serveur LDAP.

--
Loïc Minier

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.
Avatar
Did0
Bonjour,

"Stephane" writes:
Je cherche à utiliser PAM avec CVS (version 1.12.2 donc la dernière hors
dev-cvs). Mais si l'authentification se déroule bien (avec LDAP), lors d'un
*checkout* j'ai l'erreur suivante:

Fatal error, aborting.
monuser: no such system user

J'en suis à regarger dans les sources de CVS et dans le fichier
src/server.c, ma requête passe par la fonction "switch_to_user" qui va
regarder avec la fonction C *getpwnam* si l'utilisateur LDAP existe dans le
fichier /etc/passwd ou bien sur il n'existe pas puisqu'il est dans le LDAP.

Soit il y a quelque chose que je ne comprends pas pour utiliser CVS avec PAM
(et LDAP) soit il y a un bogue. Est-ce c'est vraiment possible d'utiliser
ces 3 programmes ensembles ?


La fonction *getpwnam* appartient plutôt à l'API de la libc et non libpam.
Il ne passe donc pas par la couche PAM (/etc/pam.d/cvs) mais par la couche
NSS (/etc/nsswitch.conf).

As tu bien du _ldap_ dans l'entrée _passwd_ ce dernier fichier ?


@++
--
Dido

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.
Avatar
Stephane
----- Original Message -----
From: "Loic Minier"



Je suggère d'essayer de faire "getent passwd <ton user>", par exemple
"getent passwd toto". Cela appellera la même fonction (getpwnam), et
vérifiera ainsi si tout se passe bien.



Le compte monuser n'est pas dans le fichier /etc/passwd car il est dans le
LDAP. Donc, getent ne le retrouve pas. L'intérêt pour moi de LDAP est de
centraliser l'ensemble des informations concernant les comptes dans une même
base modifiable très facilement.

Les bibliothèques clientes LDAP
n'ont pas forcément le même comportement lorsqu'elles sont appelées
en root ou en user, il faut faire l'essai du getent en utilisateur
non-privilégié ainsi qu'en root.



Comme je l'indiquais, l'authentification CVS sur le LDAP se déroule bien.
J'ai ajouté les traces d'OpenLDAP et toutes les informations sont
parfaitement récupérées par PAM puis CVS (j'ai ajouté des traces dans le
code de CVS pour suivre le cheminement). Le problème, c'est qu'une fois
authentifié, CVS essaye de basculer sur un utilisateur système correspondant
à l'utilisateur qu'il a authentifié.

Au niveau CVS, cet utilisateur peut-être celui indiqué dans le fichier
CVSROOT/passwd (3ème paramètre):
<login>:<password>:<systUser>

Mais comme l'authentification se déroule maintenant avec PAM/LDAP, je ne
peux pas indiquer quel est l'utilisateur système à utiliser puisque le
fichier CVSROOT/passwd n'est plus utilisé. Donc, quand CVS ne trouve pas
d'utilisateur système, il recherche l'utilisateur qui cherche à
s'authentifier, sauf que comme je l'ai dit, il n'existe pas dans le fichier
/etc/passwd :-(

J'ai l'impression que le support de PAM sur CVS fonctionne surtout avec
pam_unix mais que le support de pam_ldap n'est pas complet ce qui est plus
qu'étonnant quand on sait que CVS est utilisé par une très grande
communauté.

Mais je vais continuer mes investigations car il faut absolument que je
trouve la solution.

Cordialement,
Stéphane VANPOPERYNGHE

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.
Avatar
Loic Minier
* Stephane ,
18 Nov 2003 23:19:56 GMT:
Le compte monuser n'est pas dans le fichier /etc/passwd car il est dans le
LDAP. Donc, getent ne le retrouve pas. L'intérêt pour moi de LDAP est de
centraliser l'ensemble des informations concernant les comptes dans une même
base modifiable très facilement.



Merci de me faire un cours de LDAP, mais getent ne fait pas forcément
de requête sur le /etc/passwd. getent sert justement à s'abstraire
du fichier /etc/passwd pour utiliser un concept plus générique de
"database" passwd. Effectivement, cette base peut être stockée dans le
/etc/passwd, mais elle peut aussi être répartie sur un serveur NIS, un
serveur LDAP et le fichier /etc/passwd par exemple.
getent sert en particulier à diagnostiquer le fonctionnement de
requêtes de type getpwnam ou getpwuid. Voir fin de ce mail.

Comme je l'indiquais, l'authentification CVS sur le LDAP se déroule bien.
Au niveau CVS, cet utilisateur peut-être celui indiqué dans le fichier
CVSROOT/passwd (3ème paramètre):
<login>:<password>:<systUser>



Ce n'est pas très clair, l'authentification LDAP est utilisée pour
les passwords CVS ? Ou bien le mot de passe est spécifié dans le
fichier CVSROOT/passwd ?

J'ai ajouté les traces d'OpenLDAP et toutes les informations sont
parfaitement récupérées par PAM puis CVS (j'ai ajouté des traces dans le
code de CVS pour suivre le cheminement). Le problème, c'est qu'une fois
authentifié, CVS essaye de basculer sur un utilisateur système correspondant
à l'utilisateur qu'il a authentifié.



CVS a son propre système de contrôle d'accès, c'est pourquoi en
général tous les comptes CVS sont associés au même utilisateur système
(par exemple à un compte "cvs-readonly" pour les anonymes et à un
compte "cvs-readwrite" pour les personnes pouvant commiter).
Si je comprends bien, les utilisateurs CVS sont associés à leurs
comptes système, mais je n'en suis pas sûr... il faudrait un exmeple de
CVSROOT/passwd utilisé sur ce système.

Bref, j'ai l'impression qu'il manque des détails sur la configuration
du serveur CVS :
- est-ce le fichier CVSROOT/passwd qui contient les passwords CVS ?
- à quel type d'utilisateur système sont associés les comptes CVS (un
utilisateur local unique pour tous les comptes, un utilisateur LDAP
unique pour tous les comptes, à tous les comptes utilisateurs LDAP...)
- le serveur CVS fonctionne-t-il en root ou bien en utilisateur
non-privilégié ? Est-il utilisé en pserver ou en local ?
- quelle version de CVS est utilisée ?

Mais comme l'authentification se déroule maintenant avec PAM/LDAP, je ne
peux pas indiquer quel est l'utilisateur système à utiliser puisque le
fichier CVSROOT/passwd n'est plus utilisé. Donc, quand CVS ne trouve pas
d'utilisateur système, il recherche l'utilisateur qui cherche à
s'authentifier, sauf que comme je l'ai dit, il n'existe pas dans le fichier
/etc/passwd :-(



Je n'arrive pas à distinguer les certitudes des incertitudes dans
ce paragraphe, et encore moins ce qui est issu d'une introspection
dans les sources de CVS de ce sont des suppositions ou des résultats /
conclusions d'essais de checkout ou de login.

Quelles sont les commandes exécutées ? À quelle phase de l'échange
CVS est-il fait référence ? Pourrait-on avoir un exemple de fichier
CVSROOT/passwd s'il est utilisé ?

J'ai l'impression que le support de PAM sur CVS fonctionne surtout avec
pam_unix mais que le support de pam_ldap n'est pas complet ce qui est plus
qu'étonnant quand on sait que CVS est utilisé par une très grande
communauté.



pam_ldap et pam_unix sont des modules pam dont CVS n'a pas
connaissance. On peut configurer le comportement de PAM pour tel ou tel
programme ou le comportement de PAM par défaut pour utiliser pam_ldap
ou pam_unix ou les deux.
CVS n'est pas PAM-aware (un grep -ir pam sur les sources indique que
c'est dans les plans de développement), c'est donc la configuration du
système qui compte.

CVS utilise effectivement getpwnam, mais à pluseirs
endroits. Cependant, CVS devrait afficher un message d'erreur si
l'appel à getpwnam échoue. Le message est-il "monuser: no such user" ou
bien "you are unknown to this system" ? (Je n'ai pas trouvé "no such
system user" dans les sources de CVS 1.1.)

Si c'est effectivement l'appel switch_to_user() qui échoue dans le
checkout, c'est le message "monuser: no such user" qui devrait être
affiché. Dans ce cas, "getent passwd monuser" devrait présenter les
mêmes symptômes.
La solution est soit d'utiliser l'utilisateur dans lequel CVS
fonctionne comme utilisateur vers lequel changer ("cvs" ou "root") soit
de comprendre pourquoi getent échoue.
Est-ce que "getent passwd monuser" fonctionne en root et en monuser
depuis la machine où fonctionne le serveur CVS ? Désolé d'avoir à
reposer cette question mais elle détient une partie de la réponse.

--
Loïc Minier

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.
Avatar
spam_news
Bonjour,

Did0 wrote:


La fonction *getpwnam* appartient plutôt à l'API de la libc et non libpam.
Il ne passe donc pas par la couche PAM (/etc/pam.d/cvs) mais par la couche
NSS (/etc/nsswitch.conf).

As tu bien du _ldap_ dans l'entrée _passwd_ ce dernier fichier ?





Je viens d'installer ce qu'il faut pour utiliser nss avec LDAP (sur
Debian libnss-ldap) ainsi que le serveur nscd (package nscd).

J'ai modifié le fichier /etc/nsswitch.conf pour avoir les lignes suivantes:

passwd: files ldap
group: files ldap

Après avoir relancé le serveur nscd, tout fonctionne parfaitement.

Un très grand merci à Did0 et Loïc.

Stéphane VANPOPERYNGHE

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.