Skip to content

用户权限

MongoDB提供了完善的用户认证和授权机制,本章将介绍如何管理用户、配置权限以及保障数据库安全。

安全概述

MongoDB安全机制

javascript
// MongoDB的安全机制包括:

// 1. 认证(Authentication)
//    验证用户身份,确认用户是谁

// 2. 授权(Authorization)
//    确定用户可以执行什么操作

// 3. 加密
//    - 传输加密:TLS/SSL
//    - 存储加密:WiredTiger加密

// 4. 审计
//    记录数据库操作日志

// 安全配置清单:
// - 启用认证
// - 创建管理员用户
// - 使用强密码
// - 启用TLS/SSL
// - 配置网络访问控制
// - 定期更新MongoDB版本

启用认证

创建管理员用户

javascript
// 首先创建管理员用户(在启用认证之前)

// 连接到MongoDB
mongosh

// 切换到admin数据库
use admin

// 创建管理员用户
db.createUser({
    user: "admin",              // 用户名
    pwd: "yourStrongPassword123",  // 密码(请使用强密码)
    roles: [
        { role: "userAdminAnyDatabase", db: "admin" },  // 管理所有数据库的用户
        { role: "readWriteAnyDatabase", db: "admin" },  // 读写所有数据库
        { role: "dbAdminAnyDatabase", db: "admin" },    // 管理所有数据库
        { role: "clusterAdmin", db: "admin" }           // 集群管理
    ]
})

// 输出:{ ok: 1 }

启用认证配置

yaml
# 在mongod.conf中启用认证

# 安全配置
security:
  authorization: enabled  # 启用认证

# 如果使用复制集或分片,还需要配置keyFile
# security:
#   authorization: enabled
#   keyFile: /path/to/keyfile
bash
# 重启MongoDB服务
sudo systemctl restart mongod

# 使用认证连接MongoDB
mongosh -u admin -p --authenticationDatabase admin
# 或使用连接字符串
mongosh "mongodb://admin:password@localhost:27017/admin"

用户管理

创建用户

javascript
// 为特定数据库创建用户

// 切换到目标数据库
use mydb

// 创建读写用户
db.createUser({
    user: "appuser",
    pwd: "password123",
    roles: [
        { role: "readWrite", db: "mydb" }
    ]
})

// 创建只读用户
db.createUser({
    user: "readonly",
    pwd: "password123",
    roles: [
        { role: "read", db: "mydb" }
    ]
})

// 创建带有自定义角色的用户
db.createUser({
    user: "reportuser",
    pwd: "password123",
    roles: [
        { role: "read", db: "mydb" },
        { role: "read", db: "logs" }
    ]
})

// 创建管理员用户(管理特定数据库)
db.createUser({
    user: "dbadmin",
    pwd: "password123",
    roles: [
        { role: "dbAdmin", db: "mydb" },
        { role: "readWrite", db: "mydb" }
    ]
})

查看用户

javascript
// 查看当前数据库的用户
db.getUsers()

// 查看所有用户(需要管理员权限)
use admin
db.system.users.find().pretty()

// 查看特定用户
db.getUser("appuser")

// 查看当前登录用户
db.runCommand({ connectionStatus: 1 })

修改用户

javascript
// 修改用户密码
db.changeUserPassword("appuser", "newPassword123")

// 更新用户角色
db.updateUser("appuser", {
    roles: [
        { role: "readWrite", db: "mydb" },
        { role: "read", db: "logs" }  // 添加新的角色
    ]
})

// 添加角色(不覆盖现有角色)
db.grantRolesToUser("appuser", [
    { role: "read", db: "reports" }
])

// 移除角色
db.revokeRolesFromUser("appuser", [
    { role: "read", db: "reports" }
])

删除用户

javascript
// 删除用户
db.dropUser("appuser")

// 删除当前数据库的所有用户
db.dropAllUsers()

内置角色

数据库角色

javascript
// 数据库用户角色
// - read:读取数据
// - readWrite:读写数据

// 数据库管理角色
// - dbAdmin:数据库管理
// - dbOwner:数据库所有者(包含readWrite + dbAdmin)
// - userAdmin:用户管理

// 示例:read角色的权限
// - find, aggregate, count, distinct等读操作
// - 不能执行写操作

// 示例:readWrite角色的权限
// - read角色的所有权限
// - insert, update, delete等写操作
// - createIndex, dropIndex等索引操作

// 示例:dbAdmin角色的权限
// - clean, compact, repairDatabase等维护操作
// - createCollection, dropCollection等集合操作
// - createIndex, dropIndex等索引操作
// - stats, validate等统计操作

集群角色

javascript
// 集群管理角色(在admin数据库中)

// - clusterAdmin:集群管理员(最高权限)
// - clusterManager:集群管理
// - clusterMonitor:集群监控
// - hostManager:主机管理

// 创建集群管理员
use admin
db.createUser({
    user: "clusteradmin",
    pwd: "password123",
    roles: [
        { role: "clusterAdmin", db: "admin" }
    ]
})

备份恢复角色

javascript
// 备份恢复角色(在admin数据库中)

// - backup:备份数据
// - restore:恢复数据

