Video: Zeitgeist Addendum 2024
Een handig patroon voor beveiliging is om machtigingen toe te passen op basis van gegevens in een record in plaats van afzonderlijk machtigingen toe te wijzen aan de record. Dit zou kunnen zijn gebaseerd op waarden voor metadata, afzonderlijke kolommen (Bigtable clones) of element (Aggregate NoSQL-databases).
Een goed voorbeeld is dat een klantnaam in een document wordt genoemd. Misschien wilt u de toegang beperken tot alle documenten die dat noemen -klant alleen voor die mensen die toegang hebben tot de informatie van deze klant. U kunt de toegang tot deze documenten beperken door de gegevens in het document te verwerken en de relevante beveiligingsmachtigingen toe te passen op basis van de waarde van die gegevens.
Geen NoSQL-databases bieden deze mogelijkheid direct uit de doos. Dat komt omdat machtigingen moeten worden toegewezen aan de record nadat de gegevens zijn opgeslagen door de toepassing maar voordat deze beschikbaar zijn voor het ophalen door andere toepassingen of gebruikers. Deze toestemmingsopdracht moet dus plaatsvinden binnen de transactiegrens.
Ook ondersteunen zeer weinig NoSQL-databases ACID-compatibele transacties (MarkLogic, FoundationDB en Neo4j, bijvoorbeeld). Als een database de toewijzing van rechten op basis van gegevens in een document niet ondersteunt, maar wel ACID-transacties ondersteunt en triggers vooraf vastlegt, is een eenvoudige oplossing mogelijk.
Het is over het algemeen eenvoudig om een trigger te schrijven die controleert op de aanwezigheid van een waarde in een record en om machtigingen aan te passen op basis van de waarde. Zolang een database dit ondersteunt tijdens het commit-proces en niet na de commit, weet u dat uw gegevens veilig zijn gemaakt door een eenvoudige pre-commit-trigger te gebruiken.
MarkLogic Server ondersteunt bijvoorbeeld volledig serialiseerbare ACID-transacties en pre-commit-triggers. Hierna volgt een eenvoudig XML-document dat ik wil ondersteunen voor op attributen gebaseerd toegangsbeheer:
jbloggs ACME Lorem Ipsum Dolar Sit Amet …
De triggers van MarkLogic Server gebruiken de W3C XQuery-taal. Het volgende XQuery-voorbeeld is een eenvoudige trigger die, wanneer geïnstalleerd in MarkLogic, lees- en schrijfrechten toewijst:
xqueryversie "1. 0-ml"; importmodule naamruimte trgr = ' // marklogic. com / xdmp / triggers 'at' / MarkLogic / triggers. xqy '; declare variabele $ trgr: uri as xs: string external; declare $ trgr: trigger as node () external; if ("ACME" = fn: doc ($ trgr: uri) / MeetingReport / Customer) dan xdmp: document-set-permissies ($ trgr-uri, (xdmp: permission ("seniorsales", "update"), xdmp: permission ("sales", "read"))) else ()
Nadat de trigger is geïnstalleerd in de bestandssetbestanden.xqy in een MarkLogic Server Modules-database voert u de volgende code uit in de webcoderingsapplicatie voor MarkLogic - Query Console om de trigger in te schakelen. Bij een standaard MarkLogic Server-installatie kunt u de Query Console vinden op de URL: // localhost: 8000 / qconsole.
Hier is code die laat zien hoe de trigger te installeren met behulp van Query Console:
xquery-versie "1. 0-ml"; importmodule naamruimte trgr = " // marklogic. com / xdmp / triggers" op '/ MarkLogic / triggers. xqy '; trgr: create-trigger ("setperms", "Set Sales Doc Permissions", trgr: trigger-data-event (trgr: collection-scope ("meetingreports"), trgr: document-content ("modify"), trgr: pre -commit ()), trgr: trigger-module (xdmp: database ("Modules"), "/ triggers /", "setperms. xqy"), fn: true (), xdmp: standaard-machtigingen (), fn: false ())