我们似乎无法找到关于在特定数据库上运行mongodump
需要哪些权限(用户角色)的任何结论性文档。
假设我有一个名为x
的用户名和一个用户y
,其中包含以下角色roles: [ "readWrite", "dbAdmin" ]
,以及有2位用户a
和b
对admin
和roles: [ "userAdminAnyDatabase" ]
的{{1}}集合,似乎没有人拥有运行roles: [ "dbAdminAnyDatabase" ]
的正确权限:
mongodump
我们必须遗漏一些明显的东西,但是在转储数据库时mongodump会查找什么以及它需要什么权限?
PS:作为奖励,我们想知道转储特定集合以及所有数据库所需的用户角色。
答案 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"] }
]
});