// 创建备份用户
use admin
db.createUser({
    user: "backupuser",
    pwd: "password123",
    roles: [
        { role: "backup", db: "admin" },
        { role: "restore", db: "admin" }
    ]
})

所有数据库角色

javascript
// 所有数据库角色(在admin数据库中)

// - readAnyDatabase:读取任意数据库
// - readWriteAnyDatabase:读写任意数据库
// - userAdminAnyDatabase:管理任意数据库的用户
// - dbAdminAnyDatabase:管理任意数据库

// 创建超级用户
use admin
db.createUser({
    user: "superuser",
    pwd: "password123",
    roles: [
        { role: "root", db: "admin" }  // root角色拥有所有权限
    ]
})

自定义角色

创建自定义角色

javascript
// 创建自定义角色

use admin

// 创建只读特定集合的角色
db.createRole({
    role: "readOrders",
    privileges: [
        {
            resource: { db: "mydb", collection: "orders" },
            actions: ["find", "count", "aggregate"]
        }
    ],
    roles: []  // 不继承其他角色
})

// 创建带有多个权限的角色
db.createRole({
    role: "orderManager",
    privileges: [
        {
            resource: { db: "mydb", collection: "orders" },
            actions: ["find", "insert", "update", "remove"]
        },
        {
            resource: { db: "mydb", collection: "order_logs" },
            actions: ["find", "insert"]
        }
    ],
    roles: []
})

// 创建继承其他角色的角色
db.createRole({
    role: "mydbAdmin",
    privileges: [],
    roles: [
        { role: "readWrite", db: "mydb" },
        { role: "dbAdmin", db: "mydb" }
    ]
})

管理自定义角色

javascript
// 查看角色
db.getRoles()

// 查看特定角色
db.getRole("readOrders", { showPrivileges: true })

// 更新角色
db.updateRole("readOrders", {
    privileges: [
        {
            resource: { db: "mydb", collection: "orders" },
            actions: ["find", "count", "aggregate", "distinct"]
        }
    ],
    roles: []
})

// 添加权限
db.grantPrivilegesToRole("readOrders", [
    {
        resource: { db: "mydb", collection: "products" },
        actions: ["find"]
    }
])

// 移除权限
db.revokePrivilegesFromRole("readOrders", [
    {
        resource: { db: "mydb", collection: "products" },
        actions: ["find"]
    }
])

// 删除角色
db.dropRole("readOrders")

权限操作

常用权限操作

javascript
// 常用权限操作列表

// 查询操作
// - find:查询文档
// - count:计数
// - aggregate:聚合
// - distinct:去重

// 写入操作
// - insert:插入文档
// - update:更新文档
// - remove:删除文档

// 索引操作
// - createIndex:创建索引
// - dropIndex:删除索引

// 集合操作
// - createCollection:创建集合
// - dropCollection:删除集合

// 数据库操作
// - dropDatabase:删除数据库

// 用户管理操作
// - createUser:创建用户
// - dropUser:删除用户
// - grantRole:授予角色
// - revokeRole:撤销角色

权限资源

javascript
// 权限资源定义

// 指定数据库和集合
{ db: "mydb", collection: "orders" }

// 指定数据库的所有集合
{ db: "mydb", collection: "" }

// 所有数据库的所有集合
{ db: "", collection: "" }

// 指定集合(所有数据库)
{ db: "", collection: "orders" }

// 集群资源
{ cluster: true }

认证方法

SCRAM认证

javascript
// SCRAM(Salted Challenge Response Authentication Mechanism)
// MongoDB默认的认证机制

// 创建SCRAM用户
db.createUser({
    user: "scramuser",
    pwd: "password123",
    mechanisms: ["SCRAM-SHA-256"],  // 指定认证机制
    roles: [{ role: "readWrite", db: "mydb" }]
})

// 查看用户的认证机制
db.getUser("scramuser").mechanisms

x.509证书认证

javascript
// x.509证书认证(企业版功能)

// 配置mongod.conf
// security:
//   clusterAuthMode: x509
// net:
//   tls:
//     mode: requireTLS
//     certificateKeyFile: /path/to/server.pem
//     CAFile: /path/to/ca.pem

// 创建x.509用户
db.getSiblingDB("$external").createUser({
    user: "CN=user,OU=dept,O=company,C=CN",  // 证书主题
    roles: [
        { role: "readWrite", db: "mydb" }
    ]
})

// 使用证书连接
mongosh --tls \
  --tlsCAFile /path/to/ca.pem \
  --tlsCertificateKeyFile /path/to/client.pem \
  --authenticationDatabase '$external' \
  --authenticationMechanism MONGODB-X509

本章小结

本章介绍了MongoDB用户权限管理的相关知识:

  1. 安全概述:理解MongoDB的安全机制
  2. 启用认证:学会创建管理员用户和启用认证
  3. 用户管理:掌握创建、查看、修改、删除用户的操作
  4. 内置角色:了解各种内置角色的权限范围
  5. 自定义角色:学会创建和管理自定义角色
  6. 认证方法:了解SCRAM和x.509认证机制

下一章,我们将学习备份恢复,了解如何备份和恢复MongoDB数据。