MongoDB权限管理
qinsz 5/19/2024 MongoDB
# 一 、背景知识
提供了一套全面的安全功能,包括用户认证、权限控制和访问管理。这意味着可以为不同的用户设置不同的访问权限,确保数据库的安全。
- 开启访问认证
- 网络限制
- 创建用户
- 访问授权
# 二、权限管理
- 通过修改
/etc/mongod.conf文件,并重启mongodb服务,可以开启mongodb的安全认证security: authorization: enabled1
2sudo systemctl restart mongod.service1 - 本地例外原则:
- 即使开启了安全认证,只要没有在
admin数据库中创建用户,MongoDB允许从本地的连接进行无认证的访问,并拥有全部权限 - 如果开启了安全认证,在
admin中创建过(即使创建后被删除),那么即使通过mongo指令连接到mongodb后也没有任何权限 - 如果失去了本地例外原则,那么可以注释掉
/etc/mongod.conf中的安全认证配置,然后重启mongodb服务,再使用mongo指令连接到数据库创建管理员用户
- 即使开启了安全认证,只要没有在
# 0、连接mongodb
确保/etc/mongod.conf中的security配置项未启用。然后使用mongo指令连接到MongoDB
mongo
1
# 1、创建用户
用户必须属于属于某个数据库。现在我们创建一个属于traffic_system_logs数据库的用户,并赋予他读写数据的权限
use traffic_system_logs
db.createUser({
user: "logManager",
pwd: "yourPassword",
roles: [
{ role: "readWrite", db: "traffic_system_logs" }
]
})
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
use traffic_system_logs: 切换到traffic_system_logs数据库(如果不存在则会自动创建)db.createUser: 在创建用户user: 用户名pwd: 密码roles: 权限角色,可以有多个:role: 这里赋予了readWrite(读写)权限db: 指定权限角色role所作用的数据库
# 2、开启安全认证
- 通过
exit指令退出MongoDB的交互模式。然后修改/etc/mongod.conf文件:添加如下内容sudo vim /etc/mongod.conf1保存退出后重启MongoDB服务security: authorization: enabled1
2sudo systemctl restart mongod.service1
# 3、通过用户名密码连接mongodb
mongo -u logManager -p yourPassword --authenticationDatabase traffic_system_logs
1
-u: 用户名-p: 密码--authenticationDatabase: 用户所在的数据库
如果是连接其它主机,完整的连接指令格式如下:
mongo \
--host [IP地址] \
--port [端口号]\
--u [用户名] \
--p [密码] \
--authenticationDatabase [数据库名]
1
2
3
4
5
6
2
3
4
5
6
连接上数据库后,通过show databases可以看到只显示了当前用户被授权的数据库traffic_system_logs
如果没有任何显示,也可能是因为traffic_system_logs中没有数据
show databases
1
# 4、添加用户管理员
如果此时希望新增一个数据库record,并由一个新用户recordManager来进行读写操作访问。
会发现在当前的logManager用户的权限下是无法完成的。可以使用本地例外原则或暂时关闭安全认证功能,通过mongo指令进入交互模式
这里为了保证生效,则通过暂时关闭安全认证的方式:
注释掉相
/etc/mongod.conf中的关配置# security: # authorization: enabled1
2重启服务
sudo systemctl restart mongod.service1连接MongoDB
mongo1进入到交互模式后,用
show databases确认当前的权限show databases1如果看到了
admin数据库则说明当前具备访问权限:admin 0.000GB config 0.000GB local 0.000GB1
2
3切换到admin数据库,并添加用户管理员
db.createUser({ user: "adminUser", pwd: "adminUserPassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })1
2
3
4
5userAdminAnyDatabase: 具备在所有数据库上管理用户和角色的权限。userAdminAnyDatabase只能指向admin数据库,因此只能配置db:"admin"
退出交互模式后,重新启用安全认证,再使用刚才创建的管理员身份连接mongodb后则可以顺利创建新的用户
5、其它role
用户管理角色除了前文使用到的userAdminAnyDatabase,还有userAdmin, 它需要指定管理的目标数据库,用于管理特定的数据库中的用户
- dbAdminAnyDatabase: 所有的数据库进行管理(索引、集合等)
- dbAdmin: 指定数据库进行管理(索引、集合)
- readAnyDatabase和read: 所有/指定数据库的读操作
- readWriteAnyDatabase和readWrite: 所有/指定数据的读写操作
- root: 超级用户,拥有所有权限PS: 为了安全起见,通常遵循最小权限原则,尽量避免创建root用户,只授予用户执行其工作所必需的最小权限集
use admin db.createUser({ user: "superAdmin", pwd: "yourPassword", roles: ["root"] })1
2
3
4
5
6