Passer au contenu principal

· 7 min de lecture
Rushikesh Tote

Introduction​

APISIX est une passerelle native de nuage haute performance et Ă©volutive basĂ©e sur Nginx et etcd. C'est un projet open source de la Fondation du logiciel Apache. En plus de cela, ce qui rend APISIX si bon est le support de nombreux plugins qui pourraient ĂȘtre utilisĂ©s pour implĂ©menter des fonctionnalitĂ©s comme l'authentification, surveillance, routage, etc. Et le fait que les plugins d'APISIX soient rechargĂ©s Ă  chaud (sans redĂ©marrage) le rend trĂšs dynamique.

Mais lorsque vous utilisez APISIX, il peut y avoir des scĂ©narios oĂč vous pourriez vouloir ajouter une logique d'autorisation complexe dans votre application. C'est lĂ  que authz-casbin pourrait vous aider, authz-casbin est un plugin APISIX basĂ© sur Lua Casbin qui permet une autorisation puissante basĂ©e sur diffĂ©rents modĂšles de contrĂŽle d'accĂšs. Casbin est une bibliothĂšque d'autorisation qui supporte le modčle de pilotage d'accĂšs comme ACL, RBAC, ABAC. Initialement Ă©crit en Go, il a Ă©tĂ© portĂ© dans de nombreuses langues et Lua Casbin est l'implĂ©mentation Lua de Casbin. Le dĂ©veloppement de authz-casbin a commencĂ© quand nous avons proposĂ© un nouveau plugin d'autorisation dans le dĂ©pĂŽt APISIX (#4674) auquel les membres du noyau se sont mis d'accord. And after the helpful reviews which led to some major changes and improvements, the PR (#4710) was finally merged.

Dans ce blog, nous utiliserons le plugin authz-casbin pour montrer comment vous pouvez implémenter un modÚle d'autorisation basé sur le contrÎle d'accÚs basé sur les rÎles (RBAC) dans APISIX.

NOTE: Vous devrez utiliser un autre plugin ou un workflow personnalisé pour l'authentification de l'utilisateur puisque Casbin ne fera que l'autorisation et non l'authentification.

CrĂ©ation d'un modĂšle​

Le plugin utilise trois paramĂštres pour autoriser toute requĂȘte - sujet, objet et action. Ici, le sujet est la valeur de l'en-tĂȘte du nom d'utilisateur, qui pourrait ĂȘtre quelque chose comme [username: alice]. Ensuite, l'objet est le chemin URL auquel on accĂšde et l'action est la mĂ©thode de requĂȘte utilisĂ©e.

Disons que nous voulons créer un modÚle avec trois ressources dans les chemins - /, /res1 et /res2. Et nous voulons avoir un modÚle comme celui-ci :

image

Cela signifierait que tous les utilisateurs (*) comme par exemple jack peuvent accĂ©der Ă  la page d'accueil (/). Et les utilisateurs avec les permissions admin comme alice et bob peuvent accĂ©der Ă  toutes les pages et toutes les ressources (comme res1 et res2). Aussi, limitons les utilisateurs qui n'ont pas les permissions d'administration Ă  utiliser uniquement la mĂ©thode de requĂȘte GET. Pour ce scĂ©nario, nous pourrions dĂ©finir le modĂšle comme:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

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

[matchers]
m = (g(r.sub, p.sub) || keyMatch(r.sub, p.sub)) && keyMatch(r.obj, p.obj) && keyMatch(r.act, p.act)

CrĂ©er une politique​

À partir du scĂ©nario ci-dessus, la politique serait:

p, *, /, GET
p, admin, *, *
g, alice, admin
g, bob, admin

La correspondance du modĂšle signifie :

  1. (g(r.sub, p.sub) || keyMatch(r.sub, p. ub)): Soit le sujet de la requĂȘte a un rĂŽle en tant que sujet de la rĂšgle ou celui de la requĂȘte correspond au sujet de la rĂšgle dans keyMatch. keyMatch est inclus dans la fonction Lua Casbin, vous pouvez jeter un Ɠil Ă  la description de la fonction et plus de fonctions qui pourraient ĂȘtre utiles ici.
  2. keyMatch(r.obj, p.obj): l'objet de la requĂȘte correspond Ă  l'objet de la politique (chemin URL ici).
  3. keyMatch(r.act, p.act): l'action de la requĂȘte correspond Ă  l'action de la politique (mĂ©thode de requĂȘte HTTP ici).

Activation du plugin sur la route​

Une fois que vous avez créé le modÚle et la politique, vous pouvez l'activer sur une route en utilisant l'API Admin APISIX. Pour l'activer en utilisant les chemins du modÚle et des fichiers de régulation :

curl http://127.0.0. :9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"authz-casbin": {
"model_path": "/path/to/model. onf",
"policy_path": "/path/to/policy. sv",
"username": "username"
}
},
"amon": {
"nodes": {
"127. 0.1:1980": 1
},
"type": "roundrobin"
},
"uri": "/*"
}'

