使用mongodump的最小权限(转储特定数据库)

时间:2013-12-10 09:13:55

标签: mongodb

我们似乎无法找到关于在特定数据库上运行mongodump需要哪些权限(用户角色)的任何结论性文档。

假设我有一个名为x的用户名和一个用户y,其中包含以下角色roles: [ "readWrite", "dbAdmin" ],以及有2位用户abadminroles: [ "userAdminAnyDatabase" ]的{​​{1}}集合,似乎没有人拥有运行roles: [ "dbAdminAnyDatabase" ]的正确权限:

mongodump

我们必须遗漏一些明显的东西,但是在转储数据库时mongodump会查找什么以及它需要什么权限?

PS:作为奖励,我们想知道转储特定集合以及所有数据库所需的用户角色。

4 个答案:

答案 0 :(得分:43)

幸运的是mongodump 3.0正在接受跳过某些收藏的选项。

这解决了我没有管理员访问数据库来调整权限的问题。 请注意,您不会再创建完整备份了。

mongodump --excludeCollection=system.indexes

mongodump --excludeCollectionsWithPrefix=system

答案 1 :(得分:13)

TL; DR :对于mongodb 2.4,您至少需要在db上具有read角色和userAdmin的用户。否则,当您在此类数据库上转储system.users.bson时,您将遇到我们在问题中遇到的错误。


所以我们忽略了一个重要的参考:man mongodump

但是,您需要mongodump 2.4.x才能看到相关部分,所以这里是mongodb github docs的参考:

Required User Privileges
------------------------

.. note:: User privileges changed in MongoDB 2.4.

The user must have appropriate privileges to read data from database
holding collections in order to use :program:`mongodump`. Consider the
following :doc:`required privileges </reference/system-defined-roles>` for
the following :program:`mongodump` operations:

.. list-table::
   :header-rows: 1

   * - Task
     - Required Privileges

   * - All collections in a database except ``system.users``.
     - :authrole:`read`. [#read-or-read-write]_

   * - All collections in a database, including ``system.users``.
     - :authrole:`read` [#read-or-read-write]_ and :authrole:`userAdmin`.

   * - All databases. [#profiling-exception]_
     - :authrole:`readAnyDatabase`, :authrole:`userAdminAnyDatabase`,
       and :authrole:`clusterAdmin`. [#cluster-admin]_

See :doc:`/reference/system-defined-roles` and
:doc:`/reference/privilege-documents` for more information on user
roles.

.. [#read-or-read-write] You may provision :authrole:`readWrite`
   instead of :authrole:`read`.

.. [#cluster-admin] :authrole:`clusterAdmin` provides the ability to
   run the :dbcommand:`listDatabases` command, to list all existing
   databases.

.. [#profiling-exception] If any database runs with profiling enabled,
   :program:`mongodump` may need the
   :authrole:`dbAdminAnyDatabase` privilege to dump the
   ``system.profile`` collection.

PS:目前有no way跳过某些集合,所以如果你只在db上有read或readWrite角色,你需要单独转储每个集合。

答案 2 :(得分:4)

对我来说记忆力也差。但终于搞清楚了...... 实际上它很简单。您只需为mongodump添加backup role的用户,mongorestore添加restore role

backup角色:提供备份数据所需的最小权限。此角色提供了足够的权限来使用MongoDB Cloud Manager备份代理,Ops Manager备份代理,或使用mongodump备份整个mongod实例。

restore角色:提供从不包含system.profile集合数据的备份还原数据所需的权限。使用mongorestore在没有--oplogReplay选项的情况下恢复数据时,此角色就足够了。

例如,您可以创建这样的备份用户:

> use admin
> db.createUser({
    user: "backupuser",
    pwd: "12345",
    roles: ["backup"]
})

答案 3 :(得分:0)

这个最小的权限对我来说似乎很好(请注意,内置的“备份”角色仅存在于'admin'数据库中)。第一个特权需要摆脱[myDb.system.indexes:myDb上没有授权执行命令{count:“system.indexes”,query:{}}]错误:

db.createRole({
     role: "myDumpRole",
     privileges: [
       { resource: { db: "myDb", collection: "system.indexes" }, actions: [ "find"] },
       { resource: { db: "myDb", collection: "" }, actions: [ "find", "listCollections", "listIndexes", "indexStats"] }
     ]
});