快盘下载:好资源、好软件、快快下载吧!

快盘排行|快盘最新

当前位置:首页软件教程电脑软件教程 → readAnyDatabase可以读取所有的database吗?

readAnyDatabase可以读取所有的database吗?

时间:2022-09-17 21:05:52人气:作者:快盘下载我要评论

readAnyDatabase可以读取所有的database吗?

//

readAnyDatabase可以读取所有的database吗?

//

01

问题背景

今天在线上环境中,发现了一个有意思的小问题。这个问题是权限相关的。

我们首先使用root权限登录,并在admin的这个数据库下面创建了test账号,给了它readAnydatabase的角色,创建这个账号的语句如下:

use admin
db.createUser({
    "user" : "test",
    "pwd"  : "test_password",
    "roles" : [
        {
            "role" : "readAnyDatabase",
            "db" : "admin"
        }
    ]
})

创建账号完毕后,然后我们创建一个新的集合aaa.bbb,并向bbb这个集合插入数据,

testInit:PRIMARY> use aaa
switched to db aaa
testInit:PRIMARY> db.bbb.insert({id:1})
WriteResult({ "nInserted" : 1 })

然后我们重新使用test这个用户和test_password这个密码登录相关的mongod实例,并查询bbb的这个集合,结果如下:

[root@ ~]# /data1/yazhou5/mongodb/mongodb-linux-4.0.4/bin/mongo --port=45011 -u "test" -p "test_password"  --authenticationDatabase "admin" --host=10.xx.xx.80    
MongoDB shell version v4.0.4
connecting to: mongodb://10.13.88.80:45011/
Implicit session: session { "id" : UUID("daf6970a-aa4b-4984-9aa6-769e92f27c55") }
MongoDB server version: 4.0.4
testInit:PRIMARY> 
testInit:PRIMARY> use aaa
switched to db aaa
testInit:PRIMARY> db.bbb.find()
{ "_id" : ObjectId("607da365a9028d75b2dc970c"), "id" : 1 }

到这里,似乎没有什么问题,我们创建的账号在admin数据库下面,有readAnydatabase的权限,所以即使不在aaa数据库下面,也可以直接读取aaa数据库下面的bbb集合。

如果我们使用这个账号去读取local数据库中的oplog.rs这个集合的时候,会发现下面的问题:

testInit:PRIMARY> db.oplog.rs.find()
Error: error: {
        "operationTime" : Timestamp(1618847798, 1),
        "ok" : 0,
        "errmsg" : "not authorized on local to execute command { find: "oplog.rs", filter: {}, lsid: { id: UUID("a84e7282-ad63-4a53-8f14-1e8681ee2f06") }, $clusterTime: { clusterTime: Timestamp(1618847788, 1), signature: { hash: BinData(0, 81ABC979D562DC82476920680BB0B7B1940EDF46), keyId: 6912418480415309825 } }, $db: "local" }",
        "code" : 13,
        "codeName" : "Unauthorized",
        "$clusterTime" : {
                "clusterTime" : Timestamp(1618847798, 1),
                "signature" : {
                        "hash" : BinData(0,"FmxZI9KxpqsjBgtPuVX/I7mlSvo="),
                        "keyId" : NumberLong("6912418480415309825")
                }
        }
}

看来,readAnyDatabase的角色只是一个"顾名思义"上的错觉,它也不能访问所有的数据库,那么这个角色能访问哪些数据库呢?

02

官方文档说明

readAnyDatabase

从官方文档描述不难看出,在3.4版本之前,这个用户可以访问local库和config库,而在3.4版本的MongoDB中进行了改造,后续版本不再能够访问local库和config库中的表,只能访问除这两个库之外的其他业务库和系统库。

如果想要访问local库和config库,需要单独创建这两个数据库的read或者readwrite角色账号。

那么我们可以将test用户设置成下面这样:

{
    "user" : "test",
    "pwd"  : "test_password",
    "roles" : [
        { 
            "role" : "readAnyDatabase", 
            "db": "admin" 
        }, 
        {
            "role" : "readWrite",
            "db" : "config"
        },
        {
            "role" : "readWrite",
            "db" : "local"
        }
    ]
}

相关文章

  • 一步步带你设计MySQL索引数据结构

    一步步带你设计MySQL索引数据结构,想想我们生活中的例子,比如新华字典,我们有一个目录,目录根据拼音排序,内容包含了汉字位于字典中具体的的页码。聪明的你肯定也想到了,我们也可以借鉴这种思想,建立一个MySQL的目录,叫做“索引”。...
  • 影刀连接Mysql数据库

    影刀连接Mysql数据库,影刀配置连接mysql数据库基础版...

网友评论

快盘下载暂未开通留言功能。

关于我们| 广告联络| 联系我们| 网站帮助| 免责声明| 软件发布

Copyright 2019-2029 【快快下载吧】 版权所有 快快下载吧 | 豫ICP备10006759号公安备案:41010502004165

声明: 快快下载吧上的所有软件和资料来源于互联网,仅供学习和研究使用,请测试后自行销毁,如有侵犯你版权的,请来信指出,本站将立即改正。