0

我们需要一个具有最小权限的用户,该用户只能使用 db.fsyncLock() 和 db.unlock() 锁定一个 mongo 实例,以确保我们可以对磁盘映像进行一致的快照。我目前创建了以下角色:

{
    "role" : "local_lock",
    "db" : "admin",
    "isBuiltin" : false,
    "roles" : [ ],
    "inheritedRoles" : [ ],
    "privileges" : [
        {
            "resource" : {
                "cluster" : true
            },
            "actions" : [
                "logRotate",
                "resync",
                "unlock"
            ]
        }
    ],
    "inheritedPrivileges" : [
        {
            "resource" : {
                "cluster" : true
            },
            "actions" : [
                "logRotate",
                "resync",
                "unlock"
            ]
        }
    ]
}

但是,当我使用此用户尝试锁定时,我收到以下信息:

> db.fsyncLock()
{
    "ok" : 0,
    "errmsg" : "not authorized on admin to execute command { fsync: 1.0, lock: true }",
    "code" : 13,
    "codeName" : "Unauthorized"
}
>

还需要哪些其他权限?Mongo版本如下:

MongoDB shell version v3.4.7
MongoDB server version: 3.4.7
4

3 回答 3

1

我相信我在将角色分配给用户时打错了,以下确实有效:

[
    {
        "role" : "local_lock",
        "db" : "admin",
        "isBuiltin" : false,
        "roles" : [ ],
        "inheritedRoles" : [ ],
        "privileges" : [
            {
                "resource" : {
                    "cluster" : true
                },
                "actions" : [
                    "fsync",
                    "unlock"
                ]
            }
        ],
        "inheritedPrivileges" : [
            {
                "resource" : {
                    "cluster" : true
                },
                "actions" : [
                    "fsync",
                    "unlock"
                ]
            }
        ]
    }
]
于 2017-08-21T13:21:09.053 回答
0

这就是我为分片集群(mongodb v3.6)所做的。我想从每个分片副本集中的单独副本进行备份。为此,我登录到副本,连接到本地 mongod,锁定数据库写入并开始执行文件复制。之后,我取消阻止数据库。所以:

  1. 在每个分片副本集的主节点上创建一个具有额外权限的新备份角色:
shard_01_r2:PRIMARY> db.createRole(
{
  "role": "local_backup_with_locks",
  "roles": [
    "backup"
  ],
  "privileges": [
    {
      "resource": {
        "cluster": true
      },
      "actions": [
        "fsync",
        "unlock",
        "enableProfiler",
        "replSetGetStatus"
      ]
    }
  ],
  "authenticationRestrictions": [
    {
      "clientSource": [
        "127.0.0.1",
        "::1"
      ]
    }
  ]
}
)
  1. 在此处创建一个备份用户,以便可以单独管理每个分片:
shard_01_r2:PRIMARY> db.createUser(
    {
    user: "dtci_backup",
    pwd: "XXX",
    roles: [ { role: "local_backup_with_locks", db: "admin" } ]
    }
)
  1. mongos通过, 为备份配置服务器“全局”创建此用户。由于这里不需要添加 fsynclock/unlock,我们可以只分配备份角色:
mongos> db.createUser(
    {
    user: "dtci_backup",
    pwd: "XXX",
    roles: [ { role: "backup", db: "admin" } ]
    }
)

而已!现在,您可以在本地连接每个分片中的任何副本并从中进行备份,而不会影响其他副本/集群。

于 2020-10-28T15:35:29.427 回答
0

好吧,将用户限制在这个范围内可能不是一个好主意,并且他/她可能根本不会执行此操作。

fsync但是,请尝试授予unlock帐户权限。请参阅文档中的fsync解锁操作。

于 2017-08-21T13:15:22.340 回答