Access
 sql >> Datenbank >  >> RDS >> Access

Erstellen einer rollenbasierten Zugriffskontrolle in MongoDB

Erstellen einer rollenbasierten Zugriffskontrolle in MongoDB

MongoDB bietet Benutzerzugriff über rollenbasierte Steuerelemente, einschließlich vieler integrierter Rollen, die Benutzern zugewiesen werden können. Die beiden bekanntesten Steuerelemente sind die Rollen „Lesen“ und „Lesen/Schreiben“, aber manchmal sind sie nicht so granular, wie wir es gerne hätten.

Ich hatte kürzlich die Gelegenheit, die benutzerdefinierten Rollen zu erkunden, die in MongoDB Version 2.6 eingeführt wurden. In diesem Artikel gehen wir die benutzerdefinierten Rollen von MongoDB durch und definieren einige benutzerdefinierte Rollen, die Sie möglicherweise nützlich finden.

  1. Erstellen Sie Rollen in MongoDB

    Das Erstellen einer benutzerdefinierten Rolle in MongoDB ist ganz einfach. Sie können den Befehl createRole verwenden, um eine neue Rolle zu erstellen, und die allgemeine Syntax zum Erstellen einer Rolle lautet wie folgt:

    
    {
       createRole: "<role name>",
       privileges: [{
          resource: { <resource> },
          actions: [ "<action>",] },
       ],
       roles: [
          { role: "<role>", db: "<database>" } | "<role>",],
       writeConcern: <write concern document>
    }
    
    

    Stellen Sie vor dem Ausführen des Befehls createRole sicher, dass Sie zu der Datenbank wechseln, in der Sie die Rolle erstellen möchten, da sie nur in der Datenbank definiert werden die sie geschaffen wurden. Wenn Sie eine Rolle erstellen möchten, die Zugriff auf mehr als eine Datenbank gewährt, muss sie in der Administratordatenbank erstellt werden.

    Lassen Sie uns die Hauptkomponenten der Syntax zum Erstellen von Rollen durchgehen.

  2. Rollenberechtigungen

    Erstellen Sie Berechtigungen für eine benutzerdefinierte Rolle, indem Sie eine Berechtigung hinzufügen und Ihre Aktionen und Ressourcen definieren:

    Privilegienaktionen

    Aktionen sind eine Reihe von Operationen, die gruppiert sind, wie z. B. die Einfügeaktion, die sowohl Einfügen als auch Erstellen ausführen kann. Aktionen sind so granular wie die rollenbasierte Zugriffskontrolle von MongoDB. Der Privilegien-Parameter kann verwendet werden, um Mongo-Aktionen Rollen hinzuzufügen, und eine Berechtigung stellt die Aktionen zusammen mit der Ressource dar, auf die sie sich bezieht. Verwenden Sie Folgendes, um die Aktionen „Suchen“, „Einfügen“ und „Aktualisieren“ in der Datenbank „mydb“ hinzuzufügen.

    
    privileges:
    [
       {resource: {db: "mydb", collection: "" },
       actions: [ “find”,”insert”,”update” ] }
    ]
    
    

    Privilegienressourcen

    Das Ressourcendokument gibt den Umfang an, in dem Ihre Berechtigungsaktionen gelten, und kann wie folgt auf verschiedene Granularitäten festgelegt werden:

    a. Sammlung

    Die Ressource kann auf Ressource gesetzt werden:{db: "<db-name>", collection: "<collection name>" } um die angegebenen Aktionen nur dieser bestimmten Sammlung zu gewähren.

    b. Datenbank

    Die Ressource kann auf eine bestimmte Datenbank eingestellt werden, indem der Sammlungsparameter leer gelassen wird. Ressourcen-String-Ressource:{db: "<db-name>", collection: "<collection name>" } legt den Geltungsbereich auf die gesamte Datenbank fest.

    c. Einzelne Sammlung über Datenbanken

    Die Ressource kann mit resource:{db: ", collection: "<collection name>" } um der Sammlung Berechtigungen für alle Datenbanken zu erteilen. Diese Berechtigung kann nur einer Rolle hinzugefügt werden, die in der Administratordatenbank erstellt wurde.

    d. Mehrere Sammlungen über Datenbanken hinweg

    Die Ressource kann auf alle Sammlungen (mit Ausnahme der Systemsammlungen) in allen Datenbanken eingestellt werden, indem sowohl die db- als auch die Sammlungsparameter beibehalten werden leer. Ressource:{db: "", collection: "" } . Diese Ressource, wie die obige, kann nur für eine Rolle gewährt werden, die in der Admin-Datenbank erstellt wurde.

    e. Clusterweite Ressource

    Eine clusterweite Ressource kann mithilfe von resource:{ cluster : true } angegeben werden . Diese clusterweite Ressource wird verwendet, um den Zustand des Systems anzugeben, wie z. B. Herunterfahren, replSetReconfig, anstatt Berechtigungen für ein bestimmtes Dokument zu erteilen.

    f. Alle Ressourcen

    Es wird nicht empfohlen, diesen Geltungsbereich für andere als außergewöhnliche Umstände zu verwenden. {anyResource: true } kann verwendet werden, um den Umfang auf alle Ressourcen festzulegen.

  3. Rollen

    Eingebaute Rollen können auch zu einer benutzerdefinierten Rolle hinzugefügt werden. Wenn eine integrierte Rolle mithilfe des Parameters roles:[] hinzugefügt wird, werden die Berechtigungen der integrierten Rolle zur benutzerdefinierten Rolle hinzugefügt.

    Hier ist ein Beispiel für den Parameter roles:

    
    roles: [{ role: "read", db: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;db name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;"}]
    
    

    In diesem Beispiel würde die benutzerdefinierte Rolle alle Berechtigungen der Rolle „Lesen“ für die definierte Datenbank erben. Wenn eine Rolle auf eine Datenbank db1 vererbt wird, kann die benutzerdefinierte Rolle entweder auf der Datenbank db1 oder auf der Admin-Datenbank erstellt werden.

    Bedenken schreiben

    Write Concern definiert die Ebene der Bestätigung, die von MongoDB angefordert wird, und kann verwendet werden, um Schreibbestätigungen von der Datenbank zu steuern. Beachten Sie, dass beim Erstellen einer Rolle kein Schreibschutz erforderlich ist. Schreibanliegen kann die Felder w, j und wtimeout enthalten:

    W  -  Anliegen schreiben

    Feld W kann verwendet werden, um die Anzahl der Instanzen anzugeben, an die der Schreibvorgang weitergegeben wurde.

    J  -  Anliegen schreiben

    Feld J kann gesetzt werden, um zu bestimmen, ob der Schreibvorgang in das Journal geschrieben wird.

    Wtimeout  -  Write Concern

    Dies wird verwendet, um die Zeit festzulegen, bis zu der der Schreibvorgang das Schreibinteresse erreichen muss. Der Schreibschutz kann nach dem Auslösen des Fehlers noch erreicht werden. Wenn kein Wtimeout festgelegt wurde und der Schreibvorgang nicht erreicht werden kann, wird der Schreibvorgang auf unbestimmte Zeit blockiert.

  4. Rollen zuweisen

    Benutzerdefinierte Rollen sind datenbankspezifisch und können nur einem Benutzer in derselben Datenbank zugewiesen werden.

    Nehmen wir an, wir haben eine Rolle „myrole“ in der Datenbank „db1“ erstellt. Mit den folgenden Befehlen können wir einen Benutzer in der Datenbank erstellen:

    
    Use db1
    
    db.createUser({"user" : "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;user&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;",pwd: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;password&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;","roles" : [{"role" : "myrole", "db" : "db1"}]})
    
    

    Weitere Informationen zur Benutzerverwaltung finden Sie in diesem Beitrag von Dharshan zur Benutzerverwaltung in MongoDB.

  5. Benutzerdefinierte Benutzerrollen

    Lassen Sie uns einige benutzerdefinierte Rollen durchgehen, die nützlich sein könnten.

    Einzelne Datenbank – Berechtigungen zum Lesen, Einfügen und Aktualisieren

    Die eingebauten Rollen read und readWrite können sich manchmal wie zu viele oder zu wenige Berechtigungen anfühlen. Sehen wir uns an, wie wir eine benutzerdefinierte Rolle erstellen können, die nur Lese-, Einfüge- und Schreibberechtigungen gewährt.

    Wir wissen bereits, dass wir alle Leseberechtigungen benötigen, damit wir die integrierte Rolle „Lesen“ zu unserer benutzerdefinierten Rolle hinzufügen können. Wir benötigen auch Berechtigungen zum Erstellen und Aktualisieren von Dokumenten, und diese können durch Hinzufügen von Berechtigungsaktionen zum Einfügen und Aktualisieren eingeschlossen werden. Wenn wir dem Benutzer die Möglichkeit geben wollten, einen Index und eine Sammlung zu erstellen, können wir die Berechtigungsaktionen createIndex und createCollection hinzufügen.

    Nehmen wir für den Geltungsbereich an, dass ich eine Datenbank namens „db1“ habe, für die ich die oben genannten Berechtigungen festgelegt habe. Der create-Befehl würde in etwa so aussehen:

    
    Use db1.
    
    db.createRole(
    
    {
    
    createRole: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;role-name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;",
    
    privileges: [
    
    { resource: { db: "db1", collection: "" },
    
    actions: [ "insert","update","createIndex", "createCollection" ] }
    
    ],
    
    roles: [{ role: "read", db: "db1"}]
    
    })
    
    

    Der obige Befehl würde eine Rolle mit <role-name> erstellen in der Datenbank db1. Ein Benutzer, dem die Berechtigung durch die obige Rolle erteilt wurde, verfügt nicht über die Berechtigungsaktion „Entfernen“. Beachten Sie außerdem, dass die Methoden db.collection.findAndModify(),  db.collection.mapReduce() und  db.collection.aggregate() nicht vollständig ausgeführt werden können, da sie die Berechtigung zum Entfernen erfordern.

    Alle DBs – Lese-, Einfüge- und Aktualisierungsberechtigungen

    Wir können eine Rolle in der Admin-Datenbank erstellen, die der obigen ähnelt, um Lese-, Erstellungs- und Aktualisierungsrechte für alle Datenbanken zu gewähren. Diese Rolle sollte in der Admin-DB erstellt werden und der nachfolgende Benutzer sollte ebenfalls in der Admin-DB erstellt werden.

    Für diese Rolle können wir Berechtigungen von der readAnyDatabase-Rolle erben, anstatt die standardmäßige Leserolle zu verwenden. Die Rollenerstellung würde in etwa so aussehen:

    
    Use admin.
    
    db.createRole(
    
    {
    
    createRole: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;role-name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;",
    
    privileges: [
    
    { resource: { db: "", collection: "" },
    
    actions: [ "insert","update","createIndex", "createCollection" ] }
    
    ],
    
    roles: [{ role: "readAnyDatabase", db: "admin"}]
    
    })
    
    

    Writer-Rollen mit Write Concern

    Wenn Sie ein Szenario haben, in dem die Schreibbedenken erzwungen werden müssen, können Sie sie wie folgt zu einer Rolle hinzufügen. Das Hinzufügen von Write Concern zu einer Rolle würde dies für alle Benutzer erzwingen, denen diese Rolle in der Datenbank zugewiesen wurde. Lassen Sie uns eine Rolle mit einem Schreibinteresse definieren, das Mehrheitsschreibvorgänge erzwingt:

    
    Use admin.
    
    db.createRole(
    
    {
    
    createRole: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;role-name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;",
    
    privileges: [ ],
    
    roles: [{ role: "readWriteAnyDatabase", db: "admin"}],
    
    writeConcern: { w: “majority”, j: false, wtimeout: 300 }
    
    })