MongoDB安全认证
跳到导航
跳到搜索
目录
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