sql >> Base de Datos >  >> RDS >> Access

Creación de control de acceso basado en roles en MongoDB

Creación de control de acceso basado en roles en MongoDB

MongoDB brinda acceso a los usuarios a través de controles basados ​​en funciones, incluidas muchas funciones integradas que se pueden asignar a los usuarios. Los dos controles más conocidos son los roles de lectura y lectura/escritura; sin embargo, a veces, no son tan granulares como nos gustaría que fueran.

Recientemente tuve la oportunidad de explorar los roles definidos por el usuario que se introdujeron en la versión 2.6 de MongoDB. En este artículo, repasaremos los roles definidos por el usuario de MongoDB y definiremos algunos roles personalizados que pueden resultarle útiles.

  1. Crear roles en MongoDB

    Crear un rol definido por el usuario en MongoDB es bastante simple. Puede usar el comando createRole para crear un nuevo rol, y la sintaxis genérica de creación de roles es la siguiente:

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

    Antes de ejecutar el comando createRole, asegúrese de cambiar a la base de datos en la que desea crear el rol, ya que solo se definirán en la base de datos en que fueron creados. Si desea crear una función que otorgue acceso a más de una base de datos, deberá crearla en la base de datos de administración.

    Repasemos los componentes principales de la sintaxis de creación de funciones.

  2. Privilegios de funciones

    Cree permisos para un rol definido por el usuario agregando un privilegio y definiendo sus acciones y recursos:

    Acciones de privilegio

    Las acciones son un conjunto de operaciones que se agrupan, como la acción de inserción que puede realizar tanto insertar como crear. Las acciones son tan granulares como el control de acceso basado en roles de MongoDB. El parámetro de privilegios se puede usar para agregar roles a las acciones de mongo, y un privilegio constituye las acciones junto con el recurso al que se aplica. Use lo siguiente para agregar las acciones buscar, insertar y actualizar en la base de datos "mydb".

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

    Recursos privilegiados

    El documento de recursos especifica el ámbito en el que se aplicarán sus acciones de privilegio y se puede establecer en varias granularidades de la siguiente manera:

    a. Colección

    El recurso se puede configurar como resource:{db: "<db-name>", collection: "<collection name>" } para otorgar las acciones especificadas solo a esa colección en particular.

    b. Base de datos

    El recurso se puede establecer en una base de datos en particular dejando el parámetro de colección vacío. Recurso de cadena de recurso:{db: "<db-name>", collection: "<collection name>" } establece el alcance de toda la base de datos.

    c. Colección única en todas las bases de datos

    El recurso se puede establecer en una colección en particular usando resource:{db: ", collection: "<collection name>" } para otorgar permisos a la colección en todas las bases de datos. Este permiso solo se puede agregar a un rol creado en la base de datos de administración.

    d. Colecciones múltiples en bases de datos

    El recurso se puede configurar para todas las colecciones (excepto las colecciones del sistema) en todas las bases de datos dejando los parámetros db y colección vacío. recurso:{db: "", collection: "" } . Este recurso, como el anterior, solo se puede otorgar en un rol creado en la base de datos de administración.

    e. Recurso de todo el clúster

    Se puede especificar un recurso de todo el clúster mediante resource:{ cluster : true } . Este recurso de todo el clúster se usa para especificar el estado del sistema, como apagar replSetReconfig en lugar de otorgar permisos en cualquier documento en particular.

    f. Todos los recursos

    No se recomienda usar este alcance para otra cosa que no sean circunstancias extraordinarias. {anyResource: true } se puede usar para establecer el conjunto de alcances para todos los recursos.

  3. Funciones

    Los roles integrados también se pueden agregar a un rol personalizado. Cuando se agrega una función incorporada mediante el uso del parámetro roles:[], se agregan los permisos de la función incorporada a la función personalizada.

    Este es un ejemplo del parámetro roles:

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

    En este ejemplo, el rol personalizado heredaría todos los permisos del rol "leer" sobre la base de datos definida. Si un rol se hereda en una base de datos db1, el rol personalizado puede crearse en la base de datos db1 o en la base de datos de administración.

    Escribir Preocupación

    Preocupación de escritura define el nivel de reconocimiento solicitado de MongoDB y se puede usar para controlar los reconocimientos de escritura de la base de datos. Tenga en cuenta que no se requiere una preocupación de escritura al crear un rol. La preocupación de escritura puede incluir los campos w, j y wtimeout:

    W  -  Preocupación por escrito

    El campo W se puede usar para indicar el número de instancias a las que se ha propagado la escritura.

    J  -  Escribir preocupación

    El campo J se puede configurar para determinar si la escritura se escribe en el diario.

    Wtimeout  -  Preocupación por escrito

    Esto se usa para establecer el tiempo en el que la escritura debe alcanzar la preocupación de escritura. La preocupación de escritura aún podría lograrse después de que se produzca el error. Si no se ha establecido un Wtimeout y no se puede lograr el problema de escritura, la escritura se bloqueará indefinidamente.

  4. Asignación de roles

    Los roles personalizados son específicos de la base de datos y solo se pueden asignar a un usuario en la misma base de datos.

    Digamos que creamos un rol "myrole" en la base de datos "db1". Podemos crear un usuario en la base de datos usando los siguientes comandos:

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

    Para obtener más información sobre la administración de usuarios, consulte esta publicación de Dharshan sobre administración de usuarios en MongoDB.

  5. Roles de usuario personalizados

    Repasemos algunos roles personalizados que pueden ser útiles.

    Base de datos única:permisos de lectura, inserción y actualización

    Las funciones integradas de lectura y lectura y escritura a veces pueden parecer demasiados permisos o muy pocos. Veamos cómo podemos crear un rol personalizado que otorgue solo permisos de lectura, inserción y escritura.

    Ya sabemos que necesitamos todos los permisos de lectura para poder agregar el rol incorporado "leer" a nuestro rol personalizado. También necesitamos permisos para crear y actualizar documentos, y estos se pueden incluir agregando acciones de privilegio para insertar y actualizar. Si quisiéramos darle al usuario la capacidad de crear un índice y crear una colección, podemos agregar la acción de privilegio createIndex y createCollection.

    Para el alcance, supongamos que tengo una base de datos llamada "db1" en la que configuro los permisos anteriores. El comando de creación se vería así:

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

    El comando anterior crearía un rol con <role-name> en la base de datos db1. Un usuario al que el rol anterior le haya otorgado permiso no tendrá la acción de privilegio "eliminar". Además, tenga en cuenta que los métodos db.collection.findAndModify(),  db.collection.mapReduce() y  db.collection.aggregate() no se pueden ejecutar en su totalidad ya que requieren el privilegio de eliminación.

    Todas las bases de datos:permisos de lectura, inserción y actualización

    Podemos crear una función en la base de datos de administración que sea similar a la anterior, para otorgar privilegios de lectura, creación y actualización en todas las bases de datos. Este rol debe crearse en la base de datos de administración y el usuario posterior también debe crearse en la base de datos de administración.

    Para esta función, en lugar de usar la función de lectura estándar, podemos heredar los permisos de la función readAnyDatabase. La función de creación se vería así:

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

    Roles de escritor con preocupación de escritura

    Si tiene un escenario en el que se debe aplicar la preocupación de escritura, así es como se puede agregar a un rol. Agregar preocupación de escritura a un rol lo aplicaría a todos los usuarios otorgados bajo este rol en la base de datos. Definamos un rol con una preocupación de escritura que impone escrituras mayoritarias:

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