TutorielGuides

Administrer sans amadmin : comptes LDAP et privilèges délégués

Sur cette page

amadmin est un compte générique : tous ceux qui en connaissent le mot de passe agissent sous le même nom, et les journaux ne disent pas qui a fait quoi. C’est aussi un super-utilisateur : TOSIAM ne vérifie aucun privilège pour lui, sur aucun royaume.

Ce guide le remplace, pour l’administration courante, par des comptes nominatifs pris dans votre annuaire LDAP. Les droits ne sont pas donnés aux personnes, mais à un groupe LDAP : TOSIAM accorde des privilèges à ce groupe dans un royaume, et chaque membre du groupe les reçoit. Ajouter ou retirer un administrateur se fait alors dans l’annuaire, sans toucher à TOSIAM.

texte
uid=dduck  ──membre de──▶  cn=admins-ref (groupe LDAP)  ──privilège RealmAdmin──▶  royaume ref

Ce que donne un privilège, selon le royaume#

Un privilège s’accorde à un groupe d’un royaume donné, et vaut pour ce royaume et ses sous-royaumes. Un groupe ne peut recevoir de privilèges que dans le royaume où il est déclaré : l’administrateur de ref est donc un utilisateur du datastore de ref, et il se connecte dans ref.

Faites défiler le tableau
CompteCe qu’il administreConsolessoadm
Membre d’un groupe de ref avec RealmAdminle royaume ref et ses sous-royaumesoui, sur le royaume refnon
Membre d’un groupe du royaume racine avec RealmAdmintous les royaumes et la configuration globaleoui, complèteoui
amadmintout, sans contrôle de privilègeoui, complèteoui

ssoadm authentifie toujours dans le royaume racine : seul un administrateur du royaume racine peut s’en servir. Un administrateur de ref passe par la console ou par l’API REST ; ses droits sur les sous-royaumes de ref s’exercent par l’API REST /json.

Étape 1 : le groupe dans l’annuaire#

Créez dans l’annuaire un groupe dont les membres seront les administrateurs de ref. Avec la classe d’objet groupOfUniqueNames, celle qu’attend TOSIAM par défaut :

ldif· admins-ref.ldif
dn: cn=admins-ref,ou=groups,dc=example,dc=com
objectClass: top
objectClass: groupOfUniqueNames
cn: admins-ref
description: Administrateurs du royaume ref dans TOSIAM
uniqueMember: uid=dduck,ou=people,dc=example,dc=com
uniqueMember: uid=mmouse,ou=people,dc=example,dc=com
bash
ldapadd -H ldap://ldap.example.com -D "cn=admin,dc=example,dc=com" -W -f admins-ref.ldif

Si votre annuaire utilise déjà groupOfNames et l’attribut member (cas courant avec OpenLDAP), gardez-les : l’étape 2 indique à TOSIAM lesquels lire.

Étape 2 : faire voir le groupe au datastore#

Pour savoir si un utilisateur est membre de admins-ref, TOSIAM demande au datastore les groupes de cet utilisateur. Le datastore les trouve de deux façons :

  • Nom d’attribut pour l’appartenance à un groupe renseigné (par exemple memberOf ou isMemberOf) : il lit cet attribut sur l’entrée de l’utilisateur ;
  • sinon : il cherche, sous le conteneur des groupes, les entrées qui répondent au filtre de recherche de groupes et dont l’attribut membre unique contient le DN de l’utilisateur.

Dans la console, menu Datastores du royaume ref, ouvrez le datastore annuaire, onglet Configuration des groupes :

