MongoDB安全认证

来自linux中国网wiki
Evan讨论 | 贡献2019年10月14日 (一) 13:52的版本 (导入1个版本)
跳到导航 跳到搜索

MongoDB权限介绍

c.1 MongoDB是没有默认管理员账号的,所以要先添加管理员账号,在开启权限认证。

c.2 切换到admin数据库,添加的账号才是管理员的账号。

c.3 用户只能在用户所在的数据库登录,包括管理员账号。

c.4 管理员可以管理所有的数据库,但是不能直接管理其它数据库,要先在admin数据库中认证才可以,也是为了 安全性考虑。


mongodb简单开启安全验证

1.设置mongodb的用户名和密码(管理员)

mongodb默认是没有用户名和密码的,我们安装好mongodb的客户端,在本地连接本地客户端的mongodb时,直接就"mongo"就可以了,默认是127.0.0.1,默认监听27017端口,不需要什么安全验证,那如何来开启安全验证呢?

如果要开启安全验证,就必须要用--auth来开启安全性的检查,创建的用户名都是存放在system.admin.Users下面的

1.设置mongodb的用户名和密码(管理员):

创建管理员:

use admin
#添加管理员
db.createUser({user:"root",pwd:"123456",roles:["root"]}) 

然后重新启动mongodb,但是必须加上--auth选项,
mongod --auth  --dbpath /data/apps/mongodb/data/   

或者使用配置文件,增加参数:
security:
  authorization: enabled //冒号后面需要空一格


全验证检查开启成功了,此时你应该这样连接:
mongo admin -u root -p 123456 

2.针对某个数据库(database)建立用户(权限:read,readWrite,write)

a.创建用户(如果不选中对应的数据库use foobar,那么你创建的用户认证会不成功,也无法登陆mongo):
给foobar数据库一个用户root read权限 
use foobar
db.createUser({
user: 'root',
pwd: '123456',
roles: [{role: 'read', db: 'foobar'}]
});

b.认证db.auth("user","pwd")--也必须选中对应的数据库use foobar,因为我上面选中了,所以直接就认证,出现1表示认证成功

> db.auth("root", "123456");
1

c.接下来重启mongo,使用刚才创建的用户登陆,验证权限
mongo foobar -u root -p 123456

[root@work2 ~]# mongo foobar -u root -p 123456
MongoDB shell version: 3.2.0
connecting to: foobar

MongoDB 用户和身份验证

内容和上面有点重复 创建用户管理员账户

2.1 创建用户管理员账户 当前数据库版本:Mongodb 3.4

使用 mongod 启动数据库

mongod --port 27017 --dbpath /data/db1 参数默认可以不加,若有自定义参数,才要加上,下同。

另起一个终端,运行下列命令

mongo --port 27017

use admin db.createUser(

 {
   user: "adminUser",
   pwd: "adminPass",
   roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
 }

) 管理员创建成功,现在拥有了用户管理员 用户名:adminUser 密码:adminPass 然后,断开 mongodb 连接, 关闭数据库 两个终端下 <C - c>

2.2 Mongodb 用户验证登陆 启动带访问控制的 Mongodb 新建终端

mongod --auth --port 27017 --dbpath /data/db1

现在有两种方式进行用户身份的验证

第一种 (类似 MySql)

客户端连接时,指定用户名,密码,db名称

mongo --port 27017 -u "adminUser" -p "adminPass" --authenticationDatabase "admin"

第二种

客户端连接后,再进行验证

mongo --port 27017

use admin
db.auth("adminUser", "adminPass")

// 输出 1 表示验证成功

2.3 创建普通用户
过程类似创建管理员账户,只是 role 有所不同
use foo

db.createUser(
  {
    user: "simpleUser",
    pwd: "simplePass",
    roles: [ { role: "readWrite", db: "foo" },
             { role: "read", db: "bar" } ]
  }
)
现在我们有了一个普通用户
用户名:simpleUser
密码:simplePass
权限:读写数据库 foo, 只读数据库 bar。
创建某个数据库的允许访问账号
mongo
use admin
db.getSiblingDB("spring_boot_test").createUser({"user" : "liang","pwd" : "hahaha", roles: [{"role" : "readWrite", "db" : "spring_boot_test"}]})

用这个账号登录

mongo  -u liang -password test2 -authenticationDatabase spring_boot_test 




注意
NOTE
WARN
use foo表示用户在 foo 库中创建,就一定要 foo 库验证身份,即用户的信息跟随随数据库。比如上述 simpleUser 虽然有 bar 库的读取权限,但是一定要先在 foo 库进行身份验证,直接访问会提示验证失败。

use foo
db.auth("simpleUser", "simplePass")

use bar
show collections
还有一点需要注意,如果 admin 库没有任何用户的话,即使在其他数据库中创建了用户,启用身份验证,默认的连接方式依然会有超级权限

2.4 内建角色

Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
2.5 URI 形式的访问
生产中常用 URI 形式对数据库进行连接

mongodb://your.db.ip.address:27017/foo
添加用户名密码验证

mongodb://simpleUser:[email protected]:27017/foo  

see also

MongoDB开启安全认证