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

Oprettelse af rollebaseret adgangskontrol i MongoDB

Oprettelse af rollebaseret adgangskontrol i MongoDB

MongoDB giver brugeradgang gennem rollebaserede kontroller, herunder mange indbyggede roller, der kan tildeles til brugere. De to mest kendte kontroller er læse- og læse/skrive-rollerne, men nogle gange er de ikke så detaljerede, som vi gerne vil have dem til at være.

Jeg havde for nylig en chance for at udforske de brugerdefinerede roller, som blev introduceret i MongoDB version 2.6. I denne artikel gennemgår vi MongoDB brugerdefinerede roller og definerer nogle tilpassede roller, som du måske kan finde nyttige.

  1. Opret roller i MongoDB

    Oprettelse af en brugerdefineret rolle i MongoDB er ret simpelt. Du kan bruge createRole-kommandoen til at oprette en ny rolle, og den generiske oprettelsesrollesyntaks er som følger:

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

    Før du kører kommandoen createRole, skal du sørge for at skifte til den database, du vil oprette rollen i, da de kun vil blive defineret i databasen i som de blev skabt. Hvis du vil oprette en rolle, der giver adgang til mere end én database, skal den oprettes i administratordatabasen.

    Lad os gennemgå hovedkomponenterne i syntaksen for oprettelse af rolle.

  2. Rolleprivilegier

    Opret tilladelser til en brugerdefineret rolle ved at tilføje et privilegium og definere dine handlinger og ressourcer:

    Privilegehandlinger

    Handlinger er et sæt operationer, der er grupperet sammen, såsom indsættelseshandlingen, der kan udføre både indsættelse og oprettelse. Handlinger er så detaljerede, som MongoDBs rollebaserede adgangskontrol bliver. Parameteren privilegier kan bruges til at tilføje roller til mongo-handlinger, og et privilegium udgør handlingerne sammen med den ressource, det gælder for. Brug følgende til at tilføje handlingerne find, indsæt og opdatere på databasen "mydb".

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

    Privilegeressourcer

    Ressourcedokumentet specificerer omfanget af dine privilegiehandlinger, og kan indstilles med forskellige detaljer som følger:

    a. Samling

    Ressourcen kan indstilles til ressource:{db:"", samling:" " } for kun at give de angivne handlinger til den bestemte samling.

    b. Database

    Ressourcen kan indstilles til en bestemt database ved at lade samlingsparameteren være tom. Ressourcestreng ressource:{db:"", samling:"" } indstiller omfanget til hele databasen.

    c. Enkel indsamling på tværs af databaser

    Ressourcen kan indstilles til en bestemt samling ved hjælp af ressource:{db:", samling:"" } at give tilladelser til samlingen på alle databaser. Denne tilladelse kan kun tilføjes til en rolle, der er oprettet i administratordatabasen.

    d. Flere samlinger på tværs af databaser

    Ressourcen kan indstilles til alle samlinger (undtagen systemsamlinger) på tværs af alle databaser ved at forlade både db- og samlingsparametrene tom. ressource:{db:"", samling:"" } . Denne ressource, som den ovenfor, kan kun tildeles på en rolle, der er oprettet i administratordatabasen.

    e. Klyngedækkende ressource

    En ressource for hele klyngen kan specificeres ved at bruge ressource:{ cluster :true } . Denne klyngeomfattende ressource bruges til at specificere systemets tilstand, såsom shutdown replSetReconfig i stedet for at give tilladelser til et bestemt dokument.

    f. Alle ressourcer

    Det anbefales ikke at bruge dette omfang til andet end ekstraordinære omstændigheder. {anyResource:true } kan bruges til at indstille omfanget til alle ressourcer.

  3. Roller

    Indbyggede roller kan også føjes til en tilpasset rolle. Når en indbygget rolle tilføjes ved at bruge parameteren roles:[], tilføjer den tilladelserne for den indbyggede rolle til den tilpassede rolle.

    Her er et eksempel på rolleparameteren:

    
    roles: [{ role: "read", db: "<db name>"}]
    
    

    I dette eksempel vil den tilpassede rolle arve alle tilladelserne for rollen "læse" over den definerede database. Hvis en rolle er nedarvet til en database db1, kan den tilpassede rolle enten oprettes på databasen db1 eller på admin databasen.

    Skriv bekymring

    Skrivebekymring definerer niveauet for bekræftelse, der anmodes om fra MongoDB, og kan bruges til at styre skrivebekræftelser fra databasen. Bemærk, at en skrivebekymring ikke er påkrævet, når du opretter en rolle. Skriveproblemer kan omfatte felterne w, j og wtimeout:

    W  -  Skriv bekymring

    Felt W kan bruges til at angive antallet af forekomster, skrivningen er blevet spredt til.

    J  -  Skriv bekymring

    Felt J kan indstilles til at bestemme, om skrivningen skrives til journalen.

    Wtimeout  -  Skriv bekymring

    Dette bruges til at indstille det tidspunkt, hvor skrivningen skal opnå skriveproblemer. Skriveproblemet kan stadig opnås, efter at fejlen er smidt. Hvis en Wtimeout ikke er blevet indstillet, og skriveproblemet ikke kan opnås, vil skrivningen blive blokeret på ubestemt tid.

  4. Tildeling af roller

    Tilpassede roller er db-specifikke og kan kun tildeles en bruger i den samme database.

    Lad os sige, at vi oprettede en rolle "myrole" på databasen "db1". Vi kan oprette en bruger på databasen ved hjælp af følgende kommandoer:

    
    Use db1
    
    db.createUser({"user" : "<user>",pwd: "<password>","roles" : [{"role" : "myrole", "db" : "db1"}]})
    
    

    For yderligere oplysninger om brugeradministration henvises til dette indlæg af Dharshan om brugeradministration i MongoDB.

  5. Tilpassede brugerroller

    Lad os gennemgå nogle tilpassede roller, der kan være nyttige.

    Enkelt DB – læse-, indsæt- og opdateringstilladelser

    De indbyggede roller læse og læseskriv kan nogle gange føles som for mange tilladelser eller for få. Lad os se, hvordan vi kan oprette en tilpasset rolle, der kun giver læse-, indsæt- og skrivetilladelser.

    Vi ved allerede, at vi har brug for alle læsetilladelser, så vi kan tilføje den indbyggede rolle "læs" til vores tilpassede rolle. Vi har også brug for tilladelser til at oprette og opdatere dokumenter, og disse kan inkluderes ved at tilføje rettighedshandlinger, indsætte og opdatere. Hvis vi ønskede at give brugeren mulighed for at oprette indeks og oprette samling, kan vi tilføje privilegiehandlingen createIndex og createCollection.

    Med hensyn til omfanget, lad os antage, at jeg har en db ved navn "db1", som jeg angiver ovenstående tilladelser på. Create-kommandoen ville se nogenlunde sådan ud:

    
    Use db1.
    
    db.createRole(
    
    {
    
    createRole: "<role-name>",
    
    privileges: [
    
    { resource: { db: "db1", collection: "" },
    
    actions: [ "insert","update","createIndex", "createCollection" ] }
    
    ],
    
    roles: [{ role: "read", db: "db1"}]
    
    })
    
    

    Ovenstående kommando ville oprette en rolle med i databasen db1. En bruger, der har fået tilladelse af ovenstående rolle, vil ikke have privilegiehandlingen "fjern". Bemærk også, at metoderne db.collection.findAndModify(),  db.collection.mapReduce() og  db.collection.aggregate() ikke kan køres fuldt ud, da de kræver privilegiet Fjern.

    Alle DB'er – læse-, indsæt- og opdateringstilladelser

    Vi kan oprette en rolle på admindatabasen, der ligner den ovenfor, for at give læse-, oprette- og opdateringsrettigheder på alle DB'er. Denne rolle skal oprettes på admin-databasen, og den efterfølgende bruger skal også oprettes på admin-databasen.

    For denne rolle kan vi i stedet for at bruge standard læserollen arve tilladelser fra readAnyDatabase-rollen. Rolleoprettelsen ville se nogenlunde sådan ud:

    
    Use admin.
    
    db.createRole(
    
    {
    
    createRole: "<role-name>",
    
    privileges: [
    
    { resource: { db: "", collection: "" },
    
    actions: [ "insert","update","createIndex", "createCollection" ] }
    
    ],
    
    roles: [{ role: "readAnyDatabase", db: "admin"}]
    
    })
    
    

    Forfatterroller med skrivebekymring

    Hvis du har et scenarie, hvor skriveproblemer skal håndhæves, kan du se her, hvordan det kan føjes til en rolle. Tilføjelse af skrivebekymringer til en rolle ville håndhæve den på alle de brugere, der er tildelt under denne rolle på DB. Lad os definere en rolle med en skrivebekymring, der håndhæver flertallets skriver:

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

  1. Mangler ved mysql_real_escape_string?

  2. Avanceret failover ved brug af Post/pre Script Hooks

  3. Skal skalarvariabel @Id erklæres?

  4. Sådan finder du navnet på en begrænsning i Oracle