Datastore annuaire du royaume ref, onglet Configuration des groupes : filtre (objectclass=groupOfUniqueNames), classe d'objet groupofuniquenames et top, nom d'attribut pour l'appartenance à un groupe vide, nom d'attribut pour un membre unique uniqueMember Datastore annuaire du royaume ref, onglet Configuration des groupes : filtre (objectclass=groupOfUniqueNames), classe d'objet groupofuniquenames et top, nom d'attribut pour l'appartenance à un groupe vide, nom d'attribut pour un membre unique uniqueMember
L’onglet Configuration des groupes (1) : filtre de recherche (2), classe d’objet (3), attribut d’appartenance (4) et attribut de membre (5), ici aux valeurs par défaut.
Faites défiler le tableau
Réglage (console)AttributDéfautAvec groupOfNames
Filtre de recherche de groupes LDAPsun-idrepo-ldapv3-config-groups-search-filter(objectclass=groupOfUniqueNames)(objectclass=groupOfNames)
Attribut d’affectation de nom du conteneur de groupes LDAPsun-idrepo-ldapv3-config-group-container-nameouou
Valeur du conteneur de groupes LDAPsun-idrepo-ldapv3-config-group-container-valuegroupsle ou de vos groupes
Classe d’objet de groupes LDAPsun-idrepo-ldapv3-config-group-objectclassgroupofuniquenames, topgroupOfNames, top
Nom d’attribut pour un membre uniquesun-idrepo-ldapv3-config-uniquememberuniqueMembermember
Nom d’attribut pour l’appartenance à un groupesun-idrepo-ldapv3-config-memberofvidememberOf, si l’overlay memberof est actif

Ces réglages valent pour tout le datastore : avec le filtre (objectclass=groupOfNames), les groupes groupOfUniqueNames du même annuaire ne sont plus vus, et leurs membres perdent les privilèges accordés à ces groupes.

Avec ssoadm, depuis un compte du royaume racine :

bash
ssoadm update-datastore --realm /ref --name annuaire \
  --adminid amadmin --password-file /chemin/vers/pwd.txt \
  --attributevalues \
    "sun-idrepo-ldapv3-config-groups-search-filter=(objectclass=groupOfNames)" \
    "sun-idrepo-ldapv3-config-group-objectclass=groupOfNames" \
    "sun-idrepo-ldapv3-config-group-objectclass=top" \
    "sun-idrepo-ldapv3-config-uniquemember=member"

Vérifiez le résultat dans Identités, onglet Groupes : admins-ref doit apparaître, et son onglet Membres doit lister dduck et mmouse. Si le groupe n’apparaît pas, TOSIAM ne pourra pas non plus lui accorder de privilèges.

Groupe admins-ref du royaume ref, onglet Membres : dduck (Donald DUCK) et mmouse (Mickey MOUSE) Groupe admins-ref du royaume ref, onglet Membres : dduck (Donald DUCK) et mmouse (Mickey MOUSE)
Le groupe LDAP vu par TOSIAM, avec ses deux membres lus dans l’annuaire (1).

Étape 3 : accorder les privilèges au groupe#

Connecté une dernière fois avec amadmin, sélectionnez le royaume ref, puis Identités, onglet Groupes, groupe admins-ref, onglet Privilèges. Les 21 privilèges y sont rangés en trois sections : Administration du royaume, Journalisation, Fédération et sessions. Activez Realm Admin (RealmAdmin), puis Enregistrer.

Groupe admins-ref, onglet Privilèges : 1 sur 21 privilèges accordés, Realm Admin accordé dans la section Administration du royaume Groupe admins-ref, onglet Privilèges : 1 sur 21 privilèges accordés, Realm Admin accordé dans la section Administration du royaume
L’onglet Privilèges du groupe (1) et le privilège Realm Admin accordé (2).

Avec ssoadm :

bash
ssoadm add-privileges --realm /ref --idname admins-ref --idtype Group \
  --adminid amadmin --password-file /chemin/vers/pwd.txt \
  --privileges RealmAdmin

ssoadm show-privileges --realm /ref --idname admins-ref --idtype Group \
  --adminid amadmin --password-file /chemin/vers/pwd.txt

RealmAdmin est le privilège qui ouvre la console du royaume. Les autres servent à des profils plus étroits, surtout pour des comptes techniques qui appellent l’API REST :

Faites défiler le tableau
PrivilègeLibelléUsage type
RealmAdminAccès en lecture et en écriture à toutes les propriétés de royaume et de politiqueadministrateur du royaume
RealmReadAccessAppels REST de lecture des royaumescompte technique qui liste les royaumes
PolicyAdminAccès en lecture et en écriture pour l’administration des politiqueséquipe qui gère les politiques d’autorisation
AgentAdminAccès en lecture et en écriture à tous les agents configuréséquipe qui enregistre les clients OAuth2 et les agents
FederationAdminAccès en lecture et en écriture à toutes les configurations de métadonnées de fédérationéquipe SAML
EntitlementRestAccessAppels REST d’évaluation de politiquecompte technique d’une application qui demande des décisions
LogRead, LogWrite, LogAdminAccès aux fichiers de journalsupervision

