Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Beispiel 1: Grundlegendes ABAC mit OPA und Rego
In diesem Abschnitt wird ein Szenario beschrieben, in dem OPA verwendet wird, um Zugriffsentscheidungen darüber zu treffen, welche Benutzer auf Informationen in einem fiktiven Payroll-Microservice zugreifen dürfen. Es werden Rego-Codefragmente bereitgestellt, um zu demonstrieren, wie Sie Rego verwenden können, um Entscheidungen zur Zugriffskontrolle zu treffen. Diese Beispiele sind weder erschöpfend noch stellen sie eine vollständige Untersuchung der Funktionen von Rego und OPA dar. Für einen umfassenderen Überblick über Rego empfehlen wir Ihnen, die Rego-Dokumentation auf der OPA-Website
Beispiel für grundlegende OPA-Regeln
Im vorherigen Diagramm lautet eine der Zugriffskontrollregeln, die von OPA für den Payroll-Microservice durchgesetzt wurden:
Mitarbeiter können ihr Gehalt selbst ablesen.
Wenn Bob versucht, auf den Payroll-Microservice zuzugreifen, um sein eigenes Gehalt einzusehen, kann der Payroll-Microservice den API-Aufruf an die OPA-API weiterleiten, um eine Zugriffsentscheidung zu RESTful treffen. Der Payroll-Service fragt OPA nach einer Entscheidung mit der folgenden JSON-Eingabe ab:
{ "user": "bob", "method": "GET", "path": ["getSalary", "bob"] }
OPA wählt auf der Grundlage der Abfrage eine oder mehrere Richtlinien aus. In diesem Fall wertet die folgende Richtlinie, die in Rego geschrieben ist, die JSON-Eingabe aus.
default allow = false allow = true { input.method == "GET" input.path = ["getSalary", user] input.user == user }
Diese Richtlinie verweigert standardmäßig den Zugriff. Anschließend wird die Eingabe in der Abfrage ausgewertet, indem sie an die globale Variable gebunden wird. input Der Punktoperator wird mit dieser Variablen verwendet, um auf die Werte der Variablen zuzugreifen. Die Rego-Regel allow gibt true zurück, wenn die Ausdrücke in der Regel ebenfalls wahr sind. Die Rego-Regel überprüft, ob method in der Eingabe GET entspricht. Anschließend wird überprüft, ob das erste Element in der Liste vorhanden path ist, getSalary bevor der Variablen das zweite Element in der Liste zugewiesen wird. user Schließlich überprüft es, ob es sich um den Pfad handelt, auf den zugegriffen wird, /getSalary/bob indem überprüft wird, ob die user Anfrage,, gestellt wirdinput.user, mit der user Variablen übereinstimmt. Die Regel allow wendet die Wenn-Dann-Logik an, um einen booleschen Wert zurückzugeben, wie in der Ausgabe gezeigt:
{ "allow": true }
Teilregel, die externe Daten verwendet
Um zusätzliche OPA-Funktionen zu demonstrieren, können Sie der Zugriffsregel, die Sie durchsetzen, Anforderungen hinzufügen. Nehmen wir an, Sie möchten diese Zugriffskontrollanforderung im Kontext der vorherigen Abbildung durchsetzen:
Mitarbeiter können das Gehalt aller Mitarbeiter ablesen, die ihnen unterstellt sind.
In diesem Beispiel hat OPA Zugriff auf externe Daten, die importiert werden können, um eine Zugriffsentscheidung zu treffen:
"managers": { "bob": ["dave", "john"], "carol": ["alice"] }
Sie können eine beliebige JSON-Antwort generieren, indem Sie in OPA eine Teilregel erstellen, die statt einer festen Antwort eine Reihe von Werten zurückgibt. Dies ist ein Beispiel für eine Teilregel:
direct_report[user_ids] { user_ids = data.managers[input.user][_] }
Diese Regel gibt eine Gruppe aller Benutzer zurück, die über den Wert von berichteninput.user, der in diesem Fall istbob. Das [_] Konstrukt in der Regel wird verwendet, um über die Werte der Menge zu iterieren. Dies ist die Ausgabe der Regel:
{ "direct_report": [ "dave", "john" ] }
Durch das Abrufen dieser Informationen kann festgestellt werden, ob ein Benutzer einem Manager direkt unterstellt ist. Für einige Anwendungen ist die Rückgabe von dynamischem JSON der Rückgabe einer einfachen booleschen Antwort vorzuziehen.
Zusammenführung
Die letzte Zugriffsanforderung ist komplexer als die ersten beiden, da sie die in beiden Anforderungen angegebenen Bedingungen kombiniert:
Die Mitarbeiter können ihr eigenes Gehalt und das Gehalt aller Personen, die ihnen unterstellt sind, ablesen.
Um diese Anforderung zu erfüllen, können Sie diese Rego-Richtlinie verwenden:
default allow = false allow = true { input.method == "GET" input.path = ["getSalary", user] input.user == user } allow = true { input.method == "GET" input.path = ["getSalary", user] managers := data.managers[input.user][_] contains(managers, user) }
Die erste Regel in der Richtlinie gewährt jedem Benutzer Zugriff, der versucht, seine eigenen Gehaltsinformationen einzusehen, wie bereits beschrieben. Zwei Regeln mit demselben Namen zu habenallow, funktioniert in Rego als logischer Operator oder. Die zweite Regel ruft die Liste aller direkt unterstellten Mitarbeiter ab, die mit input.user (aus den Daten im vorherigen Diagramm) verknüpft sind, und weist diese Liste der Variablen zu. managers Schließlich überprüft die Regel, ob der Benutzer, der versucht, sein Gehalt einzusehen, direkt unterstellt ist, input.user indem überprüft wird, ob sein Name in der Variablen enthalten ist. managers
Die Beispiele in diesem Abschnitt sind sehr einfach und bieten keine vollständige oder gründliche Erläuterung der Funktionen von Rego und OPA. Weitere Informationen finden Sie in der OPA-Dokumentation