L’utilisation d’une clé USB sous Ubuntu par un utilisateur lambda est conditionée par son appartenance (ou non) au groupe “plugdev”. Plusieurs solutions :
- Passer sur toutes les machines ajouter les utilisateurs dans le groupe plugdev : autant se tirer une balle tout de suite.
- Faire un groupe posix dans LDAP “plugdev” et mettre les gens dedans. L’objection principal que je vois est que le GID de ce groupe est local (donc bas) : les GID distribués par LDAP doivent être sur une plage supérieure.
- Ajouter dynamiquement l’utilisateur dans le groupe “plugdev” après l’authentification.
J’ai retenu la dernière solution. On peut faire ça en utilisant la PAM pam_group.so.
/etc/security/group.conf
*;*;*;Al0000-2400;cdrom,floppy,plugdev
Cette ligne nous dit en gros que n’importe qui qui se connecte sur la machine à n’importe quelle heure et par n’importe quel moyen (ssh, login en mode texte, [k|x|g]dm etc.) se voit ajouter aux groupes locaux cdrom, floppy et plugdev.
/etc/pam.d/common-auth
auth optional pam_group.so
auth sufficient pam_ldap.so
auth requisite pam_unix.so nullok_secure
auth optional pam_smbpass.so migrate missingok
On active la pam_group qui va réaliser les actions définies dans /etc/security/group.conf. Attention a bien la placer en tête de fichier.
Enfin dans /etc/dbus-1/system.d/hal.conf, il faut remplacer “deny” par “allow” à la ligne :
<deny send_interface="org.freedesktop.Hal.Device.Volume"/>
Arno (encore lui) m’a indiqué une feature interessante de sudo : on peut stocker le sudoers dans LDAP.
Fini les /etc/sudoers à gérer sur chaques machines !
Partie serveur LDAP
Un petit exemple vaut mieux qu’un long discours. Ici l’utilisateur toto veut invoquer n’importe quelle commande en tant que “root” (j’utilise cette règle dans des salles de libre service sous Ubuntu 8.04).
dn: ou=sudoers,dc=example,dc=net
objectclass: organizationalUnit
ou: sudoers
dn: cn=defaults,ou=sudoers,dc=example,dc=net
objectClass: top
objectClass: sudoRole
cn: defaults
description: Default sudoOption's go here
sudoOption: logfile=/var/log/sudolog
dn: cn=root,ou=sudoers,dc=example,dc=net
objectClass: top
objectClass: sudoRole
cn: root
sudoUser: root
sudoHost: ALL
sudoCommand: ALL
dn: cn=toto_to_root,ou=sudoers,dc=example,dc=net
objectClass: top
objectClass: sudoRole
cn: toto_to_root
sudoUser: toto
sudoHost: ALL
sudoCommand: ALL
Un “ldapadd” pour envoyer la sauce et c’est fini.
Partie client Ubuntu 8.04
On installe sudo-ldap (par défaut sudo n’intègre pas le support de LDAP, la version de ce paquet est compilée avec les librairies LDAP).
[root@client01 #] apt-get install sudo-ldap
Et effectivement :
[root@client01 #] ldd `which sudo`
linux-gate.so.1 => (0xb7f48000)
libpam.so.0 => /lib/libpam.so.0 (0xb7f2a000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7f26000)
libldap_r-2.4.so.2 => /usr/lib/libldap_r-2.4.so.2 (0xb7ee5000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d96000)
liblber-2.4.so.2 => /usr/lib/liblber-2.4.so.2 (0xb7d89000)
/lib/ld-linux.so.2 (0xb7f49000)
libresolv.so.2 => /lib/tls/i686/cmov/libresolv.so.2 (0xb7d76000)
libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0xb7d5f000)
libgnutls.so.13 => /usr/lib/libgnutls.so.13 (0xb7ce8000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7cd0000)
libtasn1.so.3 => /usr/lib/libtasn1.so.3 (0xb7cc0000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7cab000)
libgcrypt.so.11 => /lib/libgcrypt.so.11 (0xb7c5e000)
libgpg-error.so.0 => /lib/libgpg-error.so.0 (0xb7c59000)
Ensuite, il faut rensigner le nsswitch.conf :
Puis le /etc/sudoers doit contenir uniquement le réglage suivant :
Defaults ignore_local_sudoers
Enfin, il faut ajouter la configuration suivante dans votre ldap.conf :
sudoers_base ou=sudoers,dc=example,dc=net
On note que si vous avez un fichier libnss-ldap.conf il est parsé par sudo-ldap à la place du ldap.conf. Pour mes configurations j’ai un fichier “réel” /etc/ldap/ldap.conf, /etc/ldap.conf et /etc/libnss-ldap.conf sont des liens. Mes fichiers sont cohérents.
Voili, voilou