sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo administrar usuarios y autenticación en MongoDB


Introducción

La gestión de usuarios y la autenticación son algunas de las tareas de administración más importantes de la gestión de servidores MongoDB. Debe asegurarse de que el servidor esté configurado para poder identificar correctamente a sus usuarios y aplicaciones y denegar conexiones u operaciones que no puedan autenticarse correctamente.

Para administrar estos requisitos, debe poder decidir qué usuarios requiere su servidor y crear esas cuentas. Como parte de este proceso, puede configurar los detalles de autenticación para permitir el acceso externo utilizando la nueva identidad.

En esta guía, veremos cómo crear, ver y eliminar cuentas de usuario. Repasaremos cómo configurar la autenticación para sus cuentas y cómo actualizar las credenciales cuando necesite cambiar sus contraseñas de usuario.



Requisitos previos

Para seguir esta guía, necesitará una cuenta en un servidor MongoDB con los privilegios apropiados.


Comandos y métodos que usaremos

Para crear, modificar y eliminar usuarios dentro de MongoDB y configurar la autenticación, los métodos principales que necesita son:

  • db.createUser :cree una nueva cuenta de usuario de MongoDB
  • db.updateUser :actualizar los detalles de una cuenta de usuario
  • db.changeUserPassword :cambiar la contraseña utilizada por una cuenta de usuario
  • db.dropUser :eliminar una cuenta de usuario de MongoDB

Además, el siguiente comando de la base de datos es útil para encontrar información sobre los usuarios en el sistema:

  • db.runCommand('usersInfo') :muestra información sobre una o más cuentas de usuario de MongoDB


Privilegios requeridos

Para ejecutar los comandos anteriores, debe iniciar sesión en MongoDB con una cuenta con varias acciones de privilegio diferentes. Los privilegios específicos que necesita dependen de los comandos que necesita usar.

Para obtener información sobre otros usuarios, su usuario actual debe tener habilitada la siguiente acción de privilegio:

  • viewUser acción de privilegio

Para crear nuevos usuarios, su usuario actual debe tener habilitadas las siguientes acciones de privilegio:

  • createUser acción de privilegio
  • grantRole acción de privilegio

Para cambiar la contraseña de un usuario o los detalles de la cuenta, es posible que necesite los siguientes privilegios:

  • changeOwnPassword acción de privilegio para cambiar la contraseña de su propia cuenta
  • changeOwnCustomData acción de privilegio para cambiar los datos personalizados de su propia cuenta
  • changePassword acción de privilegio para cambiar las contraseñas de otros usuarios
  • changeCustomData acción de privilegio para cambiar los datos personalizados de otros usuarios

No cubriremos la administración de roles en esta guía, por lo que el grantRole y revokeRole no se requieren acciones de privilegio.

Para eliminar una cuenta de usuario, su usuario actual debe tener habilitada la siguiente acción de privilegio:

  • dropUser acción de privilegio



Comprender cómo MongoDB implementa los usuarios y la autenticación

Antes de comenzar a crear y administrar cuentas, es útil tomarse un tiempo para familiarizarse con la forma en que MongoDB define y almacena esta información.

En MongoDB, las cuentas de usuario son una combinación del nombre de usuario de la cuenta junto con una base de datos de autenticación específica. La base de datos de autenticación es simplemente la base de datos donde se define el usuario y no implica una limitación de alcance o derechos. Las bases de datos de autenticación son bases de datos regulares que se utilizan para administrar otros datos y no son bases de datos dedicadas especiales.

Un nombre de cuenta de usuario debe ser único en su base de datos de autenticación. Sin embargo, el mismo nombre de usuario se puede reutilizar con una base de datos de autenticación diferente para crear una nueva cuenta de usuario distinta.

Como resultado de este diseño, una cuenta solo puede identificarse con precisión al incluir el nombre de usuario y la base de datos de autenticación. Para autenticarse en una cuenta, también es necesario poder proporcionar las credenciales asociadas con una cuenta. Suele ser una contraseña, pero también puede ser un certificado.



¿Cómo se crean usuarios?

Ahora que hemos visto cómo MongoDB conceptualiza las cuentas de usuario, podemos discutir cómo crear nuevos usuarios. Recuerde iniciar sesión en su servidor MongoDB con un usuario que tenga los privilegios apropiados para seguir.

