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

MongoDB分片集群安全性配置

2024-10-231.2k 阅读

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 提供了一系列内置角色,如 readreadWritedbAdminuserAdmin 等。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.crtmongodb.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 提供了多种审计策略,如 defaultfilter 等。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 自带的监控工具 mongostatmongotop 来监控集群的运行状态,查看是否有异常的连接或操作。例如,mongostat 可以实时显示数据库的读写操作频率、连接数等信息:

mongostat -u adminUser -p password123 --authenticationDatabase admin

上述命令使用认证信息连接到 MongoDB 集群并启动 mongostat 监控。

此外,还可以使用第三方监控工具如 Prometheus 和 Grafana 来构建更全面的监控系统,实时监测集群的各项性能指标和安全相关指标。

定期检查与更新

定期检查用户权限,确保没有过度授权的用户。可以通过以下命令查看当前数据库中的所有用户及其角色:

use admin
db.system.users.find().pretty()

检查网络访问控制配置,确保防火墙规则和 MongoDB 的绑定 IP 配置符合预期。同时,及时更新 MongoDB 版本,以获取最新的安全补丁和功能改进。

对于审计日志,定期进行分析,查找潜在的安全威胁。例如,通过分析审计日志中的异常操作记录,如频繁的失败登录尝试或异常的数据库命令执行,及时发现并处理安全问题。

在 MongoDB 分片集群的安全性配置过程中,需要综合考虑身份验证、授权、网络访问控制、加密、审计等多个方面,并且持续监控和维护,以确保集群数据的安全性和稳定性。