MongoDB分片集群安全性配置
MongoDB 分片集群安全性配置概述
在 MongoDB 分片集群环境中,安全性至关重要。它不仅关乎数据的保密性、完整性,还涉及到整个集群的可用性和稳定性。配置 MongoDB 分片集群的安全性,主要涵盖身份验证、授权、网络访问控制以及加密等多个方面。
身份验证
身份验证是确保只有授权用户能够访问 MongoDB 分片集群的第一道防线。MongoDB 支持多种身份验证机制,如 SCRAM - SHA - 1、SCRAM - SHA - 256 等。
创建用户
在启用身份验证之前,需要先创建用户。可以通过 MongoDB 的 mongo
shell 来完成这一操作。以下是创建一个具有管理权限用户的示例代码:
use admin
db.createUser(
{
user: "adminUser",
pwd: "password123",
roles: [ { role: "root", db: "admin" } ]
}
)
在上述代码中,我们使用 use admin
切换到 admin
数据库,因为管理用户通常创建在 admin
数据库中。然后通过 db.createUser
方法创建一个名为 adminUser
的用户,密码为 password123
,并赋予其 root
角色,该角色在 admin
数据库中拥有最高权限。
除了管理用户,还可以创建具有特定数据库读写权限的用户。例如,为 test
数据库创建一个读写用户:
use test
db.createUser(
{
user: "testUser",
pwd: "testPassword",
roles: [ { role: "readWrite", db: "test" } ]
}
)
这里创建的 testUser
用户对 test
数据库具有读写权限。
启用身份验证
在 MongoDB 配置文件(通常是 mongod.conf
)中启用身份验证。找到或添加以下配置项:
security:
authorization: enabled
保存配置文件后,重启 mongod
服务使配置生效。对于分片集群中的每个 mongod
实例(包括 mongos
路由节点和分片节点)都需要进行这样的配置。
授权
授权是在身份验证之后,决定已认证用户可以执行哪些操作的机制。MongoDB 使用基于角色的访问控制(RBAC)来管理授权。
内置角色
MongoDB 提供了一系列内置角色,如 read
、readWrite
、dbAdmin
、userAdmin
等。read
角色允许用户读取指定数据库中的数据,readWrite
角色除了读取还允许写入数据,dbAdmin
角色可以执行数据库管理操作,userAdmin
角色则用于管理数据库用户。
例如,如果要为某个用户赋予对 myDB
数据库的读取权限,可以这样创建用户:
use myDB
db.createUser(
{
user: "readOnlyUser",
pwd: "readonlyPwd",
roles: [ { role: "read", db: "myDB" } ]
}
)
自定义角色
在某些复杂场景下,内置角色可能无法满足需求,这时可以创建自定义角色。以下是创建一个自定义角色的示例,该角色允许在指定集合上执行插入和查询操作:
use admin
db.createRole(
{
role: "customInsertAndQueryRole",
privileges: [
{
resource: { db: "customDB", collection: "customCollection" },
actions: [ "insert", "find" ]
}
],
roles: []
}
)
然后可以将这个自定义角色赋予某个用户:
use customDB
db.createUser(
{
user: "customUser",
pwd: "customPwd",
roles: [ { role: "customInsertAndQueryRole", db: "admin" } ]
}
)
网络访问控制
限制对 MongoDB 分片集群的网络访问,能够有效减少潜在的攻击面。
绑定 IP 地址
在 mongod.conf
配置文件中,通过 net.bindIp
选项指定 mongod
实例监听的 IP 地址。例如,只允许本地访问,可以设置为:
net:
bindIp: 127.0.0.1
如果要允许来自特定网络段的访问,可以设置为:
net:
bindIp: 192.168.1.0/24,127.0.0.1
这样,mongod
实例会监听本地回环地址以及 192.168.1.0/24
网络段内的连接。
防火墙设置
除了在 MongoDB 配置层面限制 IP 访问,还可以通过操作系统的防火墙进行更严格的控制。以 Linux 系统的 iptables
为例,假设 MongoDB 运行在默认端口 27017 上,允许 192.168.1.0/24
网络段访问的命令如下:
iptables -A INPUT -p tcp --dport 27017 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 27017 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 27017 -j DROP
上述命令首先允许指定网络段和本地的连接访问 MongoDB 端口,然后拒绝其他所有来源的连接。
对于 mongos
路由节点,同样需要进行类似的网络访问控制配置,确保只有授权的客户端和分片节点能够与之通信。
加密
加密可以保护数据在传输和存储过程中的安全性。
传输层加密(TLS/SSL)
在 MongoDB 中,可以启用传输层加密来保护客户端与服务器之间的数据传输。首先需要获取 SSL 证书和私钥,例如可以使用 OpenSSL 生成自签名证书:
openssl req -newkey rsa:2048 -days 365 -nodes -keyout mongodb.key -x509 -out mongodb.crt
然后在 mongod.conf
配置文件中添加以下配置启用 TLS/SSL:
net:
tls:
mode: requireTLS
certificateKeyFile: /path/to/mongodb.pem
这里的 /path/to/mongodb.pem
是包含证书和私钥的 PEM 格式文件,可以通过合并 mongodb.crt
和 mongodb.key
文件生成:
cat mongodb.crt mongodb.key > mongodb.pem
对于 mongos
路由节点,同样需要进行类似的 TLS/SSL 配置。客户端连接时也需要配置相应的 TLS/SSL 选项,以 Python 的 pymongo
库为例:
from pymongo import MongoClient
client = MongoClient(
"mongodb://user:password@host:27017",
tls=True,
tlsCAFile="/path/to/ca.crt",
tlsCertificateKeyFile="/path/to/client.pem"
)
上述代码中,tls=True
表示启用 TLS/SSL 连接,tlsCAFile
是 CA 证书文件路径,tlsCertificateKeyFile
是客户端证书和私钥文件路径。
存储加密
MongoDB 从 3.2 版本开始支持存储加密,即 WiredTiger 存储引擎的加密功能。要启用存储加密,需要在 mongod.conf
配置文件中添加以下配置:
storage:
wiredTiger:
engineConfig:
encrypt:
keyFile: /path/to/keyfile
mode: requireEncryption
这里的 /path/to/keyfile
是存储加密密钥的文件路径。密钥文件需要妥善保管,确保其安全性。生成密钥文件可以使用 openssl rand
命令:
openssl rand -base64 96 > /path/to/keyfile
chmod 600 /path/to/keyfile
对密钥文件设置 600
的权限,确保只有 MongoDB 进程可以读取。
审计
审计功能可以记录 MongoDB 集群中的所有操作,有助于安全事件的追溯和分析。
启用审计
在 mongod.conf
配置文件中启用审计功能,添加以下配置项:
security:
auditLog:
destination: file
path: /var/log/mongodb/audit.log
format: JSON
上述配置表示将审计日志记录到 /var/log/mongodb/audit.log
文件中,日志格式为 JSON。destination
还可以设置为 syslog
,将审计日志发送到系统日志。
审计策略
MongoDB 提供了多种审计策略,如 default
、filter
等。default
策略记录所有的数据库操作,而 filter
策略可以根据自定义的规则进行过滤。以下是一个使用 filter
策略的示例,只记录对 admin
数据库的操作:
security:
auditLog:
destination: file
path: /var/log/mongodb/audit.log
format: JSON
filter:
- fields:
- "rs.*"
- "clientMetadata.*"
- "command.*"
- "commandName"
- "ns"
include: true
selector:
ns: { $eq: "admin.$cmd" }
在上述配置中,fields
定义了要记录的字段,include
设置为 true
表示包含这些字段,selector
则定义了过滤条件,这里只记录对 admin
数据库的命令操作。
配置副本集安全性
在 MongoDB 分片集群中,副本集是数据冗余和高可用的重要组成部分。配置副本集的安全性同样不可忽视。
副本集成员身份验证
副本集成员之间的通信也需要进行身份验证。在副本集的每个成员的 mongod.conf
配置文件中启用身份验证,并且确保所有成员使用相同的用户认证信息。例如,在每个成员上创建一个专门用于副本集内部通信的用户:
use local
db.createUser(
{
user: "replSetUser",
pwd: "replSetPassword",
roles: [ { role: "clusterMonitor", db: "admin" },
{ role: "localMonitor", db: "local" },
{ role: "readWrite", db: "local" } ]
}
)
然后在 mongod.conf
中配置身份验证:
security:
authorization: enabled
重启每个副本集成员使配置生效。
副本集 TLS/SSL 加密
为副本集成员之间的通信启用 TLS/SSL 加密,在每个成员的 mongod.conf
中添加 TLS/SSL 配置:
net:
tls:
mode: requireTLS
certificateKeyFile: /path/to/mongodb.pem
确保每个成员都有正确的证书和私钥文件,并且配置一致。这样可以保证副本集成员之间的数据传输是加密的,防止数据在传输过程中被窃取或篡改。
监控与维护安全配置
定期监控和维护 MongoDB 分片集群的安全配置是保持其安全性的关键。
监控工具
可以使用 MongoDB 自带的监控工具 mongostat
和 mongotop
来监控集群的运行状态,查看是否有异常的连接或操作。例如,mongostat
可以实时显示数据库的读写操作频率、连接数等信息:
mongostat -u adminUser -p password123 --authenticationDatabase admin
上述命令使用认证信息连接到 MongoDB 集群并启动 mongostat
监控。
此外,还可以使用第三方监控工具如 Prometheus 和 Grafana 来构建更全面的监控系统,实时监测集群的各项性能指标和安全相关指标。
定期检查与更新
定期检查用户权限,确保没有过度授权的用户。可以通过以下命令查看当前数据库中的所有用户及其角色:
use admin
db.system.users.find().pretty()
检查网络访问控制配置,确保防火墙规则和 MongoDB 的绑定 IP 配置符合预期。同时,及时更新 MongoDB 版本,以获取最新的安全补丁和功能改进。
对于审计日志,定期进行分析,查找潜在的安全威胁。例如,通过分析审计日志中的异常操作记录,如频繁的失败登录尝试或异常的数据库命令执行,及时发现并处理安全问题。
在 MongoDB 分片集群的安全性配置过程中,需要综合考虑身份验证、授权、网络访问控制、加密、审计等多个方面,并且持续监控和维护,以确保集群数据的安全性和稳定性。