启用身份验证后无法从 local.system.replset 中删除文档

问题描述 投票:0回答:2

我有启用身份验证的 MongoDB 副本集。我想更改副本集名称。为此,我必须从

local.system.replset
集合中删除文档。我有分配了
root@admin
角色的管理员用户,也有分配了
readWrite@local
角色的普通用户。当我尝试使用上述任何用户从 shell 执行
remove
时,我得到
Unauthorized
异常:

> db.system.replset.remove({})
WriteCommandError({
        "operationTime" : Timestamp(1582026365, 1),
        "ok" : 0,
        "errmsg" : "not authorized on local to execute command { delete: \"system.replset\", ordered: true, lsid: { id: UUID(\"43182bad-b13d-4ff4-a31b-3cdcb1dd49fa\") }, $clusterTime: { clusterTime: Timestamp(1582026355, 1), signature: { hash: BinData(0, E9FD8A23702CE215B193423CAF1C2AF3FEE83D6B), keyId: 6794747247067136002 } }, $db: \"local\" }",
        "code" : 13,
        "codeName" : "Unauthorized",
        "$clusterTime" : {
                "clusterTime" : Timestamp(1582026365, 1),
                "signature" : {
                        "hash" : BinData(0,"CyCvFtgLkpdhIrsJV67KBlVwL+U="),
                        "keyId" : NumberLong("6794747247067136002")
                }
        }
})

如果我尝试在未启用身份验证的副本集上执行相同的命令,我可以成功删除记录。为了让用户从

local.system.replset
删除记录,我缺少什么角色?还是启用认证时不支持?

mongodb replicaset
2个回答
1
投票

这个答案https://stackoverflow.com/a/20120639/2138959给了我一个提示,

root
用户可能没有所需的权限,实际上它只有
find
权限。我仍然不知道为什么
readWrite@local
不允许写入
system.replicaset
,但是当我使用
find
insert
remove
update
bypassDocumentValidation
useUUID添加新角色时
local.system.replset
资源的权限我终于能够删除副本集并更新名称。

另一个更简单的选项是将

dbOwner@local
角色分配给用户。


0
投票

root
dbOwner@local
都拥有数据库的一般权限:

db.getRole( "dbOwner", { showPrivileges: true } ) { “角色”:“dbOwner”, “db”:“本地”, “isBuiltin”:正确, “角色”:[], “继承角色”:[], “特权”:[ { “资源”:{ “db”:“本地”, “收藏”:“” }, (...)

但是,引用文档

如果只有集合字段为空字符串(""),则该资源为 指定的数据库,不包括系统集合

因此,为了获得对

system.replicaset
的写入权限,您需要专门为此集合添加一个角色:

db.createRole( { 角色: "rs_admin", 特权: [ { 资源: { db: "本地", 集合: "system.replset" }, 操作: [ "查找", "插入", "删除" ] } ],角色:[] } )

© www.soinside.com 2019 - 2024. All rights reserved.