认证
MongoDB安全认证
简介
MongoDB 默认是没有账号的,可以直接连接,无须身份验证,但实际项目中肯定是要权限验证的,否则后果不堪设想
认证相关操作
docker以auth方式创建MongoDB容器
docker run -itd --name mongo5 -p 27017:27017 mongo:xxx --auth
备份数据
mongodump -h 127.0.0.1:27017 -d mydb -o /usr/local
恢复数据(在用户认证之后)
mongorestore -h localhost -u root -p 123456 --db mydb /dump/mydb --authenticationDatabase admin
基于角色的访问控制相关知识
给用户分配对应数据库的角色
注意:角色为mongdb中固定的不可改
use admin;
db.createUser( { user: "账号", pwd: "密码", roles: [ { role: "角色", db: "数据库" }, { role: "角色", db: "数据库" } ] } )
用户命令
修改密码
db.changeUserPassword( '账号' , '密码' );
添加角色
db.grantRolesToUser('用户名',[{ role:'角色名', db:'数据库名'}])
删除用户
db.dropUser("用户名")
验证用户【返回 1 说明认证成功】
db.auth("账号","密码")
内置角色
root 超级账号,超级权限
read 允许用户读取指定数据库
readwrite 允许用户读写指定数据库
dbAdmin 可以读取任何数据库并对库进行清理、修改、压缩,获取统计信息、执行检查等操作
userAdmin 可以在指定数据库里创建、删除和管理用户
readAnyDatabase 可以读取任何数据库中的数据,除了数据库config和local之外
readwriteAnyDatabase 可以读写任何数据库中的数据,除了数据库config和local之外
userAdminAnyDatabase 可以在指定的数据库中创建和修改用户,除了数据库config和local之外
dbAdminAnyDatabase 可以读取任何数据库并对库进行清理、修改、压缩,获取统计信息、执行检查等操作,除了数据库config和local之外
backup 备份数据权限
restore 从备份中恢复数据的权限
mongdb中用户默认对应的角色
数据库用户 read、readwrite
数据库管理角色 dbAdmin、userAdmin
所有数据库角色 readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、 dbAdminAnyDatabase
备份恢复角色 backup、restore
超级用户角色 root
管理员
创建管理员
MongoDB 服务端开启安全检查之前,至少需要有一个管理员账号,admin 数据库中的用户都被视为管理员
如果 admin 库没有任何用户的话,即使在其他数据库中创建了用户,启用身份验证,
默认的连接方式依然会有超级权限,即仍然可以不验证账号密码照样能进行 CRUD,安全认证相当于无效
进入容器
docker exec -it mongo bash
进入终端
mongo
进入admin数据库
use admin
创建管理员账户
db.createUser({ user: "root", pwd: "xx", roles: [{ role: "root", db: "admin" }] })
验证用户添加是否成功
db.auth("root", "xx");
如果返回1,则表示成功
管理员登录
客户端管理员以root用户登录,安全认证通过后,拥有对所有数据库的所有权限
进入容器
docker exec -it mongo bash
进入终端
mongo
以管理员身份登录
use admin
switched to db admin
db.auth("root","xx")
普通用户
创建普通用户
创建mydb数据库并创建两个用户,zhangsan 拥有读写权限,lisi 拥有只读权限测试这两个账户的权限。以超级管理员登录测试权限
> use mydb
switched to db mydb
> db.c1.insert({name:"testdb1"})
WriteResult({ "nInserted" : 1 })
> db.c2.insert({name:"testdb1"})
WriteResult({ "nInserted" : 1 })
> show tables
c1
c2
> db.c1.find()
{ "_id" : ObjectId("62a00e5c1eb2c6ab85dd5eec"), "name" : "testdb1" }
> db.c1.find({})
{ "_id" : ObjectId("62a00e5c1eb2c6ab85dd5eec"), "name" : "testdb1" }
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
mydb 0.001GB
>
普通用户登录
普通用户现在仍然像以前一样进行登录,如下所示直接登录进入 mydb数据库中,登录是成功的,只是登录后日志少了很多东西,
而且执行 show dbs 命令,以及 show tables 等命令都是失败的,即使没有被安全认证的数据库,用户同样操作不了,
这都是因为权限不足,一句话:用户只能在自己权限范围内的数据库中进行操作
> db.auth("zhangsan","123456")
1
> show dbs
mydb 0.001GB
> show tables
c1
c2