Ici, le champ nom d'utilisateur est le nom d'en-tĂȘte que vous utiliserez pour passer dans le sujet. Par exemple, si vous passez l'en-tĂȘte du nom d'utilisateur en tant qu'utilisateur : alice, vous utiliserez "username": "user".

Pour utiliser le texte modĂšle/politique au lieu de fichiers, vous pouvez utiliser les champs modĂšle et politique Ă  la place:

curl http://127.0.0. :9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"authz-casbin": {
"model": "[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

[policy_effect]
e = quelque part (oĂč (p. ft == allow))

[matchers]
m = (g(r. ub, p. ub) || keyMatch(r.sub, p.sub)) && keyMatch(r.obj, p.obj) && keyMatch(r.act, p. ct)",

"polices": "p, *, /, GET
p, admin, *, *
g, alice, admin
g, bob, admin",

"username": "username"
}
},
"amon": {
"nodes": {
"127. 0.1:1980": 1
},
"type": "roundrobin"
},
"uri": "/*"
}'

Activer le plugin en utilisant un modùle/politique global​

Il peut y avoir des situations oĂč vous pourriez vouloir utiliser un modĂšle unique et une configuration de rĂšgles sur plusieurs routes. Vous pouvez le faire d'abord en envoyant une requĂȘte PUT pour ajouter le modĂšle et la configuration de la politique aux mĂ©tadonnĂ©es du plugin par:

curl http://127.0.0. :9080/apisix/admin/plugin_metadata/authz-casbin -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -i -X PUT -d '
{
"modĂšle": "[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

[policy_effect]
e = quelque part (oĂč (p. ft == allow))

[matchers]
m = (g(r.sub, p.sub) || keyMatch(r. ub, p.sub)) && keyMatch(r.obj, p.obj) && keyMatch(r. ct, p.act)",

"policy": "p, *, /, GET
p, admin, *, *
g, alice, admin
g, bob, admin"
}'

Et puis pour activer la mĂȘme configuration sur une certaine route, envoyez une requĂȘte en utilisant l'API Admin :

curl http://127.0.0. :9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"authz-casbin": {
"username": "username"
}
},
"amon": {
"nodes": {
"127. 0.1:1980": 1
},
"type": "roundrobin"
},
"uri": "/route1/*"
}'

Ceci ajoutera la configuration des métadonnées du plugin à la route. Vous pouvez aussi facilement mettre à jour la configuration des métadonnées du plugin en renvoyant la demande vers les métadonnées du plugin avec la mise à jour du modÚle et la configuration de la politique, le plugin mettra à jour automatiquement toutes les routes en utilisant les métadonnées du plugin.

Cas d'utilisation​

  • Le cas d'utilisation principal de ce plugin serait l'implĂ©mentation de l'autorisation dans vos API. Vous pouvez facilement ajouter ce plugin sur n'importe quelle route API que vous utilisez avec votre modĂšle d'autorisation et la configuration de la politique.
  • Si vous voulez avoir un modĂšle d'autorisation unique pour toutes vos API, vous pouvez utiliser la mĂ©thode du modĂšle global. Cela rend la mise Ă  jour de la politique facile pour tous les itinĂ©raires, car vous n'avez qu'Ă  mettre Ă  jour les mĂ©tadonnĂ©es dans etcd.
  • Si vous souhaitez utiliser un modĂšle diffĂ©rent pour chaque itinĂ©raire, vous pouvez utiliser la mĂ©thode de l'itinĂ©raire. Ceci est utile lorsque les diffĂ©rentes routes de l'API ont diffĂ©rents ensembles de permissions d'utilisateur. Vous pouvez Ă©galement utiliser cela lorsque vous avez affaire Ă  des politiques plus importantes, car cela rendra l’autorisation plus rapide lorsque filtrĂ©e sur plusieurs routes.

