mongdb安全认证详解

认证

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        

你可能感兴趣的:(数据库,安全,oracle,数据库)