MongoDB安全配置与权限管理
1. MongoDB 安全概述
MongoDB 是一个流行的 NoSQL 数据库,在生产环境中使用时,确保其安全性至关重要。安全性涵盖多个方面,包括网络访问控制、身份验证、授权以及数据加密等。
1.1 网络访问控制
MongoDB 默认监听在本地回环地址(127.0.0.1),这意味着只有本地进程能够访问数据库。如果需要远程访问,需要修改配置文件,将监听地址设置为服务器的公网 IP 或 0.0.0.0。但这样做会带来安全风险,因为任何能够访问服务器网络的用户都可以尝试连接 MongoDB。
为了限制网络访问,可以结合服务器的防火墙(如 iptables 或 ufw)来只允许特定的 IP 地址或 IP 段访问 MongoDB 的端口(默认 27017)。
例如,使用 ufw 防火墙允许 192.168.1.0/24 网段的 IP 访问 MongoDB:
sudo ufw allow from 192.168.1.0/24 to any port 27017
1.2 身份验证
身份验证是 MongoDB 安全的核心部分,它确保只有授权的用户能够访问数据库。MongoDB 支持多种身份验证机制,包括 SCRAM - SHA - 1、SCRAM - SHA - 256 等。
2. 启用身份验证
要在 MongoDB 中启用身份验证,需要进行以下几个步骤:
2.1 创建管理员用户
在未启用身份验证的情况下启动 MongoDB 服务。可以通过修改配置文件 /etc/mongod.conf
,注释掉 security.authorization
这一行,或者将其设置为 disabled
。
然后启动 MongoDB 客户端并连接到数据库:
mongo
在 MongoDB 客户端中,切换到 admin
数据库:
use admin
创建管理员用户,例如:
db.createUser({
user: "adminUser",
pwd: "adminPassword",
roles: [ { role: "root", db: "admin" } ]
});
这里创建了一个名为 adminUser
的用户,密码为 adminPassword
,并赋予了 root
角色,该角色在 admin
数据库中拥有最高权限。
2.2 启用身份验证
创建管理员用户后,修改 mongod.conf
文件,将 security.authorization
设置为 enabled
:
security:
authorization: enabled
保存并关闭文件,然后重启 MongoDB 服务:
sudo systemctl restart mongod
此时,当尝试连接 MongoDB 时,如果没有提供有效的身份验证信息,将会收到权限不足的错误。
3. 连接 MongoDB 时进行身份验证
连接 MongoDB 时,可以通过多种方式提供身份验证信息。
3.1 在命令行中提供
mongo -u "adminUser" -p "adminPassword" --authenticationDatabase "admin"
这里 -u
选项指定用户名,-p
选项指定密码,--authenticationDatabase
选项指定验证的数据库,对于管理员用户通常是 admin
数据库。
3.2 在 MongoDB 客户端中使用 db.auth()
连接到 MongoDB 后,也可以在客户端中进行身份验证:
mongo
use admin
db.auth("adminUser", "adminPassword")
如果身份验证成功,db.auth()
方法将返回 1。
4. 权限管理
MongoDB 的权限管理基于角色和用户。角色定义了一组操作权限,而用户被分配一个或多个角色来获得相应的权限。
4.1 内置角色
MongoDB 提供了许多内置角色,分为不同的类别:
数据库用户角色:
read
:允许用户读取指定数据库的内容。readWrite
:允许用户读取和写入指定数据库的内容。
数据库管理角色:
dbAdmin
:允许用户执行数据库管理操作,如创建和删除集合、索引等,但不包括用户管理。userAdmin
:允许用户管理指定数据库的用户和角色。dbOwner
:结合了readWrite
、dbAdmin
和userAdmin
的权限,对指定数据库拥有完全控制权。
集群管理角色:
clusterAdmin
:允许用户执行集群管理操作,如管理复制集、分片集群等。clusterManager
:允许用户执行部分集群管理操作,如查看集群状态。clusterMonitor
:允许用户查看集群监控信息。
超级用户角色:
root
:在admin
数据库中拥有所有权限,包括集群管理和对所有数据库的完全控制权。
4.2 创建自定义角色
除了使用内置角色,还可以创建自定义角色以满足特定的权限需求。
例如,创建一个只允许读取特定集合的角色:
use admin
db.createRole({
role: "customReadOnlyRole",
privileges: [
{
resource: { db: "myDB", collection: "myCollection" },
actions: [ "find" ]
}
],
roles: []
});
这里创建了一个名为 customReadOnlyRole
的角色,该角色仅对 myDB
数据库中的 myCollection
集合有 find
操作权限。
4.3 创建用户并分配角色
创建用户并分配角色可以使用 db.createUser()
方法。例如,创建一个用户并分配前面创建的自定义角色:
use myDB
db.createUser({
user: "customUser",
pwd: "customPassword",
roles: [ { role: "customReadOnlyRole", db: "myDB" } ]
});
这样,customUser
用户就只能读取 myDB
数据库中的 myCollection
集合。
5. 数据加密
MongoDB 支持在传输和存储过程中对数据进行加密,以进一步提高安全性。
5.1 传输加密(TLS/SSL)
要启用传输加密,需要获取 SSL/TLS 证书和私钥。可以使用 OpenSSL 生成自签名证书,也可以从证书颁发机构(CA)获取证书。
假设已经有了证书文件(cert.pem
)和私钥文件(key.pem
),修改 mongod.conf
文件,添加以下配置:
net:
tls:
mode: requireTLS
certificateKeyFile: /path/to/cert.pem
重启 MongoDB 服务,此时 MongoDB 将只接受通过 TLS 加密连接的客户端请求。
在连接客户端时,也需要提供证书:
mongo --tls --tlsCertificateKeyFile /path/to/client.pem
5.2 存储加密(WiredTiger 引擎加密)
MongoDB 使用 WiredTiger 存储引擎时,可以启用存储加密。首先,生成加密密钥:
openssl rand -base64 96 > /path/to/encryption.key
chmod 600 /path/to/encryption.key
然后修改 mongod.conf
文件,添加存储加密配置:
storage:
wiredTiger:
engineConfig:
encryption:
keyFile: /path/to/encryption.key
algorithm: AES256 - CBC
重启 MongoDB 服务后,数据将在存储时进行加密。
6. 审计
MongoDB 提供了审计功能,可以记录数据库的操作日志,以便进行安全审计和故障排查。
6.1 启用审计
修改 mongod.conf
文件,添加审计配置:
security:
auditLog:
destination: file
path: /var/log/mongodb/audit.log
format: JSON
filter: {
atype: { $in: [ "command", "connection" ] }
}
这里配置了审计日志输出到 /var/log/mongodb/audit.log
文件,格式为 JSON,并且只记录 command
和 connection
类型的操作。
重启 MongoDB 服务后,审计功能将开始记录相关操作。
6.2 审计日志分析
审计日志以 JSON 格式记录,每行代表一个操作。例如,一个连接操作的日志记录可能如下:
{
"atype": "connection",
"ts": {
"$date": "2023 - 10 - 01T12:00:00Z"
},
"remote": "192.168.1.100:55555",
"local": "192.168.1.1:27017",
"connectionId": 100,
"client": {
"application": {
"name": "MongoDB Shell"
},
"driver": {
"name": "MongoDB Internal Client",
"version": "4.4.0"
},
"os": {
"type": "Linux",
"name": "Ubuntu",
"architecture": "x86_64",
"version": "20.04"
}
}
}
通过分析这些日志,可以了解数据库的连接情况、用户执行的命令等信息,有助于发现潜在的安全问题。
7. 安全最佳实践
- 定期更新 MongoDB:及时获取安全补丁和新功能,以应对已知的安全漏洞。
- 最小权限原则:为用户分配满足其工作所需的最小权限,避免过度授权。
- 强密码策略:要求用户使用强密码,并定期更换密码。
- 监控和审计:持续监控数据库的活动,通过审计日志及时发现异常行为。
- 数据备份加密:对备份数据进行加密,防止数据泄露。
通过以上安全配置与权限管理措施,可以有效提高 MongoDB 数据库的安全性,保护数据的机密性、完整性和可用性。在实际应用中,应根据具体的业务需求和安全要求,灵活组合和配置这些安全特性。