MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

MongoDB副本集安全性配置与加固

2024-09-295.3k 阅读

MongoDB 副本集安全性配置与加固

1. 副本集概述

MongoDB 副本集是由一组 MongoDB 实例组成的集群,其中一个实例为主节点(primary),其他实例为从节点(secondary)。主节点负责处理所有的写操作,从节点通过复制主节点的 oplog(操作日志)来保持数据同步。副本集提供了数据冗余、高可用性和故障恢复能力。在生产环境中,确保副本集的安全性至关重要。

2. 网络安全配置

2.1 绑定 IP 地址

默认情况下,MongoDB 会绑定到 0.0.0.0,这意味着它可以接受来自任何网络接口的连接。在生产环境中,应将其绑定到特定的 IP 地址,通常是服务器的内部 IP 地址,以限制外部直接访问。 在 mongod.conf 配置文件中,通过 net.bindIp 选项进行设置:

net:
  bindIp: 192.168.1.100  # 替换为实际的内部 IP 地址

重启 MongoDB 服务使配置生效:

sudo systemctl restart mongod

2.2 防火墙设置

使用防火墙(如 iptablesfirewalld)来进一步限制对 MongoDB 端口(默认 27017)的访问。例如,在 firewalld 中,可以创建一个新的服务并限制其访问:

sudo firewall-cmd --permanent --add-service=mongodb
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="mongodb" accept'
sudo firewall-cmd --reload

上述命令允许 192.168.1.0/24 网段内的主机访问 MongoDB 服务。

3. 身份验证配置

3.1 开启身份验证

在 MongoDB 副本集中,开启身份验证是保护数据的重要步骤。在 mongod.conf 配置文件中,添加或修改以下行:

security:
  authorization: enabled

重启 MongoDB 服务:

sudo systemctl restart mongod

3.2 创建管理员用户

在开启身份验证后,需要创建管理员用户。首先,以非认证模式启动一个 MongoDB 实例(如果当前已开启认证,可以暂时关闭认证,修改配置文件后重启):

mongod --port 27017 --dbpath /var/lib/mongo --auth=false

然后,连接到该实例并创建管理员用户:

mongo --port 27017
use admin
db.createUser({
  user: "admin",
  pwd: "password",
  roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
});

上述代码在 admin 数据库中创建了一个名为 admin 的用户,密码为 password,并赋予 userAdminAnyDatabase 角色,该角色允许管理任何数据库的用户。

3.3 创建普通用户

为特定数据库创建普通用户,例如为 myapp 数据库创建一个具有读写权限的用户:

mongo --port 27017 -u "admin" -p "password" --authenticationDatabase "admin"
use myapp
db.createUser({
  user: "myappuser",
  pwd: "myapppassword",
  roles: [ { role: "readWrite", db: "myapp" } ]
});

上述代码使用管理员用户连接到 MongoDB,然后在 myapp 数据库中创建了一个名为 myappuser 的用户,密码为 myapppassword,并赋予 readWrite 角色,该角色允许对 myapp 数据库进行读写操作。

4. 加密配置

4.1 传输层加密(TLS/SSL)

为了确保数据在传输过程中的安全性,可以启用 TLS/SSL 加密。首先,需要获取 SSL 证书和私钥。可以从证书颁发机构(CA)获取,或者使用 openssl 生成自签名证书:

openssl req -newkey rsa:2048 -days 365 -nodes -keyout mongodb.key -out mongodb.csr
openssl x509 -req -in mongodb.csr -days 365 -signkey mongodb.key -out mongodb.crt

mongod.conf 配置文件中,添加以下配置启用 TLS/SSL:

net:
  ssl:
    mode: requireSSL
    PEMKeyFile: /path/to/mongodb.pem  # 包含证书和私钥的 PEM 文件路径
    CAFile: /path/to/ca.crt  # CA 证书路径

同时,在 mongos(如果使用分片集群)的配置文件中也进行类似配置:

net:
  ssl:
    mode: requireSSL
    PEMKeyFile: /path/to/mongodb.pem
    CAFile: /path/to/ca.crt

重启 MongoDB 和 mongos 服务:

sudo systemctl restart mongod
sudo systemctl restart mongos

连接到 MongoDB 时,需要指定 SSL 选项:

mongo --ssl --sslCAFile /path/to/ca.crt --port 27017 -u "myappuser" -p "myapppassword" --authenticationDatabase "myapp"

4.2 存储层加密(WiredTiger 引擎加密)

MongoDB 从 3.2 版本开始支持 WiredTiger 引擎的存储层加密。在创建数据库目录时,需要指定加密密钥文件:

openssl rand -base64 96 > /path/to/mongodb.key
chmod 600 /path/to/mongodb.key
chown mongod:mongod /path/to/mongodb.key

mongod.conf 配置文件中,添加以下配置启用存储层加密:

storage:
  wiredTiger:
    engineConfig:
      encrypt:
        keyFile: /path/to/mongodb.key

重启 MongoDB 服务:

sudo systemctl restart mongod

5. 审计配置

5.1 启用审计日志

MongoDB 提供了审计功能,可以记录数据库的各种操作。在 mongod.conf 配置文件中,添加以下配置启用审计日志:

