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

4 阅读1分钟

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

数据库级别的访问控制

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

示例:数据库级别的访问控制

  1. 连接到 MongoDB 实例:

    mongo
    
  2. 切换到 admin 数据库:

    use admin
    
  3. 创建数据库用户:

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

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

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

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

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

    mongo -u "dbUser" -p "dbPassword" --authenticationDatabase "testdb"
    

    在 MongoDB Shell 中:

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

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

集合级别的访问控制

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

示例:集合级别的访问控制

  1. 连接到 MongoDB 实例:

    mongo
    
  2. 切换到 admin 数据库:

    use admin
    
  3. 创建自定义角色:

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

    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 集合的 findinsert 操作权限。
    • testdb 数据库中 collection2 集合的 updateremove 操作权限。
  4. 创建用户并赋予集合级别权限:

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

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

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

    mongo -u "collectionUser" -p "collectionPassword" --authenticationDatabase "testdb"
    

    在 MongoDB Shell 中:

    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 仅对 collection1collection2 集合具有特定的操作权限,而其他集合则没有权限。

总结

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

#!/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 中设置数据库级别和集合级别的访问控制,确保用户只能访问和操作他们被授权的数据库和集合。