Video: Preview: Hyperstar - Hoshiningen's grosser Auftritt 2024
Ein nützliches Sicherheitsmuster besteht darin, Berechtigungen basierend auf Daten innerhalb eines Datensatzes anzuwenden, anstatt dem Datensatz separat Berechtigungen zuzuweisen. Dies kann entweder auf Metadaten, einzelnen Spaltenwerten (Bigtable-Klone) oder Elementwerten (Aggregat-NoSQL-Datenbanken) basieren.
Ein gutes Beispiel ist der Name eines Kunden, der in einem Dokument erwähnt wird. Möglicherweise möchten Sie den Zugriff auf alle Dokumente, in denen dieser Kunde angegeben ist, nur auf Personen beschränken, die Zugriff auf die Informationen dieses Kunden haben. Sie können den Zugriff auf diese Dokumente beschränken, indem Sie die Daten innerhalb des Dokuments verarbeiten und die entsprechenden Sicherheitsberechtigungen basierend auf dem Wert dieser Daten anwenden.
Nein. NoSQL-Datenbanken bieten diese Funktion sofort an. Das liegt daran, dass Berechtigungen dem Datensatz zugewiesen werden müssen, nachdem die Daten von der Anwendung gespeichert wurden, aber bevor sie von anderen Anwendungen oder Benutzern abgerufen werden können. Daher muss diese Berechtigungszuweisung innerhalb der Transaktionsgrenze erfolgen.
Außerdem unterstützen nur sehr wenige NoSQL-Datenbanken ACID-kompatible Transaktionen (z. B. MarkLogic, FoundationDB und Neo4j). Wenn eine Datenbank die sofortige Zuweisung von Berechtigungen basierend auf Daten in einem Dokument nicht unterstützt, aber ACID-Transaktionen und Pre-Commit-Trigger unterstützt, ist eine einfache Problemumgehung möglich.
Es ist im Allgemeinen einfach, einen Trigger zu schreiben, der das Vorhandensein eines Wertes innerhalb eines Datensatzes überprüft und Berechtigungen basierend auf seinem Wert ändert. Solange eine Datenbank dies während des Commit-Vorgangs und nicht nach dem Commit unterstützt, wissen Sie, dass Ihre Daten durch einen einfachen Pre-Commit-Trigger gesichert werden.
Als Beispiel unterstützt MarkLogic Server vollständig serialisierbare ACID-Transaktionen und Pre-Commit-Trigger. Im Folgenden finden Sie ein einfaches XML-Dokument, das ich für die attributbasierte Zugriffssteuerung unterstützen möchte:
jbloggs ACME Lorem Ipsum Dolar Sit Amet …
Die Trigger von MarkLogic Server verwenden die W3C XQuery-Sprache. Das folgende XQuery-Beispiel ist ein einfacher Trigger, der bei der Installation in MarkLogic Lese- und Schreibberechtigungen zuweist:
xquery version "1. 0-ml"; import module namespace trgr = ' // marklogic. com / xdmp / triggert 'at' / MarkLogic / triggert. xqy '; deklariere die Variable $ trgr: uri als xs: string external; Deklariere die Variable $ trgr: triggere als node () external; if ("ACME" = fn: doc ($ trgr: uri) / MeetingReport / Kunde) dann xdmp: document-set-permissions ($ trgr-uri, (xdmp: Berechtigung ("seniorsales", "update"), xdmp: permission ("sales", "read"))) else ()
Sobald der Trigger in der Datei setperms installiert ist.xqy in einer MarkLogic Server Modules Database, führen Sie den folgenden Code in der Webcodierungsanwendung für MarkLogic - Query Console aus, um den Trigger zu aktivieren. Bei einer Standardinstallation von MarkLogic Server finden Sie die Abfragekonsole unter der URL: // localhost: 8000 / qconsole.
Hier ist ein Code, der zeigt, wie Sie den Trigger mit der Abfragekonsole installieren:
xquery version "1. 0-ml"; import module namespace trgr = " // marklogic./xdmp/trigger" at '/ MarkLogic / triggers. xqy '; trgr: create-trigger ("setperms", "Setze Verkaufsberechtigungen setzen", trgr: trigger-data-event (trgr: Erfassungsbereich ("meetingreports"), trgr: document-content ("modifizieren"), trgr: pre -commit ()), trgr: Trigger-Modul (xdmp: Datenbank ("Module"), "/ triggers /", "setperms. xqy"), fn: true (), xdmp: default-permissions (), fn: falsch ())