Access
 sql >> Database >  >> RDS >> Access

Creazione del controllo degli accessi basato sul ruolo in MongoDB

Creazione del controllo degli accessi basato sui ruoli in MongoDB

MongoDB fornisce l'accesso utente tramite controlli basati sui ruoli, inclusi molti ruoli integrati che possono essere assegnati agli utenti. I due controlli più noti sono i ruoli di lettura e lettura/scrittura, tuttavia, a volte, non sono così dettagliati come vorremmo che fossero.

Recentemente ho avuto la possibilità di esplorare i ruoli definiti dall'utente introdotti in MongoDB versione 2.6. In questo articolo, esamineremo i ruoli definiti dall'utente di MongoDB e definiremo alcuni ruoli personalizzati che potresti trovare utili.

  1. Crea ruoli in MongoDB

    Creare un ruolo definito dall'utente in MongoDB è abbastanza semplice. Puoi utilizzare il comando createRole per creare un nuovo ruolo e la sintassi generica di creazione del ruolo è la seguente:

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

    Prima di eseguire il comando createRole, assicurati di passare al database in cui desideri creare il ruolo poiché saranno definiti solo nel database in cui sono stati creati. Se desideri creare un ruolo che conceda l'accesso a più di un database, dovrà essere creato nel database dell'amministratore.

    Esaminiamo i componenti principali della sintassi di creazione del ruolo.

  2. Privilegi ruolo

    Crea autorizzazioni per un ruolo definito dall'utente aggiungendo un privilegio e definendo le tue azioni e risorse:

    Azioni privilegiate

    Le azioni sono un insieme di operazioni raggruppate, come l'azione di inserimento che può eseguire sia l'inserimento che la creazione. Le azioni sono tanto granulari quanto il controllo degli accessi basato sui ruoli di MongoDB. Il parametro privilegi può essere utilizzato per aggiungere ruoli alle azioni mongo e un privilegio costituisce le azioni insieme alla risorsa a cui si applica. Utilizzare quanto segue per aggiungere le azioni trova, inserisci e aggiorna sul database “mydb”.

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

    Risorse privilegiate

    Il documento della risorsa specifica l'ambito di applicazione delle tue azioni sui privilegi e può essere impostato in varie granularità come segue:

    a. Raccolta

    La risorsa può essere impostata come risorsa:{db: "<db-name>", collection: "<collection name>" } per concedere le azioni specificate solo a quella particolare raccolta.

    b. Banca dati

    La risorsa può essere impostata su un database particolare lasciando vuoto il parametro di raccolta. Risorsa stringa di risorsa:{db: "<db-name>", collection: "<collection name>" } imposta l'ambito sull'intero database.

    c. Raccolta unica su database

    La risorsa può essere impostata su una particolare collezione usando la risorsa:{db: ", collection: "<collection name>" } per concedere le autorizzazioni alla raccolta su tutti i database. Questa autorizzazione può essere aggiunta solo a un ruolo creato nel database dell'amministratore.

    d. Collezioni multiple su database

    La risorsa può essere impostata su tutte le raccolte (tranne le raccolte di sistema) in tutti i database lasciando entrambi i parametri db e raccolta vuoto. risorsa:{db: "", collection: "" } . Questa risorsa, come quella sopra, può essere concessa solo su un ruolo creato nel database di amministrazione.

    e. Risorsa a livello di cluster

    È possibile specificare una risorsa a livello di cluster utilizzando la risorsa:{ cluster : true } . Questa risorsa a livello di cluster viene utilizzata per specificare lo stato del sistema, come l'arresto di replSetReconfig, anziché concedere autorizzazioni su un particolare documento.

    f. Tutte le risorse

    Non è consigliabile utilizzare questo ambito se non in circostanze straordinarie. {anyResource: true } può essere utilizzato per impostare l'ambito impostato su tutte le risorse.

  3. Ruoli

    Anche i ruoli integrati possono essere aggiunti a un ruolo personalizzato. Quando un ruolo integrato viene aggiunto utilizzando il parametro role:[], aggiunge le autorizzazioni del ruolo integrato al ruolo personalizzato.

    Ecco un esempio del parametro ruoli:

    
    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 questo esempio, il ruolo personalizzato erediterebbe tutte le autorizzazioni del ruolo "lettura" sul database definito. Se un ruolo viene ereditato in un database db1, il ruolo personalizzato può essere creato nel database db1 o nel database admin.

    Scrivi preoccupazione

    La preoccupazione di scrittura definisce il livello di riconoscimento richiesto da MongoDB e può essere utilizzato per controllare i riconoscimenti di scrittura dal database. Tieni presente che un problema di scrittura non è richiesto durante la creazione di un ruolo. Il problema di scrittura può includere i campi w, je wtimeout:

    W  -  Scrivi preoccupazione

    Il campo W può essere utilizzato per indicare il numero di istanze in cui è stata propagata la scrittura.

    J  -  Scrivi preoccupazione

    Il campo J può essere impostato per determinare se la scrittura viene scritta sul diario.

    Wtimeout  -  Scrivi preoccupazione

    Questo è usato per impostare il tempo entro il quale la scrittura deve raggiungere la preoccupazione di scrittura. Il problema di scrittura potrebbe ancora essere raggiunto dopo che è stato generato l'errore. Se non è stato impostato un Wtimeout e non è possibile ottenere il problema di scrittura, la scrittura verrà bloccata a tempo indeterminato.

  4. Assegnazione dei ruoli

    I ruoli personalizzati sono specifici del db e possono essere assegnati solo a un utente nello stesso database.

    Diciamo di aver creato un ruolo "myrole" sul database "db1". Possiamo creare un utente sul database usando i seguenti comandi:

    
    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"}]})
    
    

    Per ulteriori informazioni sulla gestione degli utenti, fai riferimento a questo post di Dharshan sulla gestione degli utenti in MongoDB.

  5. Ruoli utente personalizzati

    Esaminiamo alcuni ruoli personalizzati che potrebbero essere utili.

    DB singolo:autorizzazioni di lettura, inserimento e aggiornamento

    I ruoli integrati read e readWrite a volte possono sembrare troppi permessi o troppo pochi. Vediamo come possiamo creare un ruolo personalizzato concedendo solo i permessi di lettura, inserimento e scrittura.

    Sappiamo già che abbiamo bisogno di tutti i permessi di lettura in modo da poter aggiungere il ruolo integrato "lettura" al nostro ruolo personalizzato. Abbiamo anche bisogno delle autorizzazioni per creare e aggiornare i documenti, e questi possono essere inclusi aggiungendo le azioni di privilegio di inserimento e aggiornamento. Se vogliamo dare all'utente la possibilità di creare un indice e creare una raccolta, possiamo aggiungere l'azione di privilegio createIndex e createCollection.

    Per l'ambito, supponiamo di avere un db chiamato "db1" su cui ho impostato i permessi di cui sopra. Il comando di creazione sarebbe simile a questo:

    
    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"}]
    
    })
    
    

    Il comando precedente creerebbe un ruolo con <role-name> nel database db1. Un utente a cui è stata concessa l'autorizzazione dal ruolo sopra non avrà l'azione di privilegio "rimuovi". Inoltre, tieni presente che i metodi db.collection.findAndModify(),  db.collection.mapReduce() e  db.collection.aggregate() non possono essere eseguiti completamente poiché richiedono il privilegio di rimozione.

    Tutti i DB:leggi, inserisci e aggiorna le autorizzazioni

    Possiamo creare un ruolo nel database di amministrazione simile a quello sopra, per concedere i privilegi di lettura, creazione e aggiornamento su tutti i DB. Questo ruolo deve essere creato nel DB di amministrazione e anche l'utente successivo deve essere creato nel DB di amministrazione.

    Per questo ruolo, invece di utilizzare il ruolo di lettura standard, possiamo ereditare i permessi dal ruolo readAnyDatabase. Il ruolo creato sarebbe simile a questo:

    
    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"}]
    
    })
    
    

    Ruoli di scrittore con preoccupazione per la scrittura

    Se hai uno scenario in cui è necessario imporre un problema di scrittura, ecco come può essere aggiunto a un ruolo. L'aggiunta di un problema di scrittura a un ruolo lo imporrebbe a tutti gli utenti concessi in base a questo ruolo nel database. Definiamo un ruolo con un problema di scrittura che impone le scritture maggioritarie:

    
    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 }
    
    })