MongoDB安全:创建第1个第2个第3个用户

Posted luo630

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB安全:创建第1个第2个第3个用户相关的知识,希望对你有一定的参考价值。

Windows 10家庭中文版,MongoDB3.6.3,

 

前言

使用mongod命令基于某个空白文件夹(存放数据)启动MongoDB服务器时,要是没有使用--auth选项,启动后,任何客户端是可以无需认证就连接MongoDB服务器的。

比如,在MongoDB服务器启动后,在本机的终端输入mongo命令即可连接到MongoDB服务。

没有认证,不安全,在MongoDB服务器发布后,这是决不允许的!

因此,在使用mongod命令启动MongoDB服务器时,需要添加--auth选项,增加安全认证功能。

 

注意,

MongoDB默认没有添加用户的,基于易用性考虑;

在默认没有用户时,也是可以开启--auth选项的,因为MongoDB提供了一个localhost exception的功能,此功能允许用户在admin数据库中创建一个用户管理员(user administrator),此用户也是下一节要讲的创建的第1个用户。

 

说明,

MongoDB的安全体系支持下面三种认证机制:

-SCRAM(默认)

-MongoDB Challenge and Response (MONGODB-CR)(在3.6时被废弃

-x.509证书鉴别(Certificate Authentication,孤不熟悉,短时间内不准备去了解)

 

创建第1个用户:必须

第1个用户必须是用户管理员,其角色为userAdmin或userAdminAnyDatabase,这个用户可以用下面的方式管理用户:

-创建用户

-给用户赋予(grant)或取消(revoke)某角色

-创建或修改定制角色

 

总之,创建第一个用户使用userAdmin或userAdminAnyDatabase角色就对了!

 

孤的操作(mongod的配置参数请参考其help信息):

在空文件夹使用mongod命令启动MongoDB服务器:使用了--auth选项

mongod --dbpath d:pmdb018 --logpath d:pmdb018log --logappend --auth --directoryperdb

技术分享图片

技术分享图片

 

创建一个基于角色userAdminAnyDatabase、用于admin数据库的用户admin:

-先在Notepad++中写入脚本(javascript?),如下:

1 db.createUser(
2   {
3     user: "admin",
4     pwd: "111111",
5     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
6   }
7 )

-使用mongo命令连接MongoDB服务器,切换到admin数据库

技术分享图片

-将前面的脚本拷贝到命令行并执行:添加用户admin成功;使用db.auth(‘admin‘, ‘111111‘)验证,返回1,成功!

技术分享图片

-检查用户admin及其角色的信息:使用db.getUser(...)和db.getRole(....)命令

技术分享图片

 

断开连接,使用选项--authenticationDatabase "admin"登录:建立连接后,db并非admin,仍然是test(与预期不符!),尚不清楚是怎么回事!

技术分享图片

 

不管如何,第1个用户建立好了,角色为userAdminAnyDatabase,官文介绍说,除了local和config外,此角色的用户可以对其它数据库进行其角色允许的操作——简单地说就是,用户管理。 

 

创建第2个用户:内建角色

MongoDB 3.6共有7类共17个内建角色,其中,Database User Roles、Database Administration Roles是所有数据库都有的角色,而其它类别的角色是admin数据库独有的。

目前MongoDB服务器中只有内建数据库,那么,添加一个名为test0709的数据库——使用use,然后编写脚本,建立用户admin0709,密码为111111,使用内建角色readWrite、dbAdmin,脚本如下:

 1 db.createUser(
 2   {
 3     user: "admin0709",
 4     pwd: "111111",
 5     roles: [
 6         { role: "readWrite", db: "test0709" },
 7         { role: "dbAdmin", db: "test0709" }
 8     ]
 9   }
10 )

脚本拷贝到终端执行:用户添加成功!

技术分享图片

测试:

-切换到admin,使用admin0709验证;

-切换回test0709,使用admin0709验证;

技术分享图片

-查看数据库、集合、用户信息;

技术分享图片

-已经在数据库test0709中添加了用户admin0709,但在show dbs中却没有看到数据库test0709,为什么?那么,断开连接后,再次连接到MongoDB服务器,是否还存在数据库test0709和其上的用户admin0709呢?测试!

结果显示:show dbs查看不到数据库,但用户admin0709的信息还在。

技术分享图片

-admin0709的其中一个角色为readWrite,那么,测试添加、删除文档——在新的数据集fruit中;

技术分享图片

-dbAdmin角色有创建集合的功能,那么,可以使用db.createCollection(name, options)函数创建集合;

a.普通集合

b.固定大小集合(capped)

技术分享图片

-其它测试

... 

 

注意:用户admin0709在test0709下无法执行show dbs!

技术分享图片

 

说明,孤对这些操作还不够熟练,需要多多练习才是啊!

 

创建第3个用户:自定义角色

除了内建角色,MongoDB还提供机制自建角色,以满足各种各样的需求,使用db.createRole()函数

db.createRole()函数语法如下:

db.createRole(role, writeConcern)

参数role、wrieConcern都是文档,本文仅关注role文档,下面是官方示例:具体信息请参考官网

技术分享图片

 

下面新建一个角色myRole:可以在前面的test0709数据库中的集合中添加文档——insert操作。

同样,将添加角色的脚本(脚本的书写规则是什么?官文在哪里?)写入到文本文件中,然后拷贝到终端执行——用admin可以添加此角色(admin0709不具备此权限):

技术分享图片

 

角色myRole添加成功,现在,基于此角色添加用户insertUser(还是用admin用户),脚本如下:

1 db.createUser(
2     {
3         user: "insertUser",
4         pwd: "111111",
5         roles: [
6             { role: "myRole", db: "test0709" }
7         ]
8     }
9 )

拷贝到终端时,执行出错,无法建立用户insertUser,原因是无法找到之前建立的角色myRole!需要做类似flush的操作吗?可是下午添加另一个角色未发现异常啊!

意外关闭终端后,再次进入终端,此时进入数据库test0709,检查又发现了角色myRole,并且成功添加了用户insertUser:

为什么会这样呢?!检查了MongoDB服务器的日志信息,也没有发现相关的失败操作,此时,怎么查找问题原因呢?哪些工具可以使用?

技术分享图片

技术分享图片

 

测试insertUser用户:在fruit数据集中插入文档,成功!但是,无法使用insertUser用户查看fruit数据集的文档,因为其不具备find权限!切换为admin0709查看结果,添加成功!

技术分享图片

 

后记

总算写完了,今天第四篇,都挺基础的,但真的用力了!

之前看了菜鸟教程(RUNOOB) ,但因为没有实际操作,结果全忘记了,经过这一遍,好多了,不过呢,还有很多需要练习的!

更新啊、删除啊……各种!无论是角色还是用户!

居然可以直接存中文,挺好的,至少目前不用为字符集烦恼了,那么,和Web应用结合起来呢?过两天就知道了!

就这样!

可以创建第一个用户了、可以创建角色了、可以创建用户了,那么,单例MongoDB的基本安全应该可以保证了吧!放到公网也不用过于担心被坏人破坏了吧!比特币孤是没有的!万分之一枚也没有的!

有一个疑问,是否可以在创建数据库之前为数据库、数据集创建角色和用户?此问题源于之前角色创建好勒,可show dbs看不到数据库test0709。

问题还有一些,一个一个解决,这段时间解决了不少问题了,后面,应该还会更多!(这个蓝色清楚不掉,编辑器的问题吧)

 

以上是关于MongoDB安全:创建第1个第2个第3个用户的主要内容,如果未能解决你的问题,请参考以下文章

如何对齐左边的2个第一个元素和右边的最后一个元素[重复]

怎么用Java的控制台输出各种三角形?

如何从mysql中的得分表中获取每场比赛的3个第一名?

codeforces Round 593(div. 2)

Solidity 中的切片数字(例如从 uint 中提取 2 个第一个数字)

Unicode和其他编码兼容性