security:
  auditLog:
    destination: file
    path: /var/log/mongodb/audit.log
    format: JSON
    filter: {
      atype: { $in: [ "command", "connection", "authentication" ] }
    }

上述配置将审计日志输出到 /var/log/mongodb/audit.log 文件中,格式为 JSON,并且只记录命令、连接和身份验证相关的操作。 重启 MongoDB 服务:

sudo systemctl restart mongod

5.2 审计日志分析

审计日志记录了大量的数据库操作信息,可以使用工具如 jq 来分析日志。例如,要查看所有的身份验证失败记录:

cat /var/log/mongodb/audit.log | jq '.[] | select(.atype == "authenticationFailure")'

6. 副本集成员安全性

6.1 限制副本集成员之间的网络访问

确保副本集成员之间的网络连接受到限制,只允许彼此之间进行通信。可以通过防火墙规则实现:

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" destination address="192.168.1.101" port protocol="tcp" port="27017" accept'
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.101" destination address="192.168.1.100" port protocol="tcp" port="27017" accept'
sudo firewall-cmd --reload

上述命令允许 192.168.1.100192.168.1.101 两个副本集成员之间通过 27017 端口进行通信。

6.2 定期更新副本集成员的系统和 MongoDB 版本

定期更新副本集成员的操作系统和 MongoDB 版本,以确保系统安全和性能优化。例如,在 Ubuntu 系统上更新 MongoDB 版本:

sudo apt update
sudo apt upgrade mongodb-org

同时,更新操作系统的其他软件包:

sudo apt update
sudo apt upgrade

7. 安全配置检查

7.1 使用 MongoDB 自带的安全检查工具

MongoDB 提供了 mongo-security-check 工具来检查安全配置。首先,确保安装了该工具:

sudo npm install -g mongo-security-check

然后,运行该工具来检查 MongoDB 实例的安全配置:

mongo-security-check --uri "mongodb://admin:password@192.168.1.100:27017/admin"

该工具将检查身份验证、网络配置、加密等方面的安全设置,并给出相应的建议。

7.2 手动检查

手动检查一些关键的安全配置,例如检查 mongod.conf 配置文件中的身份验证、加密、绑定 IP 等设置是否正确:

cat /etc/mongod.conf | grep -E "authorization|bindIp|ssl"

检查防火墙规则是否正确配置:

sudo firewall-cmd --list-all

8. 备份与恢复安全性

8.1 备份数据加密

在进行 MongoDB 数据备份时,可以对备份数据进行加密。例如,使用 mongodump 工具进行备份,并使用 openssl 对备份文件进行加密:

mongodump --uri "mongodb://myappuser:myapppassword@192.168.1.100:27017/myapp" -o /path/to/backup
openssl enc -aes-256-cbc -salt -in /path/to/backup/myapp -out /path/to/backup/myapp.enc -k mysecretpassword

上述代码先使用 mongodumpmyapp 数据库进行备份,然后使用 openssl 对备份文件进行 AES - 256 - CBC 加密。

8.2 恢复数据安全

在恢复备份数据时,首先需要解密备份文件:

openssl enc -d -aes-256-cbc -in /path/to/backup/myapp.enc -out /path/to/backup/myapp -k mysecretpassword
mongorestore --uri "mongodb://myappuser:myapppassword@192.168.1.100:27017/myapp" /path/to/backup/myapp

确保恢复过程中的身份验证和数据完整性。

9. 安全监控与报警

9.1 监控工具

使用工具如 MMS(MongoDB Management Service)Prometheus + Grafana 来监控 MongoDB 副本集的安全相关指标,如连接数、身份验证失败次数、审计日志事件等。 在 Prometheus 配置文件中,添加 MongoDB 监控目标:

scrape_configs:
  - job_name:'mongodb'
    static_configs:
      - targets: ['192.168.1.100:27017']
    metrics_path: /metrics
    params:
      module: [mongodb]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.1.100:9216  # Prometheus exporter 地址

9.2 报警设置

Grafana 中设置报警规则,例如当身份验证失败次数超过一定阈值时发送报警邮件。在 Grafana 中创建一个新的报警规则:

  1. 选择要监控的指标,如身份验证失败次数。
  2. 设置阈值,例如当失败次数超过 10 次/分钟时触发报警。
  3. 配置报警通知渠道,如邮件、Slack 等。

10. 安全最佳实践总结

  • 最小权限原则:为用户分配最小的权限,只允许其执行必要的操作。
  • 定期审查:定期审查用户权限、审计日志和安全配置,确保没有安全漏洞。
  • 多因素认证:如果可能,启用多因素认证,增加身份验证的安全性。
  • 数据分类与保护:根据数据的敏感程度进行分类,并采取相应的保护措施。
  • 灾难恢复计划:制定完善的灾难恢复计划,确保在发生安全事件时能够快速恢复数据和服务。

通过以上全面的安全性配置与加固措施,可以有效提升 MongoDB 副本集在生产环境中的安全性,保护数据的机密性、完整性和可用性。在实际应用中,需要根据具体的业务需求和安全要求进行适当的调整和优化。