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.
-
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í.
-
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. -
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;lt;db name&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.
-
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;lt;user&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;",pwd: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;password&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.
-
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;lt;role-name&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;lt;role-name&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;lt;role-name&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 } })