Appearance
用户权限
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/keyfilebash
# 重启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").mechanismsx.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用户权限管理的相关知识:
- 安全概述:理解MongoDB的安全机制
- 启用认证:学会创建管理员用户和启用认证
- 用户管理:掌握创建、查看、修改、删除用户的操作
- 内置角色:了解各种内置角色的权限范围
- 自定义角色:学会创建和管理自定义角色
- 认证方法:了解SCRAM和x.509认证机制
下一章,我们将学习备份恢复,了解如何备份和恢复MongoDB数据。