Créez un groupe LDAP par profil (admins-ref, politiques-ref, lecteurs-ref…) plutôt que d’empiler les privilèges sur un seul groupe.

Étape 4 : se connecter avec son propre compte#

L’administrateur se connecte dans le royaume ref, avec son identifiant et son mot de passe LDAP :

texte
https://login.example.com/tosiam/XUI/?realm=/ref#login/

Après la connexion, il arrive sur la console, sur le royaume ref. Un utilisateur de ref qui n’est pas membre d’un groupe privilégié est renvoyé vers son profil (XUI/#profile), comme avant.

Console de TOSIAM ouverte par dduck : royaume REF, tableau de bord « Bon retour, dduck » Console de TOSIAM ouverte par dduck : royaume REF, tableau de bord « Bon retour, dduck »
La console ouverte avec le compte LDAP dduck : royaume ref (1) et utilisateur connecté (2).

Les menus de la configuration globale (Services globaux, Serveurs…) restent affichés, mais le serveur refuse ces appels à un administrateur de royaume, comme ceux qui visent un autre royaume (403).

Pour vérifier les droits sans navigateur, authentifiez-vous puis lisez le profil de l’utilisateur avec sa propre session : la liste roles contient ui-realm-admin pour un administrateur du royaume, et aussi ui-global-admin pour un administrateur du royaume racine.

bash
TOKEN=$(curl -s -X POST "https://login.example.com/tosiam/json/ref/authenticate" \
  -H "Content-Type: application/json" -H "X-Requested-With: XMLHttpRequest" \
  -H "X-OpenAM-Username: dduck" -H "X-OpenAM-Password: $MOT_DE_PASSE" \
  | jq -r .tokenId)

curl -s "https://login.example.com/tosiam/json/ref/users/dduck" \
  -H "iPlanetDirectoryPro: $TOKEN" -H "X-Requested-With: XMLHttpRequest" | jq -c .roles
sortie
["ui-realm-admin","ui-self-service-user"]

Sans privilège, la liste ne contient que ui-self-service-user. Les actions de dduck sont désormais tracées sous son nom dans les journaux d’audit, et non plus sous celui d’amadmin.

Étape 5 : imposer une authentification forte aux administrateurs#

Par défaut, un administrateur délégué obtient ses droits quelle que soit la façon dont il s’est connecté : un simple mot de passe sur la page de connexion des utilisateurs suffit. Pour exiger plus (un second facteur, une clé d’accès…), créez une chaîne réservée aux administrateurs, par exemple admin-mfa, puis réglez deux attributs du service d’authentification du royaume ref :

Faites défiler le tableau
RéglageAttributValeur
Configuration d’authentification des administrateursiplanet-am-auth-admin-auth-modulela chaîne des administrateurs, admin-mfa
Authentification des administrateurs obligatoireauthAdminChainRequiredtrue

Ces réglages sont dans la console legacy, royaume ref, Authentification › Paramètres, onglet Core :

Console legacy, royaume ref, Authentification, Paramètres, onglet Core : configuration d'authentification des administrateurs et Authentification des administrateurs obligatoire activée Console legacy, royaume ref, Authentification, Paramètres, onglet Core : configuration d'authentification des administrateurs et Authentification des administrateurs obligatoire activée
La chaîne des administrateurs (1) et le réglage Authentification des administrateurs obligatoire (2). Sur la capture, la chaîne de test admin-ldap.

Ou avec ssoadm :

bash
ssoadm set-realm-svc-attrs --realm /ref --servicename iPlanetAMAuthService \
  --adminid amadmin --password-file /chemin/vers/pwd.txt \
  --attributevalues iplanet-am-auth-admin-auth-module=admin-mfa authAdminChainRequired=true

Un administrateur de ref n’obtient alors ses droits, dans la console comme dans l’API, que si sa session a été créée avec la chaîne admin-mfa. Il se connecte par :

texte
https://login.example.com/tosiam/XUI/?realm=/ref&service=adminconsoleservice#login/

Le paramètre service=adminconsoleservice désigne la configuration d’authentification des administrateurs du royaume, quel que soit son nom. Une session ouverte avec une autre chaîne reste valide pour les applications, mais sans aucun droit d’administration : par l’URL de connexion habituelle, dduck arrive sur son profil et non sur la console. Pour l’API REST, ajoutez ?authIndexType=service&authIndexValue=adminconsoleservice à l’appel authenticate.

Le contrôle est fait à chaque appel d’administration, sur le royaume où la session a été créée. Si Authentification des administrateurs obligatoire est activé sans configuration d’authentification des administrateurs, le réglage est ignoré et un avertissement est écrit dans le journal.

Un administrateur global sans amadmin#

Pour la configuration globale (serveurs, sites, services globaux, création de royaumes), refaites les étapes 1 à 5 dans le royaume racine : un groupe admins-tosiam dans l’annuaire du royaume racine, le privilège RealmAdmin accordé à ce groupe dans le royaume racine. Ses membres se connectent sans paramètre realm et reçoivent aussi le rôle ui-global-admin.

Ce sont aussi les seuls comptes, avec amadmin, qui peuvent utiliser ssoadm. Le fichier de mot de passe doit être lisible par son seul propriétaire (chmod 400) :

bash
ssoadm list-realms --realm / --adminid admin.tosiam --password-file ~/.tosiam-pwd

Avec un compte d’un sous-royaume, comme dduck, ssoadm répond Login failed.

Que faire d’amadmin#

amadmin ne se supprime pas : TOSIAM s’en sert pour lui-même et il reste le recours si l’annuaire LDAP est injoignable, puisque les comptes délégués en dépendent. Traitez-le comme un compte de secours :

  • remplacez son mot de passe par une valeur longue et aléatoire, gardée dans un coffre et connue de deux personnes au plus ;
  • ne l’utilisez plus pour l’administration courante, ni dans les scripts : donnez aux scripts un compte LDAP technique du royaume racine, membre d’un groupe qui n’a que les privilèges nécessaires ;
  • surveillez ses connexions dans le journal d’audit des authentifications : en temps normal, il n’y en a aucune.

Retirer un administrateur#

Retirez l’utilisateur du groupe dans l’annuaire. Le retrait vaut dès la requête suivante, y compris pour une session déjà ouverte : la console et l’API lui répondent 403. De même, un utilisateur ajouté au groupe reçoit les droits dès sa connexion suivante, sans délai.

Retirer le privilège au groupe, dans l’onglet Privilèges ou avec ssoadm remove-privileges, retire les droits à tous ses membres.

Dépannage#

Faites défiler le tableau
SymptômeCause probable
Le groupe n’apparaît pas dans Identités › GroupesFiltre de recherche de groupes, classe d’objet ou conteneur de groupes du datastore ne correspondent pas à l’annuaire ; group absent des types d’identités pris en charge.
Le groupe apparaît, mais sans membresMauvais Nom d’attribut pour un membre unique (uniqueMember au lieu de member, ou l’inverse).
Le privilège apparaît dans l’onglet Privilèges, mais les membres n’ont pas ui-realm-adminPrivilège ajouté par ssoadm add-privileges et pas appliqué par le serveur (TOS-1770) : désactivez-le et réactivez-le dans la console.
L’utilisateur est membre, mais arrive sur son profilIl s’est connecté dans un autre royaume que celui du groupe (vérifiez realm= dans l’URL) ; avec Authentification des administrateurs obligatoire, il ne s’est pas connecté par la chaîne des administrateurs (ajoutez service=adminconsoleservice) ; ou Nom d’attribut pour l’appartenance à un groupe est renseigné alors que l’annuaire ne calcule pas cet attribut (overlay memberof absent).
ssoadm répond Login failed. avec un compte déléguéLe compte appartient à un sous-royaume : ssoadm n’authentifie que dans le royaume racine.

Mis à jour le