Quand on est seul à gérer ses serveurs Linux, le compte root suffit. Quand on travaille en équipe, c’est différent : il faut pensez à mettre les accès de l’équipe partout, penser à changer les accès quand un membre de l’équipe part, quid de la sécurité des accès etc ?

Pour cela, il est préférable que chaque membre de son équipe utilise son propre couple login/password pour se connecter aux serveurs Linux. De plus on pourra donner des droits différents par utilisateur ou groupe…

L’authentification LDAP se fait au moyen de service LDAP/PAM/NSSWITCH/SUDO.

Un moyen simple de donner accès à son équipe aux serveurs sans révéler le nom de passe est l’utilisation de clé SSH. Les clés SSH c’est pratique mais tout le monde ne les utilisent pas, et puis cela permet juste de donner le même droit à tout le monde si on l’associe au compte root.

Nous allons voir comment créer un environnent d’authentification multi-utilisateurs basé sur un LDAP existant. Nous utiliseront PAM, NSSWITCH et SUDO.

Contexte

Nous avons déjà un serveur contenant notre base de données LDAP. Nous l’utiliserons pour se connecter sur d’autres serveurs Linux. Dans mon cas, j’ai validé cette manipulation sous Debian Wheezy (7.4). Des points infos sont disposées pour Debian Lenny également.

Authentification avec un utilisateur LDAP

On installe des dépenses nécessaires :

#apt-get update
#apt-get install libnss-ldap libpam-ldap sudo

Voici les données d’exemples utilisées :

LDAP server URI: ldap://SERVER
Distinguished name of the search base: la base LDAP
LDAP version to use: 3
LDAP account for root: un utilisateur ayant des droits RO sur le LDAP
LDAP root account password:
Allow LDAP admin account to behave like local root? No
Does the LDAP database require login? No

On Vérifie que les données sont correctes :

#sed -e '/^[ ]*#/d' -e '/^$/d' /etc/libnss-ldap.conf
 base o=test,dc=local
 uri ldap://pdc
 ldap_version 3
 rootbinddn uid=replicant,ou=namedAccount,o=test,dc=local
#sed -e '/^[ ]*#/d' -e '/^$/d' /etc/pam_ldap.conf
 base o=test,dc=local
 uri ldap://ldap-for-proxy
 ldap_version 3
 pam_password crypt
#cat /etc/libnss-ldap.secret

On ajoute « ldap » au fichier /etc/nsswitch.conf :

passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

On modifie PAM :

#echo -e "#allow auth with pam_access\nauth\trequired\t\t\tpam_access.so" >> /etc/pam.d/common-auth

Remarque : étape supplémentaire pour Debian Lenny

Editer /etc/pam.d/common-auth :

auth        sufficient    pam_unix.so        nullok_secure
auth        sufficient    pam_ldap.so        use_first_pass
auth        required      pam_deny.so
#allow auth with pam_access
auth    required                        pam_access.so

Editer /etc/pam.d/common-account:

account     sufficient      pam_unix.so
account     sufficient      pam_ldap.so
account     required      pam_deny.so

Editer /etc/pam.d/common-password :

password    sufficient      pam_unix.so         nullok obscure md5
password    sufficient      pam_ldap.so
password    required      pam_deny.so

Editer /etc/pam.d/common-session :

session     required      pam_unix.so
session     required      pam_mkhomedir.so
session     optional      pam_ldap.so

Pour plus d’infos sur LDAP et Lenny, voici un article intéressant : OpenLDAP client on Debian lenny.

On configure les connexions autorisées pour PAM. Dans notre cas, le groupe « ict » peut se connecter sur le réseau (10.0.0.0/8) et en face de la machine (LOCAL). Pour l’utilisateur « adminlocal », il sert uniquement d’utilisateur de secours quand on est en face de la machine et que le LDAP n’est pas joignable.

vim /etc/security/access.conf
 #admin local autorisé uniquement en local
 + : adminlocal : LOCAL
 # groupe ict uniquement en interne
 + : ict : 10.0.0.0/8 LOCAL
 # root toujours autorisé
 -:ALL EXCEPT root :ALL

On ajoute cet utilisateur, on redémarre NSCD, on test et on attribue un mot de passe à cet utilisateur :

# adduser --home /tmp --no-create-home --ingroup users --shell /bin/bash --uid=30000 adminlocal
# /etc/init.d/nscd restart
#id testictgroup
 uid=91(testictgroup) gid=14(testictgroup) groups=07(ict),14(testictgroup)
#passwd adminlocal

 

Autorisation

Voici un cas simple : les utilisateurs du groupe « ict » et un utilisateur « adminlocal » ont tous accès à toutes les commandes root, sans avoir à taper leur mots de passe 2 fois. Ils se loggent sur le serveur et c’est parti à coup de « sudo commande » ou « sudo su » pour passer en shell root.

Mais l’on peut très bien créer des « rôles » opérateurs avec des droits customisés.

# visudo

On ajout à la fin :

#allow user adminlocal to do everything
adminlocal    ALL=(ALL:ALL) NOPASSWD: ALL

#allow group ict to do everything
%ict    ALL=(ALL:ALL) NOPASSWD: ALL

Remarque : sous Lenny pour ceux qui l’on encore, c’est cette syntaxe qui est à utiliser :

# allow user adminlocal to do everything
adminlocal      ALL=(ALL) NOPASSWD: ALL# allow group ict to do everything
%ict      ALL=(ALL) NOPASSWD: ALL