# 八、MongoDB 数据安全
# 1. 数据库认证
# 1.1 创建用户
连接 MongoDB Shell
docker exec -it mymongo mongo
进入到 admin 数据库
use admin
创建用户
db.createUser( { user: "hedon", pwd: "hedonPwd", roles: ["userAdminAnyDatabase"] } )
user
: 用户名pwd
: 密码roles
: 用户角色,userAdminAnyDatabase: 授权在所有的数据库上管理 User 的权限,只在 admin 中可用
输出:
Successfully added user: { "user" : "hedon", "roles" : [ "userAdminAnyDatabase" ] }
# 1.2 用户登录
删除之前的 mongodb 容器
docker stop mymongo && docker rm $_
重启 mongod 进程,指定需要认证
docker run --name mymongo -v $HOME/mymongo/data:/data/db -p 27017:27017 -d mongo:4 --auth --port 27017
--auth
: 指定需要认证才能访问使用用户登录 mongodb
docker exec -it mymongo mongo -u "hedon" -p "hedonPwd" --authenticationDatabase "admin"
-u
: 用户名-p
: 密码--authenticationDatabse
: 指定使用哪个数据库来验证身份补充
也可以直接使用 mongo 连接数据库,然后到 mongo shell 里面再用 db.auth("username", "password") 来验证。
切换到 test 数据库
use test
尝试插入数据
db.hedon.insertOne({"name": "hedon"})
会报错说没有权限,因为我们授予 hedon 的角色是 userAdminAnyDatabase,该角色只能在所有的数据库上管理 User 的权限,其他权限它不具有。
uncaught exception: WriteCommandError({ "ok" : 0, "errmsg" : "not authorized on test to execute command { insert: \"hedon\", ordered: true, lsid: { id: UUID(\"82bc0936-50b8-419a-8856-a2b68316a8a1\") }, $db: \"test\" }", "code" : 13, "codeName" : "Unauthorized" }) :
# 2. 数据库授权
# 2.1 内建角色
数据库用户角色:
- read: 只读角色
- readWrite: 读/写角色
数据库管理角色:
- dbAdmin: 在当前的数据库中执行管理操作,如索引的创建、删除、统计、查看等
- dbOwner: 在当前的数据库中执行任意操作,增、删、改、查等
- userAdmin: 在当前的数据库中管理User,创建、删除和管理用户
备份与还原角色:
- Backup
- restore
跨库角色:
- readAnyDatabase: 授权在所有的数据库上读取数据的权限,只在 admin 中可用
- readWriteAnyDatebase: 授权在所有的数据库上读写数据的权限,只在 admin 中可用
- userAdminAnyDatabase: 授权在所有的数据库上管理 User 的权限,只在 admin 中可用
- dbAdminAnyDatabase: 授权管理所有数据库的权限,只在 admin 中可用
集群管理角色:
- clusterAdmin: 授权管理集群的最高权限,只在 admin 中可用
- clusterManager: 授权管理和监控集群的权限
- clusterMonitor: 授权监控集群的权限,对监控工具具有 readonly 的权限
- hostManager: 管理 Server
超级角色:
- root: 超级账户和权限,只在 admin 中可用
示例:创建一个只能读取 test 数据库的用户
切换到 test 数据库
use test
创建用户
db.createUser( { user: "testReader", pwd: "password", roles: [ {role: "read", db: "test"} ] } )
输出:
Successfully added user: { "user" : "testReader", "roles" : [ { "role" : "read", "db" : "test" } ] }
# 2.2 自定义角色
切换到 test 数据库
use test
使用
db.createRole()
创建一个只能读取 accounts 集合的角色db.createRole( { role: "readAccounts", privileges: [ { resource: {db: "test", collection: "accounts"}, actions: ["find"] } ], roles: [] } )
role
: 给自定义角色起名字privileges
: 角色权限信息:在哪里能做什么事resouce
: 在哪里db
: 数据库collection
: 集合
actions
: 能做什么事
roles
: 继承现有角色