MongoDB权限管理

5/19/2024 MongoDB

# 一 、背景知识

提供了一套全面的安全功能,包括用户认证、权限控制和访问管理。这意味着可以为不同的用户设置不同的访问权限,确保数据库的安全。

  • 开启访问认证
  • 网络限制
  • 创建用户
  • 访问授权

# 二、权限管理

  • 通过修改/etc/mongod.conf文件,并重启mongodb服务,可以开启mongodb的安全认证
    security:
      authorization: enabled
    
    1
    2
    sudo systemctl restart mongod.service
    
    1
  • 本地例外原则:
    • 即使开启了安全认证,只要没有在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
  • 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.conf
    
    1
    添加如下内容
    security:
      authorization: enabled
    
    1
    2
    保存退出后重启MongoDB服务
    sudo systemctl restart mongod.service
    
    1

# 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

连接上数据库后,通过show databases可以看到只显示了当前用户被授权的数据库traffic_system_logs
如果没有任何显示,也可能是因为traffic_system_logs中没有数据

show databases
1

# 4、添加用户管理员

如果此时希望新增一个数据库record,并由一个新用户recordManager来进行读写操作访问。
会发现在当前的logManager用户的权限下是无法完成的。可以使用本地例外原则或暂时关闭安全认证功能,通过mongo指令进入交互模式
这里为了保证生效,则通过暂时关闭安全认证的方式:

  • 注释掉相/etc/mongod.conf中的关配置

    # security:
      # authorization: enabled
    
    1
    2
  • 重启服务

    sudo systemctl restart mongod.service
    
    1
  • 连接MongoDB

    mongo
    
    1
  • 进入到交互模式后,用show databases确认当前的权限

    show databases
    
    1

    如果看到了admin数据库则说明当前具备访问权限:

    admin                0.000GB
    config               0.000GB
    local                0.000GB
    
    1
    2
    3
  • 切换到admin数据库,并添加用户管理员

    db.createUser({
      user: "adminUser",
      pwd: "adminUserPassword",
      roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
    })
    
    1
    2
    3
    4
    5
    • userAdminAnyDatabase: 具备在所有数据库上管理用户和角色的权限。
    • userAdminAnyDatabase只能指向admin数据库,因此只能配置db:"admin"
  • 退出交互模式后,重新启用安全认证,再使用刚才创建的管理员身份连接mongodb后则可以顺利创建新的用户

5、其它role 用户管理角色除了前文使用到的userAdminAnyDatabase,还有userAdmin, 它需要指定管理的目标数据库,用于管理特定的数据库中的用户

  • dbAdminAnyDatabase: 所有的数据库进行管理(索引、集合等)
  • dbAdmin: 指定数据库进行管理(索引、集合)
  • readAnyDatabase和read: 所有/指定数据库的读操作
  • readWriteAnyDatabase和readWrite: 所有/指定数据的读写操作
  • root: 超级用户,拥有所有权限
    use admin
    db.createUser({
      user: "superAdmin",
      pwd: "yourPassword",
      roles: ["root"]
    })
    
    1
    2
    3
    4
    5
    6
    PS: 为了安全起见,通常遵循最小权限原则,尽量避免创建root用户,只授予用户执行其工作所必需的最小权限集
Last Updated: 5/22/2024, 12:12:28 PM