MongoDB(74)什么是数据库级别和集合级别的访问控制?

数据库级别和集合级别的访问控制是 MongoDB 中控制用户权限和访问的两种主要方法。通过这些控制,管理员可以细粒度地管理用户对数据库和集合的访问权限,确保数据的安全性和操作的规范性。

数据库级别的访问控制

数据库级别的访问控制是指用户对整个数据库的权限控制。这种权限控制应用于数据库中的所有集合。

示例:数据库级别的访问控制
  1. 连接到 MongoDB 实例:

    bash 复制代码
    mongo
  2. 切换到 admin 数据库:

    javascript 复制代码
    use admin
  3. 创建数据库用户:

    切换到目标数据库,例如 testdb,然后创建一个具有读写权限的用户:

    javascript 复制代码
    use testdb
    
    db.createUser({
      user: "dbUser",
      pwd: "dbPassword",
      roles: [
        { role: "readWrite", db: "testdb" }
      ]
    })

    上述代码为 testdb 数据库创建了一个用户 dbUser,该用户具有读写权限。

  4. 验证数据库级别权限:

    使用新创建的用户连接到 MongoDB,并尝试对 testdb 数据库进行操作:

    bash 复制代码
    mongo -u "dbUser" -p "dbPassword" --authenticationDatabase "testdb"

    在 MongoDB Shell 中:

    javascript 复制代码
    use testdb
    
    db.collection1.insert({ "key": "value" }) // 应该成功
    db.collection1.find()                     // 应该成功
    db.collection2.update({ "key": "value" }, { $set: { "key": "newValue" } }) // 应该成功

    用户 dbUser 在 testdb 数据库中具有对所有集合的读写权限。

集合级别的访问控制

集合级别的访问控制是指用户对特定集合的权限控制。这种权限控制应用于指定集合,而不影响数据库中的其他集合。

示例:集合级别的访问控制
  1. 连接到 MongoDB 实例:

    bash 复制代码
    mongo
  2. 切换到 admin 数据库:

    javascript 复制代码
    use admin
  3. 创建自定义角色:

    创建一个自定义角色,该角色具有对 testdb 数据库中某些集合的特定权限:

    javascript 复制代码
    db.createRole({
      role: "collectionRole",
      privileges: [
        { resource: { db: "testdb", collection: "collection1" }, actions: [ "find", "insert" ] },
        { resource: { db: "testdb", collection: "collection2" }, actions: [ "update", "remove" ] }
      ],
      roles: []
    })

    上述代码创建了一个角色 collectionRole,它具有:

    • 对 testdb 数据库中 collection1 集合的 find 和 insert 操作权限。
    • 对 testdb 数据库中 collection2 集合的 update 和 remove 操作权限。
  4. 创建用户并赋予集合级别权限:

    切换到目标数据库 testdb,然后创建一个用户并赋予自定义角色:

    javascript 复制代码
    use testdb
    
    db.createUser({
      user: "collectionUser",
      pwd: "collectionPassword",
      roles: [
        { role: "collectionRole", db: "testdb" }
      ]
    })
  5. 验证集合级别权限:

    使用新创建的用户连接到 MongoDB,并尝试对 testdb 数据库中的指定集合进行操作:

    bash 复制代码
    mongo -u "collectionUser" -p "collectionPassword" --authenticationDatabase "testdb"

    在 MongoDB Shell 中:

    javascript 复制代码
    use testdb
    
    // 对 collection1 的操作
    db.collection1.insert({ "key": "value" }) // 应该成功
    db.collection1.find()                     // 应该成功
    db.collection1.update({ "key": "value" }, { $set: { "key": "newValue" } }) // 应该失败
    db.collection1.remove({ "key": "value" }) // 应该失败
    
    // 对 collection2 的操作
    db.collection2.update({ "key": "value" }, { $set: { "key": "newValue" } }) // 应该成功
    db.collection2.remove({ "key": "newValue" }) // 应该成功
    db.collection2.find()                     // 应该失败
    db.collection2.insert({ "key": "value" }) // 应该失败

    用户 collectionUser 仅对 collection1 和 collection2 集合具有特定的操作权限,而其他集合则没有权限。

