签到成功

知道了

CNDBA社区CNDBA社区

MongoDB 用户权限管理

2022-04-28 20:38 2145 1 原创 MongoDB
作者: dave

MongoDB 的安装参考之前的博客:

Redhat 7.7 平台 MongoDB 4.4.6 安装 配置 手册
https://www.cndba.cn/dave/article/4542

1 MongoDB 用户说明

MongoDB安装完成后,默认会有3个数据库:

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
>

此时数据库 admin 中没有任何用户账户,MongoDB 从本地主机发起的连接提供全面的数据库管理权限。

http://www.cndba.cn/dave/article/107957

因此配置 MongoDB 新实例时,首先需要创建用户管理员账户和数据库管理员账户。http://www.cndba.cn/dave/article/107957

  1. 用户管理员账户:可以在 admin 和其他数据库中创建用户账户。
  2. 数据库管理员账户:作为管理数据库、集群、复制和 MongoDB 其他方面的超级用户。

两类账户的创建语法完全相同,唯一不同的就是角色不一样。

http://www.cndba.cn/dave/article/107957

用户管理员账户和数据库管理员账户都是在数据库 admin 中创建的。在 MongoDB 服务器中启用身份验证后,要以用户管理员或数据库管理员的身份连接到服务器,必须向 admin 数据库验证身份,还需在每个数据库中创建用户账户,让这些用户能够访问该数据库。

否则在操作时会报如下错误:

> show collections
Warning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus

2 MongoDB的用户操作

2.1 角色分类说明

MongoDB 内置的角色分类如下:

  1. 数据库用户角色:read、readWrite;
  2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
  3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
  4. 备份恢复角色:backup、restore;
  5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  6. 超级用户角色:root

相关角色权限说明如下:http://www.cndba.cn/dave/article/107957

  1. read:允许用户读取指定数据库;
  2. readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限;
  3. readWrite:允许用户读写指定数据库;
  4. readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限;
  5. dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile;
  6. dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限;
  7. clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限;
  8. userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户;
  9. userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限;
  10. root:只在admin数据库中可用。超级账号,超级权限;

2.2 创建用户管理员账户

配置访问控制的第一步是创建用户管理员账户。用户管理员应只有创建用户账户的权限,而不能管理数据库或执行其他管理任务。这确保数据库管理和用户账户管理之间有清晰的界限。

在 admin 数据库中,添加一个用户并赋予userAdminAnyDatabase角色,userAdminAnyDatabase只在admin数据库中可用,赋予用户所有数据库的userAdmin权限。

例如,下面是在 admin 数据库中创建一个名为admin用户。http://www.cndba.cn/dave/article/107957

> use admin
switched to db admin
> db.createUser( {user: "admin",pwd: "admin",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
Successfully added user: {
        "user" : "admin",
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
}
>

用户管理员应只有创建用户账户的权限,而不能管理数据库或执行其他管理任务。
要创建某个库的管理用户,必须在 admin 进行认证,给哪个库创建用户就先切换到哪个库下面。

2.3 开启权限验证

编辑配置文件/etc/mongod.conf,添加如下内容:

auth=truehttp://www.cndba.cn/dave/article/107957

客户端连接到服务器时必须提供用户名和密码。另外,从 MongoDB shell 访问 MongoDB 服务器时,如果要添加用户账户,必须执行下面的命令向数据库 admin 验证身份:

> use admin
switched to db admin
> db.auth("admin","admin")
1
>

也可以在启动 MongoDB shell 时使用选项-u和-p向数据库 admin 验证身份:

http://www.cndba.cn/dave/article/107957
http://www.cndba.cn/dave/article/107957

mongo -u “admin” -p “admin” —authenticationDatabase admin

2.4 创建数据库管理员账户

要创建数据库管理员,可在 MongoDB shell 中切换到数据库 admin,再使用方法createUser添加角色为readWriteAnyDatabase、dbAdminAnyDatabase和clusterAdmin的用户。
新添加的用户能够访问系统中的所有数据库、创建新的数据库以及管理 MongoDB 集群和副本集。

创建一个名为 admin 的数据库管理员:

> use admin
switched to db admin

--这里提示必须要先验证:
> db.createUser({user: "ustc", pwd: "ustc",roles: [ "readWriteAnyDatabase", "dbAdminAnyDatabase","clusterAdmin" ]} )
uncaught exception: Error: couldn't add user: command createUser requires authentication :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1386:11
@(shell):1:1
> db.auth("admin","admin")
1
> db.createUser({user: "ustc", pwd: "ustc",roles: [ "readWriteAnyDatabase", "dbAdminAnyDatabase","clusterAdmin" ]} )
Successfully added user: {
        "user" : "ustc",
        "roles" : [
                "readWriteAnyDatabase",
                "dbAdminAnyDatabase",
                "clusterAdmin"
        ]
}
>

数据库管理员能够访问系统中的所有数据库、创建新的数据库以及管理 MongoDB 集群和副本集。
如果要求管理其他数据库,首先要去 admin 库里面去认证。

查看全局所有账户

http://www.cndba.cn/dave/article/107957

> use admin
switched to db admin
> db.system.users.find().pretty()

查看当前库下的账户

> use admin
> show users

2.5 创建普通用户

一旦经过认证的用户管理员,可以使用db.createUser()去创建普通用户。

可以分配mongodb内置的角色或用户自定义的角色给用户。

创建用户的数据库是该用户认证数据库。尽管用户认证是这个数据库,用户依然可以有其他数据库的角色。即用户认证数据库不限制用户权限。

创建一个角色为readWrite的用户 ustc来管理数据库ustc。

> use admin
switched to db admin
> db.auth('admin','admin')
1
> use ustc
switched to db ustc
> db.createUser({user:"ustc",pwd: "ustc",roles: [{ role: "readWrite", db: "ustc"}]})
Successfully added user: {
        "user" : "ustc",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "ustc"
                }
        ]
}
> db.auth('ustc','ustc')
1

