MongoDB(3.6.3)的用户认证初识

Posted `三一三`

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB(3.6.3)的用户认证初识相关的知识,希望对你有一定的参考价值。

Windows 10家庭中文版,MongoDB 3.6.3,

 

前言

刚刚安装好了MongoDB,启动了服务器-mongod命令,启动了MongoDB shell-mongo命令,不过,全程都没有使用username、password!震惊!

原来,MongoDB默认没有用户认证的,也没有默认用户,因此,都需要自己添加——安全全权交给用户自己负责

不过,MongoDB里面是有强大且完备(浮夸了点,但一定是这样的,还要去了解一下去年还是什么时候发生的大量MongoDB被黑敲诈比特币的事件)的安全机制的,对于用户认证来说,目前孤所知的是可以做下面的事情(实际上还可以做更多):

-启动MongoDB服务时使用--auth启动用户认证(只是启动这个吗)

-使用db.createUser(...)添加用户

 

本文介绍了如何开启MongoDB的安全认证、如何添加一个用户到MongoDB的过程,因为第一天玩MongoDB,所以,不会更多深入。

 

说明,孤的MongoDB的bin目录已经添加到环境变量path中。

 

开启MongoDB安全认证

打开终端,执行下面的命令查看mongod的使用信息:

>mongod --help

可以看到General options下有一个--auth选项,介绍时run with security,在孤目前的理解来看,就是打开MongoDB的安全认证,其中包括用户认证,当然,还可能有其它认证方式。

 

新建文件夹mdb2dir(空白),并基于它启动MongoDB服务:使用了--auth,打开了安全认证

 

不过,此时MongoDB数据库中是没有用户信息的,因此,任何客户端都不能访问MongoDB服务器。使用mongo命令可以连接上,但执行命令时会提示认证错误。

 

此时使用db.auth(...)加各种参数也无法成功完成认证:

 

怎么办?添加用户先!

 

关掉MongoDB服务,重新使用没有--auth选项的非安全方式启动(第二行):

 

----

 

说明,启动mongo shell的输出信息只有3行,这比MongoDB没有开启安全认证时的输出信息少太多了,对比下:

 

说明,在上面的启动中,使用了日志记录功能,因此,可以通过日志文件查看操作过程中发生的事项(哪些日志要被记录、什么级别才被记录、怎么控制日志格式……需要看更多资料才行)。

 

添加用户到MongoDB

怎么添加MongoDB用户呢?看了两篇博文——一篇14年的、一篇17年的,使用db.addUser(...)添加用户。好,结果,孤的MongoDB 3.6.3已经不支持这个命令了。

使用db.help()可以看到其中有一个db.createUser(...)命令:

db.createUser(userDocument)

看时看到了,可什么事userDocument?怎么用这个命令呢?此时,mongo shell无法帮助孤获取更多这个函数的使用信息了!

又看了一遍mongo shell命令和db.help()下的命令,没有办法知道这个函数的用法。

那么,去官网找吧,更快的应该是用搜索引擎找——然后到官网。

 

官文Enable Auth正是孤想要的(尚未细看,就看了Create the user administrator小节,不过足够添加一个用户了,居然还涉及到角色):

 

上面是官文的示例截图,从结构来看,上面的语句是写到某种脚本文件中的,然后再执行脚本(javascript脚本?怎么执行?mongo的命令中有一个选项执行.js文件~)。

 

下图是自己添加用户的截图:

第一次只用了user、pwd,结果失败,提示要roles;

第二次添加成功了,新用户 名为sa,角色为userAdminAnyDatabase(孤还以为这个角色是任何数据库都可以访问的呢,结果却并非如此);

 

已经添加了sa用户,来验证一下:关闭mongo shell、MongoDB服务器,重新使用--auth选项打开MongoDB服务器,再使用mongo shell连接MongoDB服务器。

 

使用sa账号完成认证,执行一些操作的结果如下:原来角色为userAdminAnyDatabase的用户sa并不是万能的

-默认的mongo shell的db显示为test(这个test是什么?有什么用?不是数据库的啊!),故认证失败

-切换到admin数据库,sa账号认证成功

-可以执行show dbs命令,,但是,切换到local数据库时执行失败(此问题和角色有关系,也说明自己对MongoDB的这套用户权限机制不熟悉)

-在local数据库下,认证也失败,逻辑正确

-在数据库admin执行show collections失败(不应该的啊!)

 

说明,userAdminAnyDatabase角色从名字上看,是建立管理员权限的账号并可以访问任何数据库,可在上面的操作中,基于它的用户sa并没有实现孤的预期,甚至在admin数据库中执行show collections都失败——不应该啊!不是有这个权限吗?

 

官文Built-In Roles中有对userAdminAnyDatabase的详细介绍,开始就说了,基于它角色的用户不可以访问local、config两个数据库(难道show collections的数据涉及到了这两个数据库?):

 

0705-1541更新:

使用不添加--auth的方式重启了MongoDB服务器,查看其中之前添加的用户sa:

最初,数据库admin下只有system.version记录集,但在添加用户sa后,多了一个system.users记录集。使用 记录集的find()命令可以查看其中所有用户信息,不过目前只有一个用户sa。

 

看来,需要认真看下MongoDB的用户权限管理相关官文才可以彻底了解。

 

参考链接

mongodb 权限设置--用户名、密码、端口(by 园友 luck_mylife)

官文Enable Auth

官文Built-In Roles

 

后记

MongoDB的安全机制到底是怎样的?怎么合理地建立用户?角色也可以新建吧?

怎么建立一个超级用户?可以用它访问所有功能——当然是不安全的!

怎么建立数据库?mongo shell中没找到,只有clone、copy、repair、drop数据库的操作。

创建 记录集(表):db.createCollection

添加 记录?

删除 记录?

修改 记录?

查找 记录集 中的 对象(记录?):find()或find(...)

MongoDB的图形化管理工具是什么?MongoDB Compass?

 

对了,MongoDB用户怎么 修改?删除有一个dropUser(...)函数。

 

继续dig!

 

P.S.本文的干活好像并不是很多的啊!请读者见谅!

 

以上是关于MongoDB(3.6.3)的用户认证初识的主要内容,如果未能解决你的问题,请参考以下文章

赵强老师MongoDB管理用户的认证机制

mongodb之用户/认证/角色/权限管理

5MongoDB学习之安全与认证

认证授权方案之授权初识

mongodb 启用密码认证

MongoDB安全和认证