· Lecture d'une minute
Casbin

Aujourd'hui, nous sommes heureux d'annoncer que le fondateur de Casbin, Yang Luo reçoit le "Google Open Source Peer Bonus gagnants" pour son travail sur Casbin, Npcap et Nmap en 2019 Q3.

ospb

La lettre originale de rĂ©compense peut ĂȘtre consultĂ©e ici.

Le programme Google Open Source Peer Bonus est décrit comme :

De la mĂȘme maniĂšre qu'un bonus Google Pair est utilisĂ© pour reconnaĂźtre un autre Googler qui a dĂ©passĂ© et au-delĂ , un bonus de pair Open Source reconnaĂźt les personnes externes qui ont apportĂ© des contributions exceptionnelles Ă  l'open source.

L'annonce pour les gagnants de 2019 est disponible Ă  :

https://opensource.googleblog.com/2020/01/announcing-2019-second-cycle-google.html

Yang et Casbin sont listés parmi les développeurs et les projets open source qui ont un impact pertinent là-bas, comme Git, TensorFlow, V8, CPython, LLVM, projets Apache, Angular ou Jenkins.

Nous sommes heureux de voir que Casbin est ainsi reconnu pour sa contribution à la sécurité de l'open source et du cloud!

Merci d'avoir volé Casbin!

· Lecture d'une minute
Yang Luo

Aujourd'hui, nous avons migré la documentation de Casbin depuis le Wiki GitHub vers les Docs de ce site, qui est propulsé par Docusaurus. Docusaurus fournit beaucoup de fonctionnalités géniales comme de meilleurs styles Markdown, recherche plein texte, versioning, traduction.

La documentation n'est pas encore parfaite et a encore besoin d'ĂȘtre amĂ©liorĂ©e. Le code source est hĂ©bergĂ© sur GitHub: https://github.com/casbin/casbin-website.

Toute contribution ou suggestion est la bienvenue!

· Lecture d'une minute
Zixuan Liu

Aujourd'hui, nous avons porté Casbin sur Node.js, qui est nommé comme: node-Casbin.

node-Casbin partage l'utilisation et l'API similaires avec d'autres implĂ©mentations de Casbin. Les produits du milieu pour Express, Koa2 et Egg.js sont prĂȘts Ă  ĂȘtre utilisĂ©s. L'adaptateur de stockage pour Sequelize est Ă©galement prĂ©parĂ©.

J'espĂšre qu'il pourra bien servir votre besoin :)

GitHub: https://github.com/casbin/node-casbin

· Lecture d'une minute
Helong Zhang

Certains de nos clients demandent si Casbin peut ĂȘtre utilisĂ© comme un service au lieu d'une bibliothĂšque. La rĂ©ponse est OUI. Aujourd'hui, nous avons lancĂ© le projet Casbin Server en tant que solution concrĂšte pour Le contrĂŽle d'accĂšs en tant que service.

Le serveur Casbin est en cours de développement par notre équipe de base. Il a plusieurs caractéristiques :

  • Purement dĂ©veloppĂ© Ă  Golang.
  • Peut gĂ©rer des milliers d'instances Casbin, de sorte que vous pouvez dĂ©placer la logique d'application de la politique de plusieurs services vers un seul serveur Casbin.
  • gRPC est utilisĂ© pour communiquer avec le serveur Casbin. Nous envisageons Ă©galement d'ajouter le support RESTful dans un avenir proche.
  • Un portail administrateur web convivial est fourni aux administrateurs non-dĂ©veloppeurs pour gĂ©rer tous les dĂ©tails tels que les instances, les modĂšles, les politiques de stockage et l'Ă©quilibrage de charge.

Le code source est hébergé sur GitHub : https://github.com/casbin/casbin-server

Tous les problĂšmes ou demandes de fusion sont les bienvenus :)