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)
后记
MongoDB的安全机制到底是怎样的?怎么合理地建立用户?角色也可以新建吧?
怎么建立一个超级用户?可以用它访问所有功能——当然是不安全的!
怎么建立数据库?mongo shell中没找到,只有clone、copy、repair、drop数据库的操作。
创建 记录集(表):db.createCollection
添加 记录?
删除 记录?
修改 记录?
查找 记录集 中的 对象(记录?):find()或find(...)
MongoDB的图形化管理工具是什么?MongoDB Compass?
对了,MongoDB用户怎么 修改?删除有一个dropUser(...)函数。
继续dig!
P.S.本文的干活好像并不是很多的啊!请读者见谅!
以上是关于MongoDB(3.6.3)的用户认证初识的主要内容,如果未能解决你的问题,请参考以下文章