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

MongoDB分片集群安全性配置与加固

2022-12-061.2k 阅读

1. 身份验证机制配置

在 MongoDB 分片集群中,身份验证是确保只有授权用户可以访问和操作数据库的关键步骤。MongoDB 支持多种身份验证机制,其中最常用的是 SCRAM - SHA - 256。

1.1 创建用户

首先,我们需要在 MongoDB 中创建用户。可以通过 MongoDB 的 shell 来完成这一操作。

连接到 MongoDB 副本集的主节点

mongo --host <primary - node - address>:<port> - u <admin - user> - p <admin - password> --authenticationDatabase admin

假设我们已经有了管理员用户,接下来为分片集群创建一个专门的用户,例如用于数据读写的用户。

创建读写用户

use <your - database - name>
db.createUser({
    user: "dataUser",
    pwd: "dataUserPassword",
    roles: [
        { role: "readWrite", db: "<your - database - name>" }
    ]
});

上述代码中,我们在指定的数据库<your - database - name>中创建了一个名为dataUser的用户,其密码为dataUserPassword,并赋予了readWrite角色,该角色允许在指定数据库中进行读写操作。

1.2 配置身份验证

在配置文件中开启身份验证。以 MongoDB 配置文件mongod.conf为例:

security:
  authorization: enabled

配置完成后,重启 MongoDB 服务使更改生效:

sudo systemctl restart mongod

这样,当客户端连接到 MongoDB 时,就需要提供有效的用户名和密码进行身份验证。

2. 网络安全配置

2.1 绑定IP地址

MongoDB 服务默认绑定到0.0.0.0,这意味着它可以接受来自任何网络接口的连接,存在一定的安全风险。我们应该将其绑定到特定的 IP 地址,只允许可信的网络访问。

mongod.conf配置文件中,找到net部分,并配置bindIp选项:

net:
  bindIp: <trusted - ip - address - 1>,<trusted - ip - address - 2>

例如,如果我们只允许本地网络和特定的远程服务器访问,可以这样配置:

net:
  bindIp: 127.0.0.1,192.168.1.100

然后重启 MongoDB 服务:

sudo systemctl restart mongod

2.2 防火墙配置

使用防火墙进一步限制对 MongoDB 端口的访问。在大多数 Linux 系统中,可以使用iptablesfirewalld

使用 iptables 允许特定 IP 访问 MongoDB 端口: 假设 MongoDB 使用默认端口 27017,允许本地网络和特定远程 IP 访问:

sudo iptables -A INPUT -p tcp --dport 27017 -s 192.168.1.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 27017 -s 10.0.0.10 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 27017 -j DROP

上述命令中,首先允许本地网络192.168.1.0/24和特定远程 IP 10.0.0.10访问 27017 端口,然后拒绝其他所有 IP 对该端口的访问。

使用 firewalld 允许特定 IP 访问 MongoDB 端口

sudo firewall - cmd --zone = public --add - rich - rule 'rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="27017" accept'
sudo firewall - cmd --zone = public --add - rich - rule 'rule family="ipv4" source address="10.0.0.10" port protocol="tcp" port="27017" accept'
sudo firewall - cmd --zone = public --add - rich - rule 'rule family="ipv4" port protocol="tcp" port="27017" reject'
sudo firewall - cmd --runtime - to - permanent

这些命令的作用与iptables类似,通过firewalld配置允许特定 IP 访问 MongoDB 端口,并将配置永久保存。

3. 数据加密

3.1 传输层加密(TLS/SSL)

在 MongoDB 分片集群中,使用 TLS/SSL 对数据传输进行加密可以防止数据在网络传输过程中被窃取或篡改。

生成 SSL 证书: 可以使用 OpenSSL 生成自签名证书:

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

在生成证书过程中,需要填写一些信息,如国家、组织等。

配置 MongoDB 使用 SSL: 在mongod.conf配置文件中添加以下内容:

net:
  tls:
    mode: requireTLS
    certificateKeyFile: /path/to/mongodb.pem

这里的/path/to/mongodb.pem是将生成的mongodb.keymongodb.crt合并后的文件,可以使用以下命令合并:

cat mongodb.crt mongodb.key > mongodb.pem

