Authentification centralisée avec LDAP:

Team Gadgets @One2Team
Draft · 3 min read

Contexte:

* ~30 utilisateurs ont besoin d’un accès SSH à l’infra avec différents niveaux d’accès.

  • 7 environnements serveurs (devel, product, alpha, beta, sandbox, stable, useast)
  • ~300 serveurs
  • Chaque environnement est déployé et maintenu avec puppet.
  • Les clés publiques SSH des utilisateurs ainsi que la gestion d’ACL sont centralisées avec puppet
  • Rolling update hebdomadaire.
  • Aucune intervention possible sur un serveur de production sans planification avec le client.
  • Hétérogénéité de la plateforme et des cycles de mise à jour.

Problématique:

Ajouter ou révoquer des accès instantanément sur la totalité de l’infrastructure.

Solution:

Alice et Bob ont besoin d’avoir accès à l’infrastructure

Alice est AdminSys et a régulièrement besoin d’accéder à tous les serveurs

Bob est développeur et a besoin d’accéder à des fichiers de logs sur des serveurs spécifiques.

Solution technique :

Paquets nécessaires :

  • openldap (client / serveur)
  • sssd
  • pam.d

Authentification SSH centralisée :

Par défaut LDAP permet aux travers des classes contenues dans le schéma de créer des groupes / users / netgroups Unix.

Dans notre UseCase un netgroup sera un pool de serveurs comme le pool ‘Serveurs infra’.

Deux groupes adminsys/developpeur ainsi que deux utilisateurs Alice/Bob

Au travers des daemon sssd les informations contenues dans LDAP vont être concaténés avec les fichiers ‘/etc/passwd’, ‘/etc/group’ …

Ce qui reviendra pour le système à considérer un utilisateur LDAP au même titre qu’un utilisateur local.

Pour gérer l’authentification d’utilisateur LDAP en ssh il faut modifier la configuration pam.d par défaut pour qu’il utilise le daemon sssd.

Configurations :

OpenLDAP :

Modification du schéma :

  • Ajout de la classe ‘ldapPublicKey’ (openssh-lpk)
  • Ajout des attributs sudo (sudoers.schema)

Modification de l’attribut ‘nisNetgroupTriple’ permettant de gérer la comparaison ( Ajout/Suppression d’un serveur dans un netgroup )

<code>
olcAttributeTypes: {12}( 1.3.6.1.1.1.1.14 NAME ‘nisNetgroupTriple’ DESC ‘Netgroup triple’ EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
</code>

SSHD :

Utilisation de la directive AuthorizedKeysCommand, qui permet de récupérer les clefs publiques autorisées à partir d’une commande.

<code>
AuthorizedKeysCommand /etc/openldap/sshkeyScript
AuthorizedKeysCommandRunAs authkeys
</code>

<code : /etc/openldap/sshKeyScript>
ldapsearch -x ‘(&(objectClass=posixAccount)(uid=’”$1"’))’ ‘sshPublicKey’ -ZZ | sed -n ‘/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp’
</code>

SSSD :

Configuration du daemon pour utiliser LDAP comme source d’informations :

[domain/default]
ldap_schema = rfc2307
ldap_search_base = dc=example,dc=com
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
ldap_uri = ldap://ldap.example.com:389
ldap_id_use_start_tls = True
cache_credentials = True
ldap_tls_cacert = /etc/openldap/certs/cacert.pem
sudo_provider = ldap
ldap_uri = ldap://ldap.example.com:389
ldap_sudo_search_base = ou=SUDOers,dc=example,dc=com
ldap_netgroup_search_base = ou=netgroups,dc=example,dc=com
ldap_group_search_base = ou=groups,dc=example,dc=com
ldap_group_member = memberUid
ldap_group_name = cn

[sssd]
services = nss, pam, sudo
config_file_version = 2
domains = default

[nss]
homedir_substring = /home

PAM :

Ajout des directives :

auth sufficient pam_sss.so use_first_pass
account [default=bad success=ok user_unknown=ignore] pam_sss.so
password sufficient pam_sss.so use_authtok
session optional pam_sss.so

Demo:

(σ・・)σ Team Gadgets |One2Team

Aller plus loin:

  • auditd et tracking de l’activitée des utilisateurs sur l’infra.
  • authentification HTTP avec LDAP