Para crear un nuevo usuario, primero debe cambiar a la base de datos que desea usar como base de datos de autenticación del nuevo usuario.

Primero, puede obtener una lista de las bases de datos que ya están configuradas en su sistema escribiendo:

show dbs
admin   0.000GBconfig  0.000GBlocal   0.000GB

Cambie a la base de datos con la que se asociará el usuario utilizando use comando:

use admin
switched to db admin

Para crear un nuevo usuario, puede utilizar db.createUser() método o puede usar el método createUser comando de base de datos. De cualquier manera, deberá pasar el nombre de usuario (el user campo), contraseña (la pwd campo), y una serie de roles a los que se debe agregar el usuario (los roles clave) dentro de un user objeto.

Para crear un nuevo usuario llamado tom con una contraseña establecida en hellothere con una matriz de roles vacía utilizando db.createUser() método, puede escribir:

db.createUser({    user: "tom",    pwd: "hellothere",    roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }

La misma operación usando createUser El comando de la base de datos se vería así:

db.runCommand({    createUser: "tom",    pwd: "hellothere",    roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }

Las dos opciones diferentes son muy similares, por lo que solo mostraremos los métodos de la base de datos donde corresponda en el futuro. Sin embargo, si prefiere la sintaxis de comandos de la base de datos, puede encontrar cada uno de los comandos asociados en la documentación de referencia de comandos de MongoDB.

En los comandos anteriores, definimos explícitamente la contraseña en línea dentro del user objeto. Para evitar que la contraseña se registre y se pueda recuperar, también puede utilizar passwordPrompt() método dentro del user document para que MongoDB le solicite una contraseña de forma interactiva cuando se ejecute el comando. La contraseña no será visible, por lo que su historial de comandos estará limpio:

db.createUser({    user: "tom",    pwd: passwordPrompt(),    roles: []})
Enter password:Successfully added user: { "user" : "tom", "roles" : [ ] }

Tenga en cuenta que la contraseña aún se enviará al servidor en texto sin formato si no tiene habilitado TLS/SSL.



¿Cómo se muestran los usuarios existentes?

A continuación, echemos un vistazo a cómo encontrar información sobre los usuarios existentes.

Para devolver múltiples usuarios, puede usar db.getUsers() método para mostrar todos los usuarios dentro de la base de datos actual. Primero, cambia a la base de datos que te interesa consultar:

use admin

A continuación, utilice db.getUsers() método para devolver todos los usuarios asociados con la base de datos actual:

db.getUsers()
[    {            "_id" : "admin.root",            "userId" : UUID("f5ded238-19c9-4886-b649-711ec36993cb"),            "user" : "root",            "db" : "admin",            "roles" : [                    {                            "role" : "root",                            "db" : "admin"                    }            ],            "mechanisms" : [                    "SCRAM-SHA-1",                    "SCRAM-SHA-256"            ]    },    {            "_id" : "admin.tom",            "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),            "user" : "tom",            "db" : "admin",            "roles" : [ ],            "mechanisms" : [                    "SCRAM-SHA-1",                    "SCRAM-SHA-256"            ]    }]

Para mostrar adicionalmente la información de credenciales de cada usuario, pase un objeto al método con showCredentials clave para true :

use admindb.getUsers({    showCredentials: true})
[        {                "_id" : "admin.root",                . . .                "credentials" : {                        "SCRAM-SHA-1" : {                                "iterationCount" : 10000,                                "salt" : "WpB0H4f7dG8XlCDyaVzarA==",                                "storedKey" : "b11nA1+mGo3+Tr8P//u3NEdJLHk=",                                "serverKey" : "3xE8o663hjqySrMCQcXjSxmjmhk="                        },                        "SCRAM-SHA-256" : {                                "iterationCount" : 15000,                                "salt" : "UtsfNRedf2ek5tbWFoGs2g52U0H7Na44wV4rYA==",                                "storedKey" : "mz9/qHnI79pNAIQm0MZTKZ0U3qFk0xhUDd2grvKtMdI=",                                "serverKey" : "c/sA4j+I/29Ea1y07zxoMcBgHFoYTUAa6luX3Z9sToQ="                        }                },                . . .        },        {                "_id" : "admin.tom",                . . .                "credentials" : {                        "SCRAM-SHA-1" : {                                "iterationCount" : 10000,                                "salt" : "qCbxWQSGt3QoN3S1aM5AEg==",                                "storedKey" : "hypim5+m2wqbS1gc47o2itc7jew=",                                "serverKey" : "h9myNoSvY2015yqvw3UldmJzZCg="                        },                        "SCRAM-SHA-256" : {                                "iterationCount" : 15000,                                "salt" : "lNtIVL79J8FF+uPaFfRMwPK079gfLEUrsQe3Qg==",                                "storedKey" : "u8pgn3OJiZxIwEL7ryZkoAF5bnMefQEEsZDTXNDCTRY=",                                "serverKey" : "BmmfVeikSA0DN1aZmyZP9NXi5owxGr1ZRmVX2XH8qVg="                        }                },                . . .        }]

Para consultar usuarios que coincidan con ciertos criterios, puede pasar un objeto que defina un filter clave que define la condición coincidente.

Por ejemplo, para obtener información sobre todos los usuarios en la base de datos actual que tienen la root función, puede escribir:

use admindb.getUsers({    filter: {        "roles.role": "root"    }})
[        {                "_id" : "admin.root",                "userId" : UUID("f5ded238-19c9-4886-b649-711ec36993cb"),                "user" : "root",                "db" : "admin",                "roles" : [                        {                                "role" : "root",                                "db" : "admin"                        }                ],                "mechanisms" : [                        "SCRAM-SHA-1",                        "SCRAM-SHA-256"                ]        }]

Para obtener un usuario específico, puede usar db.getUser() método en su lugar. Esto funciona como db.getUsers() método, pero devuelve un solo usuario. En lugar de pasar un objeto al método, pasa una cadena que contiene el nombre de usuario que desea recuperar:

use admindb.getUser("tom")
{        "_id" : "admin.tom",        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),        "user" : "tom",        "db" : "admin",        "roles" : [ ],        "mechanisms" : [                "SCRAM-SHA-1",                "SCRAM-SHA-256"        ]}

Opcionalmente, puede incluir un args extra objeto que le permite especificar información adicional que le gustaría al establecer las siguientes claves en true :

  • showCredentials :muestra información de credenciales además de la salida normal
  • showPrivileges :muestra información de privilegios además de la salida normal
  • showAuthenticationRestrictions :muestra restricciones de autenticación en la cuenta además de la salida normal

Por ejemplo, puede decirle a MongoDB que le proporcione toda la información anterior escribiendo:

use admindb.getUser("tom",{    showCredentials: true,    showPrivileges: true,    showAuthenticationRestrictions: true})
{        "_id" : "admin.tom",        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),        "user" : "tom",        "db" : "admin",        "mechanisms" : [                "SCRAM-SHA-1",                "SCRAM-SHA-256"        ],        "credentials" : {                "SCRAM-SHA-1" : {                        "iterationCount" : 10000,                        "salt" : "qCbxWQSGt3QoN3S1aM5AEg==",                        "storedKey" : "hypim5+m2wqbS1gc47o2itc7jew=",                        "serverKey" : "h9myNoSvY2015yqvw3UldmJzZCg="                },                "SCRAM-SHA-256" : {                        "iterationCount" : 15000,                        "salt" : "lNtIVL79J8FF+uPaFfRMwPK079gfLEUrsQe3Qg==",                        "storedKey" : "u8pgn3OJiZxIwEL7ryZkoAF5bnMefQEEsZDTXNDCTRY=",                        "serverKey" : "BmmfVeikSA0DN1aZmyZP9NXi5owxGr1ZRmVX2XH8qVg="                }        },        "roles" : [ ],        "inheritedRoles" : [ ],        "inheritedPrivileges" : [ ],        "inheritedAuthenticationRestrictions" : [ ],        "authenticationRestrictions" : [ ]}


¿Cómo se cambia la contraseña de un usuario de MongoDB?

Para cambiar la contraseña de un usuario, puede usar db.changeUserPassword() método. Nuevamente, debe cambiar a la base de datos de autenticación del usuario antes de ejecutar el comando.

db.changeUserPassword() El método toma dos argumentos:el nombre de usuario de la cuenta que desea cambiar y la nueva contraseña de la cuenta.

Por ejemplo, para cambiar la contraseña del usuario tom autenticado con el admin base de datos a secretpassword , podría escribir:

use admindb.changeUserPassword("tom", "secretpassword")

Al igual que con db.createUser() método, puede utilizar el passwordPrompt() método para el segundo argumento en lugar de proporcionar una contraseña en línea. MongoDB le pedirá que ingrese una contraseña cuando se ejecute el comando:

use admindb.changeUserPassword("tom", passwordPrompt())
Enter password:


¿Cómo cambia otros detalles de la cuenta de usuario?

Para cambiar otra información asociada con una cuenta de usuario, puede usar db.updateUser() método. Asegúrese de cambiar a la base de datos de autenticación del usuario antes de actualizar sus detalles.

El db.updateUser() El método requiere que especifique el nombre de usuario y luego proporcione un objeto que contenga los datos que desea actualizar. Cualquier campo que elija actualizar se reemplazará por completo con la nueva información, así que asegúrese de incluir los datos originales y los nuevos datos en su objeto si solo espera agregar nueva información.

El objeto que incluye en el comando con la información de cambio puede contener muchos campos diferentes. Vamos a repasarlos:

  • customData :cualquier dato arbitrario que se asocie con la cuenta de usuario.
  • roles :Los roles que se otorgan al usuario. A menudo es mejor usar db.grantRolesToUser() y db.revokeRolesFromUser() métodos para controlar la pertenencia a funciones en lugar de actualizar con esta clave, ya que puede agregar y eliminar funciones individualmente.
  • pwd :La contraseña del usuario. Usando db.ChangeUserPassword() El método suele ser más fácil si ese es el único campo que debe actualizarse.
  • authenticationRestrictions :especifica restricciones para la cuenta que pueden limitar las direcciones IP desde o hacia las que los usuarios pueden conectarse. El valor de esta clave es un objeto o matriz que define clientSource y o serverAddress , que contienen matrices que especifican las direcciones IP o rangos válidos. Obtenga más información en los documentos de MongoDB sobre restricciones de autenticación.
  • mechanisms :los mecanismos de autenticación específicos que se utilizarán para las credenciales. Se puede establecer en uno o ambos de SCRAM-SHA-1 o SCRAM-SHA-256 , pero solo se puede cambiar a un subconjunto de los mecanismos actuales si no se proporciona una nueva contraseña actualmente.
  • passwordDigestor :especifica qué componente procesa la contraseña del usuario. Puede ser server (el predeterminado) o client .

Como ejemplo, podemos actualizar el tom cuenta que se autentica contra el admin base de datos para que solo pueda iniciar sesión desde la misma computadora que aloja el servidor cambiando las authenticationRestrictions campo:

use admindb.updateUser("tom", {    authenticationRestrictions: [ {        clientSource: ["127.0.0.1", "::1"],        serverAddress: ["127.0.0.1", "::1"]    } ]})

Ahora, si le pide a MongoDB que le muestre la información relevante sobre el usuario, mostrará restricciones adicionales para la cuenta:

use admindb.getUser("tom", {    showAuthenticationRestrictions: true})
{        "_id" : "admin.tom",        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),        "user" : "tom",        "db" : "admin",        "mechanisms" : [                "SCRAM-SHA-1",                "SCRAM-SHA-256"        ],        "roles" : [ ],        "authenticationRestrictions" : [                {                        "clientSource" : [                                "127.0.0.1",                                "::1"                        ],                        "serverAddress" : [                                "127.0.0.1",                                "::1"                        ]                }        ],        "inheritedRoles" : [ ],        "inheritedPrivileges" : [ ],        "inheritedAuthenticationRestrictions" : [ ]}

Para revocar esas restricciones, podemos ejecutar el comando nuevamente con una matriz vacía:

use admindb.changeUser("tom", {    authenticationRestrictions: []})


¿Cómo se eliminan los usuarios de MongoDB?

Para eliminar las cuentas de usuario de MongoDB, puede usar db.dropUser() método. Asegúrese de conectarse a la base de datos de autenticación del usuario antes de eliminarlo.

Para ejecutar db.dropUser() método, debe proporcionar el nombre del usuario que desea eliminar:

db.dropUser("tom")

Tras una eliminación exitosa, MongoDB devolverá true :

true

Si la cuenta no existía en la base de datos actual, devolverá false .



Conclusión

La configuración de administración y autenticación de usuarios de MongoDB le permite controlar quién puede conectarse a sus servidores y cuáles son sus propiedades de usuario. En un artículo siguiente, cubriremos cómo restringir el nivel de acceso que tienen los usuarios abordando la parte de autorización de la administración de usuarios.