Modèle RBAC

Présentation

RBAC signifie contrôle d'accès basé sur les rôles (Role Based Access Control). Celà signifie qu'on gère les autorisations d'accès aux applications en examinant le(s) rôle(s) de l'utilisateur et en fournissant ce(s) rôle(s) à l'application.

LemonLDAP::NG permet d'utiliser ce modèle. Il est préférable d'utiliser un schéma LDAP étendu (ou toute extension de base de données utilisateur), mais ça peut fonctionner avec les attributs standard.

Configuration

Rôles comme simple valeur d'attribut utilisateur

On suppose que le schéma d'annuaire a été prévu pour stocker les rôles comme valeur de ssoRoles, un attribut utilisateur. This is simple because you can send the role to the application by creating a HTTP header (for example Auth-Role) with the concatenated values (';' is the concatenation string):

Auth-Roles => $ssoRoles

Si l'utilisateur dispose de ces valeurs dans son entrée :

ssoRoles: user
ssoRoles: admin

On les obtient dans l'en-tête Auth-Roles :

user; admin

Rôles comme entrée d'annuaire

On suppose le schéma suivant :

Les rôles sont des entrées, les branches subordonnées représentant les applications. Chaque utilisateur a des attributs ssoRoles, dont les valeurs sont les DN des rôles correspondants. Avec cette organisation, on peut définir les rôles de l'utilisateur au sein de chaque application.

Dans le schéma ci-dessus, l'utilisateur dispose des entrées suivantes :

ssoRoles: ou=admin,ou=aaa,ou=roles,dc=acme,dc=com
ssoRoles: ou=user,ou=bbb,ou=roles,dc=acme,dc=com

Ainsi, il est “user” sur l'application “BBB” et “admin” sur l'application “AAA”.

Il faut maintenant envoyer le bon rôle à la bonne application via LemonLDAP::NG.

Première étape : créer une règle pour autoriser l'accès seulement si l'utilisateur dispose d'un rôle dans l'application:

default => $ssoRoles =~ /ou=aaa,ou=roles/
default => $ssoRoles =~ /ou=bbb,ou=roles/

Seconde étape : obtenir le rôle dans cette application. On utilise les macros pour ça. Créer deux macros (dans Variables » Macros):

aaaRole => ((grep{/ou=aaa/} split(';',$ssoRoles))[0] =~ /ou=(.*),ou=aaa/)[0]
bbbRole => ((grep{/ou=bbb/} split(';',$ssoRoles))[0] =~ /ou=(.*),ou=bbb/)[0]

Ces expressions régulières lisent la valeur 'ou' du DN du rôle de l'application concernée. Ceci fonctionne si l'utilisateur a seulement un rôle par application.

Troisième étape : fournir le rôle à l'application. It is done by creating the correct HTTP header:

Auth-Roles => $aaaRoles
Auth-Roles => $bbbRoles

Now the protected application can read in the header HTTP_AUTH_ROLES the role of the user.

Si plusieurs rôles peuvent être donnés dans la même application, on peut joindre ces rôles avec un séparateur (ex : ||):

aaaRole => join(' || ', (map {/uid=(.*),ou=aaa.*/} (grep{/ou=aaa/} split(';',$ssoRoles)))