Skapa rollbaserad åtkomstkontroll i MongoDB
MongoDB ger användaråtkomst genom rollbaserade kontroller, inklusive många inbyggda roller som kan tilldelas användare. De två mest kända kontrollerna är läs- och läs-/skrivrollerna, men ibland är de inte så detaljerade som vi skulle vilja att de ska vara.
Jag hade nyligen en chans att utforska de användardefinierade rollerna som introducerades i MongoDB version 2.6. I den här artikeln går vi igenom MongoDB användardefinierade roller och definierar några anpassade roller som du kan ha nytta av.
-
Skapa roller i MongoDB
Att skapa en användardefinierad roll i MongoDB är ganska enkelt. Du kan använda kommandot createRole för att skapa en ny roll, och den allmänna syntaxen för skapa roll är som följer:
{ createRole: "<role name>", privileges: [{ resource: { <resource> }, actions: [ "<action>",] }, ], roles: [ { role: "<role>", db: "<database>" } | "<role>",], writeConcern: <write concern document> }
Innan du kör kommandot createRole, se till att du byter till databasen du vill skapa rollen i eftersom de bara kommer att definieras i databasen i som de skapades. Om du vill skapa en roll som ger åtkomst till mer än en databas måste den skapas i administratörsdatabasen.
Låt oss gå igenom huvudkomponenterna i syntaxen för skapa roller.
-
Rollrättigheter
Skapa behörigheter för en användardefinierad roll genom att lägga till en behörighet och definiera dina åtgärder och resurser:
Privilegeåtgärder
Åtgärder är en uppsättning operationer som är grupperade, till exempel infogningsåtgärden som kan utföra både infoga och skapa. Åtgärderna är så detaljerade som MongoDB:s rollbaserade åtkomstkontroll blir. Parametern privilegier kan användas för att lägga till roller till mongo-åtgärder, och ett privilegium utgör åtgärderna tillsammans med resursen den gäller. Använd följande för att lägga till åtgärderna hitta, infoga och uppdatera i databasen "mydb".
privileges: [ {resource: {db: "mydb", collection: "" }, actions: [ “find”,”insert”,”update” ] } ]
Privilegeresurser
Resursdokumentet anger omfattningen av vilken dina behörighetsåtgärder kommer att gälla och kan ställas in med olika detaljer enligt följande:
a. Samling
Resursen kan ställas in på resurs:
{db: "<db-name>", collection: "<collection name>" }
för att bevilja de angivna åtgärderna till endast den specifika samlingen.b. Databas
Resursen kan ställas in på en viss databas genom att lämna samlingsparametern tom. Resurssträngresurs:
{db: "<db-name>", collection: "<collection name>" }
ställer in omfattningen till hela databasen.c. Enskild samling över databaser
Resursen kan ställas in på en viss samling med hjälp av resurs:
{db: ", collection: "<collection name>" }
att ge tillstånd till samlingen på alla databaser. Denna behörighet kan endast läggas till på en roll som skapats i administratörsdatabasen.d. Flera samlingar över databaser
Resursen kan ställas in på alla samlingar (förutom systemsamlingarna) över alla databaser genom att lämna både db- och samlingsparametrarna tömma. resurs:
{db: "", collection: "" }
. Denna resurs, som den ovan, kan endast beviljas för en roll som skapats i administratörsdatabasen.e. Klusteromfattande resurs
En klusteromfattande resurs kan specificeras genom att använda resursen:
{ cluster : true }
. Denna klusteromfattande resurs används för att specificera systemets tillstånd, såsom avstängning replSetReconfig snarare än att bevilja behörigheter för något särskilt dokument.f. Alla resurser
Det rekommenderas inte att använda detta omfång för något annat än extraordinära omständigheter.
{anyResource: true }
kan användas för att ställa in scope set till alla resurser. -
Roller
Inbyggda roller kan också läggas till i en anpassad roll. När en inbyggd roll läggs till med hjälp av parametern roles:[] lägger den till behörigheterna för den inbyggda rollen till den anpassade rollen.
Här är ett exempel på parametern roles:
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;"}]
I det här exemplet skulle den anpassade rollen ärva alla behörigheter för rollen "läs" över den definierade databasen. Om en roll ärvs till en databas db1 kan den anpassade rollen antingen skapas på databasen db1 eller på admindatabasen.
Skriv oro
Skrivproblem definierar nivån på bekräftelse som begärs från MongoDB och kan användas för att styra skrivbekräftelser från databasen. Observera att skrivproblem inte krävs när du skapar en roll. Skrivproblem kan inkludera fälten w, j och wtimeout:
W - Skriv oro
Fält W kan användas för att ange antalet instanser som skrivningen har spridits till.
J - Skriv oro
Fält J kan ställas in för att avgöra om skrivningen skrivs till journalen.
Wtimeout - Skriv oro
Detta används för att ställa in den tid då skrivningen måste uppnå skrivproblem. Skrivproblemet kan fortfarande uppstå efter att felet har skapats. Om en Wtimeout inte har ställts in och skrivproblemet inte kan uppnås, kommer skrivningen att blockeras på obestämd tid.
-
Tilldela roller
Anpassade roller är db-specifika och kan endast tilldelas en användare i samma databas.
Låt oss säga att vi skapade en roll "myrole" i databasen "db1". Vi kan skapa en användare i databasen med följande kommandon:
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"}]})
För ytterligare information om användarhantering, se detta inlägg av Dharshan om användarhantering i MongoDB.
-
Anpassade användarroller
Låt oss gå igenom några anpassade roller som kan vara användbara.
Single DB – Läs, infoga och uppdatera behörigheter
De inbyggda rollerna läs och lässkriv kan ibland kännas som för många behörigheter eller för få. Låt oss se hur vi kan skapa en anpassad roll som ger bara läs-, infognings- och skrivbehörigheter.
Vi vet redan att vi behöver alla läsbehörigheter så att vi kan lägga till den inbyggda rollen "läs" till vår anpassade roll. Vi behöver också behörigheter för att skapa och uppdatera dokument, och dessa kan inkluderas genom att lägga till behörighetsåtgärder, infoga och uppdatera. Om vi ville ge användaren möjligheten att skapa index och skapa samling, kan vi lägga till privilegieåtgärden createIndex och createCollection.
För omfattningen, låt oss anta att jag har en db som heter "db1" som jag ställer in ovanstående behörigheter på. Skapa kommandot skulle se ut ungefär så här:
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"}] })
Kommandot ovan skulle skapa en roll med
<role-name>
i databasen db1. En användare som har beviljats behörighet av rollen ovan kommer inte att ha behörighetsåtgärden "ta bort". Observera också att metoderna db.collection.findAndModify(), db.collection.mapReduce() och db.collection.aggregate() inte kan köras i sin helhet eftersom de kräver borttagningsbehörighet.Alla databaser – läs, infoga och uppdatera behörigheter
Vi kan skapa en roll i administratörsdatabasen som liknar den ovan, för att ge läs-, skapa- och uppdateringsprivilegier på alla DB:er. Den här rollen ska skapas på admin-databasen och den efterföljande användaren ska också skapas på admin-databasen.
För den här rollen, istället för att använda standardläsrollen, kan vi ärva behörigheter från readAnyDatabase-rollen. Rollskapandet skulle se ut ungefär så här:
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"}] })
Författarroller med skrivproblem
Om du har ett scenario där skrivproblem måste upprätthållas, så här kan det läggas till en roll. Om du lägger till skrivproblem till en roll skulle det tillämpas på alla användare som beviljats under denna roll i databasen. Låt oss definiera en roll med ett skrivproblem som upprätthåller majoriteten skriver:
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 } })