重启 MongoDB 服务后,客户端连接时就需要使用 SSL 连接。

客户端连接时使用 SSL

mongo --host <node - address>:<port> - u <user> - p <password> --authenticationDatabase <auth - db> --ssl --sslCAFile /path/to/mongodb.crt

3.2 存储层加密(Encryption at Rest)

MongoDB 从 3.0 版本开始支持存储层加密。存储层加密可以保护数据在磁盘上的安全,即使数据库文件被窃取,没有解密密钥也无法读取数据。

配置存储层加密: 首先,需要创建一个加密密钥库。假设密钥库文件为keyfile

openssl rand -base64 96 > keyfile
chmod 600 keyfile

然后在mongod.conf配置文件中添加存储层加密相关配置:

storage:
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      encrypt: true
      encryptionKeyFile: /path/to/keyfile

重启 MongoDB 服务后,新写入的数据将在存储时被加密。

4. 审计配置

4.1 启用审计

审计可以记录 MongoDB 数据库的所有操作,有助于发现潜在的安全问题。

mongod.conf配置文件中添加审计配置:

auditLog:
  destination: file
  path: /var/log/mongodb/audit.log
  format: JSON
  filter:
    - fields:
        - "atype"
        - "ns"
        - "op"
      type: include

上述配置表示将审计日志记录到/var/log/mongodb/audit.log文件中,采用 JSON 格式,并只记录操作类型(atype)、命名空间(ns)和操作(op)字段。

重启 MongoDB 服务使审计配置生效:

sudo systemctl restart mongod

4.2 审计日志分析

审计日志以 JSON 格式记录,每一行代表一个操作记录。例如:

{
    "atype": "command",
    "ts": {
        "$date": "2023 - 10 - 01T12:00:00Z"
    },
    "localAddr": "127.0.0.1:27017",
    "remoteAddr": "192.168.1.10:50000",
    "ns": "testdb.testcollection",
    "op": "find",
    "command": {
        "find": "testcollection",
        "filter": {}
    },
    "numYields": 0,
    "reslen": 20,
    "client": {
        "application": "MongoDB Shell",
        "driver": {
            "name": "MongoDB Internal Client",
            "version": "4.4.0"
        },
        "os": {
            "type": "Linux",
            "name": "Ubuntu",
            "architecture": "x86_64",
            "version": "20.04"
        }
    },
    "authInfo": {
        "authenticatedUsers": [
            {
                "user": "dataUser",
                "db": "testdb"
            }
        ],
        "authenticatedUserRoles": [
            {
                "role": "readWrite",
                "db": "testdb"
            }
        ]
    },
    "result": {
        "cursor": {
            "id": 0,
            "ns": "testdb.testcollection",
            "firstBatch": []
        },
        "ok": 1
    }
}

通过分析这些日志,可以了解数据库的操作情况,如哪些用户在何时进行了什么操作,是否有异常的操作行为等。

5. 分片集群特定安全配置

5.1 配置服务器间通信安全

在 MongoDB 分片集群中,各个组件(如分片服务器、配置服务器、路由服务器)之间需要进行通信。为了确保这些通信的安全,同样需要使用身份验证和加密。

配置服务器间使用身份验证: 在每个组件的配置文件中,都开启身份验证:

security:
  authorization: enabled

并且在启动各个组件时,使用相同的用户信息进行身份验证。例如,在启动mongos路由服务器时:

mongos --configdb <config - server - replica - set>/<config - server - 1 - address>:<port>,<config - server - 2 - address>:<port> - u <admin - user> - p <admin - password> --authenticationDatabase admin

配置服务器间使用 TLS/SSL 加密通信: 在每个组件的配置文件中添加 TLS 配置,例如对于mongos

net:
  tls:
    mode: requireTLS
    certificateKeyFile: /path/to/mongodb.pem

对于分片服务器和配置服务器也进行类似的配置,确保所有组件之间的通信都是加密的。

5.2 保护配置服务器

配置服务器存储了分片集群的元数据,对整个集群的正常运行至关重要。因此,需要特别保护配置服务器。

