Casbin-ruby

Autorisierungsbibliothek für verteilte rollenbasierte Zugriffskontrolle (RBAC)

Unser KFC-Projekt verwendet eine Microservice-Architektur mit Komponenten, die in verschiedenen Sprachen und Laufzeitumgebungen geschrieben sind, wie z. B. .NET, Ruby und Go. Viele dieser Komponenten müssen in der Lage sein, Entscheidungen auf Grundlage des Berechtigungsstatus eines Benutzers zu treffen: Wer ist er, welchen Rollen gehört er an und welche Aktionen kann er wo durchführen?

Wir brauchten eine konsistente Möglichkeit, rollenbasierte Zugriffskontrolle zwischen mehreren unabhängigen Sprachen zu verwenden, und wir brauchten auch eine Möglichkeit, die Berechtigungen und Zugriffskontrolllisten (ACLs) zu verwalten.

Bei der Entwicklung von Anwendungen in gängigen Frameworks in Sprachen wie Ruby, Python, PHP oder Go ist die rollenbasierte Zugriffskontrolle in der Regel Teil des Frameworks und kann ohne Weiteres verwendet werden. Das hilft aber nicht weiter, wenn man eine Anwendung als Teil eines viel größeren Systems entwickelt, das nicht durchgängig die gleichen Frameworks verwendet.

Wir haben es uns zur Aufgabe gemacht, unsere Möglichkeiten zu recherchieren, und haben schnell herausgefunden, dass wir die Wahl hatten. Ein Ansatz wäre die Verwendung eines zentralisierten Dienstes wie Keycloak, der als gemeinsamer Autorisierungsbroker für alle Microservices fungiert. Der offensichtliche Nachteil ist, dass der zentralisierte Broker zu einem Single Point of Failure und einem potenziellen Flaschenhals wird. Ein Ausfall an dieser Stelle würde bedeuten, dass alle Vorteile einer verteilten Microservice-Architektur im Handumdrehen verloren wären.

Also haben wir uns stattdessen dezentralen Ansätzen zugewandt und unsere Aufmerksamkeit insbesondere darauf gelenkt, einen konsistenten Weg zur Darstellung und Verarbeitung von Zugriffskontrolllisten über verschiedene Sprachen hinweg zu finden. Dadurch haben wir Casbin entdeckt, eine Autorisierungsbibliothek, die genau dies tut und in einer Vielzahl verschiedener Sprachen implementiert ist.

Wir hatten also unsere RBAC-Implementierung, aber es gab einen Haken. Wir brauchten eine Ruby-Implementierung, und Casbin war noch nicht nach Ruby portiert worden. Also haben wir beschlossen, es selbst zu machen. Dadurch ist Casbin-Ruby entstanden. Da Casbin bereits auf viele verschiedene Sprachen portiert wurde, verfügt es über eine umfangreiche Testsuite, mit der wir überprüfen können, ob sich unsere Implementierung konsistent mit ihren „Verwandten“ verhält.

 

Wie funktioniert’s?

Im einfachsten Fall hat jeder Microservice Zugriff auf zwei Dateien, die über das System verteilt sind. Die erste enthält eine Liste der Benutzer, Gruppen, Rollen usw. – mit anderen Worten, sie definiert die Berechtigungsprinzipien. Die zweite enthält die Zuordnungen zwischen den Prinzipalen: Sie ist im Grunde eine Zusammenfassung aller vom System verwendeten Zugriffskontrolllisten.

Dies ist die Lösung für den eigentlichen Kern unserer Herausforderung: die dezentrale (oder verteilte) Verwaltung von Benutzern, Rollen und deren Möglichkeiten.

Was Casbin ermöglicht:

  • Die Richtlinie in der klassischen Form {subject, object, action} oder einer von Ihnen definierten angepassten Form durchzusetzen. Es werden sowohl „Allow“ als auch „Deny“-Berechtigungen unterstützt.
  • Die Speicherung des Zugriffskontrollmodells und der zugehörigen Richtlinie zu übernehmen.
  • Die Rollen-Benutzer-Zuordnungen und Rollen-Rollen-Zuordnungen zu verwalten (auch bekannt als Rollenhierarchie in RBAC).
  • Unterstützung eingebauter Superuser wie root oder administrator. Ein Superuser kann alles ohne explizite Berechtigungen tun.
  • Mehrere eingebaute Operatoren zur Unterstützung des Regelabgleichs. Zum Beispiel kann keyMatch einen Ressourcenschlüssel /foo/bar auf das Muster /foo* abbilden.

Was Casbin NICHT ermöglicht:

  • Authentifizierungen (also Verifizierung von username und password wenn sich ein Benutzer anmeldet)
  • Das Verwalten der Liste der Benutzer oder Rollen. Es ist viel bequemer für das Projekt, selbst diese Entitäten zu verwalten. Benutzer kennen normalerweise ihre Passwörter, und Casbin ist nicht als Passwort-Container konzipiert. Casbin speichert jedoch die Benutzer-Rollen-Zuordnung für das RBAC-Szenario.

Installieren Sie Casbin mit:

to use latest version:
gem 'casbin-ruby', github: 'CasbinRuby/casbin-ruby'

to use specific version:
gem 'casbin-ruby', '1.0.5'

Zukünftige Entwicklung

Die Entwicklung unserer Ruby-Implementierung von Casbin hat etwa einen Monat. gedauert Durch die Verwendung von Tests aus bestehenden Implementierungen in verschiedenen Sprachen haben wir mit einer tiefen Basis an Testabdeckung begonnen und den TDD-first-Ansatz (test-driven development) durchgehend beibehalten.

Seit der Entwicklung der Kern-Implementierung in Ruby gehen wir dazu über, Stores und Benachrichtigungen zu schreiben. Wir planen auch die Unterstützung von Rollenmanagern und beabsichtigen außerdem, Brücken zu verschiedenenRuby on Rails, Hanami und Roda zu bauen.

Casbin-Ruby ist auf Github verfügbar, und Sie können mehr über Casbin selbst auf der website erfahren.

Casbin ist eine leistungsfähige und effiziente Open-Source-Zugriffskontrollbibliothek für Ruby-Projekte. Es bietet Unterstützung für eine erzwungene Autorisierung basierend auf verschiedenen Zugriffskontrollmodellen. Sprechen Sie uns an, wenn Sie Probleme oder Funktionswünsche haben. Pull-Requests sind gern gesehen!
Alexander Kirillov
CTO Evrone
Kontaktieren Sie uns
Schwebt Ihnen ein Projekt vor?
Setzen wir es gemeinsam um
Datei anhängen
Die Dateien müssen kleiner als 8 MB sein.
Zulässige Dateierweiterungen: jpg jpeg png txt rtf pdf doc docx ppt pptx.
Diese Website wird durch reCAPTCHA geschützt. Es gelten die Datenschutzerklärung und die Nutzungsbedingungen von Google.