总结

通过数据库级别和集合级别的访问控制,MongoDB 可以灵活地管理用户权限,确保数据的安全性和操作的规范性。以下是一个完整示例脚本,展示了如何设置数据库级别和集合级别的访问控制:

bash 复制代码
#!/bin/bash

MONGO_HOST="localhost"
MONGO_PORT="27017"
ADMIN_USER="adminUser"
ADMIN_PASS="adminPassword"

# 管理员用户创建(如果尚未创建)
mongo --host $MONGO_HOST --port $MONGO_PORT admin <<EOF
db.createUser({
  user: "$ADMIN_USER",
  pwd: "$ADMIN_PASS",
  roles: [
    { role: "userAdminAnyDatabase", db: "admin" },
    { role: "readWriteAnyDatabase", db: "admin" }
  ]
})
EOF

# 启用身份验证(编辑 mongod.conf 并重启 MongoDB 服务)
# security:
#   authorization: enabled

# 创建数据库级别访问控制的用户
mongo --host $MONGO_HOST --port $MONGO_PORT -u "$ADMIN_USER" -p "$ADMIN_PASS" --authenticationDatabase "admin" testdb <<EOF
db.createUser({
  user: "dbUser",
  pwd: "dbPassword",
  roles: [
    { role: "readWrite", db: "testdb" }
  ]
})
EOF

# 创建集合级别访问控制的自定义角色和用户
mongo --host $MONGO_HOST --port $MONGO_PORT -u "$ADMIN_USER" -p "$ADMIN_PASS" --authenticationDatabase "admin" admin <<EOF
db.createRole({
  role: "collectionRole",
  privileges: [
    { resource: { db: "testdb", collection: "collection1" }, actions: [ "find", "insert" ] },
    { resource: { db: "testdb", collection: "collection2" }, actions: [ "update", "remove" ] }
  ],
  roles: []
})
EOF

# 为自定义角色创建用户并赋予权限
mongo --host $MONGO_HOST --port $MONGO_PORT -u "$ADMIN_USER" -p "$ADMIN_PASS" --authenticationDatabase "admin" testdb <<EOF
db.createUser({
  user: "collectionUser",
  pwd: "collectionPassword",
  roles: [
    { role: "collectionRole", db: "testdb" }
  ]
})
EOF

这个脚本展示了如何在 MongoDB 中设置数据库级别和集合级别的访问控制,确保用户只能访问和操作他们被授权的数据库和集合。

相关推荐
茶栀(*´I`*)6 分钟前
SQL 性能分析:从慢查询日志到执行计划的完整定位方法
数据库·sql
艺杯羹36 分钟前
1Panel 装好后 ufw 仍是 inactive:一次服务器安全盲区复盘
服务器·数据库·安全·网络安全·系统架构·实战·1panel
code2cat2 小时前
【随笔】MCP工具重试:任务已经创建,响应丢了怎么办
数据库·mcp
wuyk5553 小时前
Spider-第10讲-SQLite持久化与去重
数据库·爬虫·sqlite
乌暮5 小时前
Spring AOP 与 Spring 事务:用大白话彻底理解原理与实践
java·数据库·spring boot·后端·sql·学习·spring
小此方5 小时前
Re:Mysql数据库基础篇(十二):什么是事务、事务解决了什么问题、事务的四大属性、事务的操作方式
数据库·mysql
flash俊杰7 小时前
v0.5-01 让桌面 AI 助手记得住:预算组装、递归摘要、长期记忆与评估基线
数据库·安全·架构
2501_933923257 小时前
redis:string类型常见命令
数据库·redis·缓存
byte轻骑兵8 小时前
时序数据库选型指南:Apache IoTDB 社区版实践与踩坑
数据库·人工智能·apache·时序数据库·iotdb
黄连木笛9 小时前
Redis Insight 汉化教程:Windows / macOS / Linux 设置中文界面(附繁體、教程汉化、关闭自动更新)
数据库·redis·缓存