Passer au contenu principal

ABAC

Qu'est-ce que le modèle ABAC ?

ABAC signifie Contrôle d'Accès Basé sur les Attributs. Il vous permet de contrôler l'accès en utilisant les attributs (propriétés) du sujet, de l'objet ou de l'action au lieu d'utiliser les valeurs de chaîne elles-mêmes. Vous avez peut-être entendu parler d'un langage de contrôle d'accès ABAC compliqué appelé XACML. L'ABAC de Casbin, en revanche, est beaucoup plus simple. Dans l'ABAC de Casbin, vous pouvez utiliser des structures ou des instances de classe au lieu de chaînes pour les éléments du modèle.

Jetons un coup d'œil à l'exemple officiel d'ABAC :

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == r.obj.Owner

Dans le comparateur, nous utilisons r.obj.Owner au lieu de r.obj. Le r.obj passé dans la fonction Enforce() sera une structure ou une instance de classe plutôt qu'une chaîne. Casbin utilisera la réflexion pour récupérer la variable membre obj dans cette structure ou classe pour vous.

Voici une définition pour la structure ou la classe r.obj :

type testResource struct {
Name string
Owner string
}

Si vous voulez passer des paramètres à l'exécuteur via JSON, vous devez activer la fonction avec e.EnableAcceptJsonRequest(true).

Par exemple :

e, _ := NewEnforcer("examples/abac_model.conf")
e.EnableAcceptJsonRequest(true)

data1Json := `{ "Name": "data1", "Owner": "bob"}`

ok, _ := e.Enforce("alice", data1Json, "read")
note

Activer la fonction d'acceptation des paramètres JSON peut entraîner une baisse de performance de 1,1 à 1,5 fois.

Comment utiliser ABAC ?

Pour utiliser ABAC, vous devez faire deux choses :

  1. Spécifiez les attributs dans le comparateur du modèle.
  2. Passez l'instance de la structure ou de la classe pour l'élément en argument à la fonction Enforce() de Casbin.
Le danger

Actuellement, seuls les éléments de demande comme r.sub, r.obj, r.act, etc. supportent ABAC. Vous ne pouvez pas l'utiliser sur des éléments de politique comme p.sub car il n'y a pas moyen de définir une structure ou une classe dans la politique de Casbin.

tip

Vous pouvez utiliser plusieurs attributs ABAC dans un comparateur. Par exemple : m = r.sub.Domain == r.obj.Domain.

tip

Si vous devez utiliser une virgule dans une politique qui entre en conflit avec le séparateur CSV, vous pouvez l'échapper en entourant l'instruction de guillemets. Par exemple, "keyMatch("bob", r.sub.Role)" ne sera pas divisé.

Mise à l'échelle du modèle pour un grand nombre de règles ABAC complexes

La mise en œuvre ci-dessus du modèle ABAC est simple en son cœur. Cependant, dans de nombreux cas, le système d'autorisation nécessite un grand nombre de règles ABAC complexes. Pour répondre à cette exigence, il est recommandé d'ajouter les règles dans la politique plutôt que dans le modèle. Cela peut être fait en introduisant une construction fonctionnelle eval(). Voici un exemple:

Ceci est la définition du fichier CONF utilisé pour définir le modèle ABAC.

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub_rule, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = eval(p.sub_rule) && r.obj == p.obj && r.act == p.act

Dans cet exemple, p.sub_rule est une structure ou une classe (type défini par l'utilisateur) qui contient les attributs nécessaires à utiliser dans la politique.

Ceci est la politique qui est utilisée contre le modèle pour l'application. Maintenant, vous pouvez utiliser l'instance d'objet passée à eval() en tant que paramètre pour définir certaines contraintes ABAC.

p, r.sub.Age > 18, /data1, read
p, r.sub.Age < 60, /data2, write