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

MongoDB安全配置与权限管理

2024-06-137.6k 阅读

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:结合了 readWritedbAdminuserAdmin 的权限,对指定数据库拥有完全控制权。

集群管理角色

  • 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,并且只记录 commandconnection 类型的操作。

重启 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 数据库的安全性,保护数据的机密性、完整性和可用性。在实际应用中,应根据具体的业务需求和安全要求,灵活组合和配置这些安全特性。