sql >> Databáze >  >> RDS >> Access

Vytvoření řízení přístupu založeného na rolích v MongoDB

Vytvoření řízení přístupu na základě rolí v MongoDB

MongoDB poskytuje uživatelům přístup prostřednictvím ovládacích prvků založených na rolích, včetně mnoha vestavěných rolí, které lze uživatelům přiřadit. Dva nejznámější ovládací prvky jsou role pro čtení a čtení/zápis, někdy však nejsou tak podrobné, jak bychom si přáli.

Nedávno jsem měl možnost prozkoumat uživatelsky definované role v představené v MongoDB verze 2.6. V tomto článku si projdeme uživatelsky definované role MongoDB a definujeme některé vlastní role, které by se vám mohly hodit.

  1. Vytváření rolí v MongoDB

    Vytvoření uživatelem definované role v MongoDB je poměrně jednoduché. K vytvoření nové role můžete použít příkaz createRole a generická syntaxe role create je následující:

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

    Před spuštěním příkazu createRole se ujistěte, že jste přepnuli do databáze, ve které chcete vytvořit roli, protože budou definovány pouze v databázi v které byly vytvořeny. Pokud chcete vytvořit roli, která uděluje přístup k více než jedné databázi, bude nutné ji vytvořit v databázi správce.

    Pojďme se podívat na hlavní součásti syntaxe role vytvoření.

  2. Oprávnění role

    Vytvořte oprávnění pro uživatelem definovanou roli přidáním oprávnění a definováním svých akcí a zdrojů:

    Akce oprávnění

    Akce jsou sada operací, které jsou seskupeny, jako je akce vložení, která může provádět vkládání i vytváření. Akce jsou tak podrobné jako řízení přístupu založené na rolích MongoDB. Parametr privilegia lze použít k přidání rolí k akcím mongo a oprávnění tvoří akce spolu se zdrojem, na který se vztahuje. Pomocí následujícího můžete přidat akce najít, vložit a aktualizovat databázi „mydb“.

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

    Zdroje oprávnění

    Zdrojový dokument určuje rozsah, na který se budou vztahovat vaše akce oprávnění, a lze jej nastavit na různé podrobnosti takto:

    a. Kolekce

    Zdroj lze nastavit na zdroj:{db: "<db-name>", collection: "<collection name>" } udělit zadané akce pouze této konkrétní kolekci.

    b. Databáze

    Prostředek lze nastavit na konkrétní databázi, když ponecháte parametr kolekce prázdný. Zdroj řetězce zdroje:{db: "<db-name>", collection: "<collection name>" } nastaví rozsah na celou databázi.

    c. Jedna kolekce napříč databázemi

    Zdroj lze nastavit na konkrétní kolekci pomocí zdroje:{db: ", collection: "<collection name>" } udělit oprávnění ke kolekci ve všech databázích. Toto oprávnění lze přidat pouze do role vytvořené v databázi správce.

    d. Více kolekcí napříč databázemi

    Prostředek lze nastavit na všechny kolekce (kromě systémových kolekcí) ve všech databázích ponecháním parametrů db i kolekce prázdný. zdroj:{db: "", collection: "" } . Tento zdroj, stejně jako ten výše, lze udělit pouze roli vytvořené v databázi správce.

    e. Cluster-Wide Resource

    Zdroj pro celý cluster lze určit pomocí zdroje:{ cluster : true } . Tento prostředek pro celý klastr se používá ke specifikaci stavu systému, jako je vypnutí replSetReconfig, spíše než k udělení oprávnění k nějakému konkrétnímu dokumentu.

    f. Všechny zdroje

    Nedoporučujeme používat tento rozsah pro nic jiného než za mimořádných okolností. {anyResource: true } lze použít k nastavení rozsahu pro všechny zdroje.

  3. Role

    Do vlastní role lze také přidat vestavěné role. Když je pomocí parametru role:[] přidána vestavěná role, přidá se k vlastní roli oprávnění vestavěné role.

    Zde je příklad parametru role:

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

    V tomto příkladu by vlastní role zdědila všechna oprávnění role „čtení“ nad definovanou databází. Pokud je role zděděna do databáze db1, lze vlastní roli vytvořit buď v databázi db1, nebo v databázi správce.

    Napište obavu

    Zájem o zápis definuje úroveň potvrzení požadovaného z MongoDB a lze jej použít ke kontrole potvrzení zápisu z databáze. Všimněte si, že při vytváření role není vyžadována starost o zápis. Zájem o zápis může zahrnovat pole w, ja wtimeout:

    W  -  Write Concern

    Pole W lze použít k určení počtu instancí, do kterých byl zápis rozšířen.

    J  -  Write Concern

    Pole J lze nastavit tak, aby určilo, zda je zápis zapsán do deníku.

    Wtimeout  -  Write Concern

    Toto se používá k nastavení času, do kterého musí zápis dosáhnout zájmu o zápis. Problém zápisu může být dosažen i po vyvolání chyby. Pokud nebyl nastaven Wtimeout a nelze dosáhnout obav o zápis, zápis bude na dobu neurčitou zablokován.

  4. Přidělování rolí

    Vlastní role jsou specifické pro db a lze je přiřadit pouze uživateli ve stejné databázi.

    Řekněme, že jsme vytvořili roli „myrole“ v databázi „db1“. Uživatele v databázi můžeme vytvořit pomocí následujících příkazů:

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

    Další informace o správě uživatelů naleznete v tomto příspěvku od Dharshana o správě uživatelů v MongoDB.

  5. Vlastní uživatelské role

    Pojďme se podívat na některé vlastní role, které by mohly být užitečné.

    Jedna databáze – oprávnění ke čtení, vkládání a aktualizaci

    Vestavěné role čtení a čtení zápisu se někdy mohou zdát jako příliš mnoho nebo příliš málo oprávnění. Podívejme se, jak můžeme vytvořit vlastní roli, která uděluje oprávnění pouze ke čtení, vkládání a zápisu.

    Už víme, že potřebujeme všechna oprávnění ke čtení, abychom do naší vlastní role mohli přidat vestavěnou roli „čtení“. Potřebujeme také oprávnění k vytváření a aktualizaci dokumentů, která lze zahrnout přidáním akcí oprávnění vložit a aktualizovat. Pokud bychom chtěli dát uživateli možnost vytvořit index a vytvořit kolekci, můžeme přidat akci oprávnění createIndex a createCollection.

    Pokud jde o rozsah, předpokládejme, že mám databázi s názvem „db1“, pro kterou jsem nastavil výše uvedená oprávnění. Příkaz create by vypadal asi takto:

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

    Výše uvedený příkaz vytvoří roli s <role-name> v databázi db1. Uživatel, kterému výše uvedená role udělila oprávnění, nebude mít akci oprávnění „odstranit“. Pamatujte také, že metody db.collection.findAndModify(),  db.collection.mapReduce() a  db.collection.aggregate() nelze spustit v plném rozsahu, protože vyžadují oprávnění odebrat.

    Všechny DB – oprávnění ke čtení, vkládání a aktualizaci

    Můžeme vytvořit roli v databázi správce, která je podobná té výše, abychom udělili oprávnění ke čtení, vytváření a aktualizaci všem DB. Tato role by měla být vytvořena v databázi správce a následný uživatel by měl být také vytvořen v databázi správce.

    U této role můžeme namísto použití standardní role pro čtení dědit oprávnění z role readAnyDatabase. Vytvoření role by vypadalo asi takto:

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

    Role spisovatele se zájmem o zápis

    Pokud máte scénář, kdy je potřeba vynutit obavy ohledně zápisu, zde je návod, jak je přidat do role. Přidání obavy o zápis do role by ji vynutilo u všech uživatelů přidělených v rámci této role v DB. Pojďme definovat roli se zájmem o zápis, která prosazuje většinové zápisy:

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

  1. Aktualizujte pomocí Join dotazu v Oracle

  2. Jak funguje LOAD_FILE() v MariaDB

  3. Vložení obrázku do BLOB Oracle 10g

  4. Co je nového v MariaDB MaxScale 2.4