限制配置服务器的访问: 通过绑定 IP 地址和防火墙配置,只允许可信的路由服务器和分片服务器访问配置服务器。例如,在mongod.conf配置文件中为配置服务器绑定特定的 IP 地址:

net:
  bindIp: <config - server - trusted - ip - 1>,<config - server - trusted - ip - 2>

并在防火墙中配置只允许可信的 IP 访问配置服务器的端口。

备份配置服务器数据: 定期备份配置服务器的数据,以防止数据丢失。可以使用 MongoDB 的mongodump工具进行备份:

mongodump --host <config - server - address>:<port> - u <admin - user> - p <admin - password> --authenticationDatabase admin - o /path/to/backup

6. 监控与安全漏洞检测

6.1 监控工具使用

使用 MongoDB 自带的监控工具以及第三方监控工具来实时监控分片集群的运行状态和安全状况。

使用 MongoDB 自带监控命令top命令可以查看 MongoDB 进程的资源使用情况:

top -p `pgrep mongod`

db.serverStatus()命令可以获取服务器的详细状态信息,包括内存使用、连接数、操作统计等:

use admin
db.serverStatus()

使用第三方监控工具: 例如 Prometheus 和 Grafana 组合。首先,使用mongodb - exporter将 MongoDB 的指标数据导出,然后 Prometheus 采集这些数据,最后通过 Grafana 进行可视化展示。

安装mongodb - exporter

wget https://github.com/percona/mongodb_exporter/releases/download/v0.29.0/mongodb_exporter - v0.29.0.linux - amd64.tar.gz
tar xvf mongodb_exporter - v0.29.0.linux - amd64.tar.gz
cd mongodb_exporter - v0.29.0.linux - amd64
./mongodb_exporter --mongodb.uri = mongodb://<user>:<password>@<mongodb - address>:<port>/admin

配置 Prometheus 采集mongodb - exporter的数据,在prometheus.yml配置文件中添加:

scrape_configs:
  - job_name:'mongodb'
    static_configs:
      - targets: ['<mongodb - exporter - address>:9216']

启动 Prometheus 和 Grafana,并导入 MongoDB 相关的 Grafana 仪表盘模板,就可以直观地监控 MongoDB 分片集群的各种指标。

6.2 安全漏洞检测

定期使用漏洞扫描工具对 MongoDB 分片集群进行安全漏洞检测。例如,可以使用Nmap进行端口扫描和服务版本检测:

nmap -sV --script = mongodb - brute <mongodb - server - address>

这个命令可以检测 MongoDB 服务器的版本,并尝试进行暴力破解(仅用于检测目的)。

还可以关注 MongoDB 官方发布的安全公告,及时更新 MongoDB 版本,以修复已知的安全漏洞。例如,如果发现某个版本存在严重的安全漏洞,按照官方文档的指引进行版本升级:

sudo apt - get update
sudo apt - get install mongodb - org = <new - version>

在升级过程中,需要注意备份数据,并确保集群的各个组件都能正常运行。

7. 安全配置的最佳实践与总结

7.1 最小权限原则

在创建用户时,严格遵循最小权限原则。只赋予用户执行其任务所需的最低权限。例如,如果一个用户只需要读取特定数据库的部分集合数据,就只赋予其相应的read角色,而不是更高权限的readWritedbAdmin等角色。

7.2 定期安全评估

定期对 MongoDB 分片集群进行全面的安全评估。包括身份验证、网络安全、数据加密、审计等方面的检查。可以制定一个安全评估计划,如每月或每季度进行一次评估,及时发现并修复潜在的安全问题。

7.3 自动化安全配置

对于大规模的 MongoDB 分片集群,可以考虑使用自动化工具来进行安全配置。例如,使用 Ansible、Puppet 等配置管理工具,通过编写脚本自动完成用户创建、配置文件修改、防火墙规则设置等安全相关的操作,提高配置的一致性和效率,同时减少人为错误。

通过以上全面的 MongoDB 分片集群安全性配置与加固措施,可以有效提升集群的安全性,保护数据的机密性、完整性和可用性,满足企业级应用对数据安全的严格要求。在实际应用中,需要根据具体的业务需求和安全策略,灵活调整和完善这些配置,确保 MongoDB 分片集群在安全可靠的环境中运行。