创建一个dmp用户,对ustc数据库只读权限。http://www.cndba.cn/dave/article/107957

>  use admin
switched to db admin
> db.auth('admin','admin');
1
> use ustc
switched to db ustc
> db.createUser({user:"dmp",pwd: "dmp",roles: [{ role: "read", db: "ustc"}]})
Successfully added user: {
        "user" : "dmp",
        "roles" : [
                {
                        "role" : "read",
                        "db" : "ustc"
                }
        ]
}
>

2.6 其他用户授权操作

修改密码

> use ustc
switched to db ustc
> db.updateUser("ustc",{pwd:"dave"});    #方法1
> db.changeUserPassword("ustc","dave");  #方法2
>

添加角色

> use ustc
switched to db ustc
> db.grantRolesToUser("ustc",[ { role: "read",db:"admin"} ] )
>

回收角色权限

> use ustc
switched to db ustc
> db.revokeRolesFromUser("ustc",[ { role: "read",db:"admin"} ] )

删除用户

> use ustc
switched to db ustc
> db.dropUser("ustc")
true

3 用户信息的存储

MongoDB的用户账号是以文档的形式存储在system.users 集合中的,文档结构如下:

> use admin
switched to db admin
> show tables
system.users
system.version
>
> db.system.users.findOne()
{
        "_id" : "admin.admin",
        "userId" : UUID("833076ba-0904-47c8-b0b7-07be57656cd9"),
        "user" : "admin",
        "db" : "admin",
        "credentials" : {
                "SCRAM-SHA-1" : {
                        "iterationCount" : 10000,
                        "salt" : "qah5J1t2rEGg3XEMNHzEjw==",
                        "storedKey" : "S7KMB2JLQoPa92TmY1n89zmCcuI=",
                        "serverKey" : "Zl11XDk88Z8stY6K4v9cQEs5GBA="
                },
                "SCRAM-SHA-256" : {
                        "iterationCount" : 15000,
                        "salt" : "JzE/A5mfN5LMo85l/bPGvXrNTRNDIx2ST7ovYA==",
                        "storedKey" : "LMTo/eMHwllCuh7x//lu2sBMBY5FHFKmnM5VXJdaNmM=",
                        "serverKey" : "m73d/PQLlwAPfk0Sb3c+y4ldePFHoASbR3ZWLf2o1pE="
                }
        },
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
}
>

一共有7个列。 知道账户的存储集合后,除了我们之前用到的语法之外,也可以直接对system.users 集合进行操作来管理用户。

比如删除用户:

> db.system.users.find({},{'_id':1,'user':1,'db':1})
{ "_id" : "admin.admin", "user" : "admin", "db" : "admin" }
{ "_id" : "admin.dave", "user" : "dave", "db" : "admin" }
{ "_id" : "admin.ustc", "user" : "ustc", "db" : "admin" }
{ "_id" : "ustc.dmp", "user" : "dmp", "db" : "ustc" }
>

> use admin
switched to db admin
> db.auth('admin','admin')
> db.createUser( { user:"root", pwd:"root", roles:[{role:"root",db:"admin"}] } );
> db.auth('root','root')
1
> db.system.users.remove({'user':'ustc'})
WriteResult({ "nRemoved" : 1 })
>

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2297
    原创
  • 3
    翻译
  • 644
    转载
  • 198
    评论
  • 访问:9617012次
  • 积分:4542
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