MongoDB-从0到1-安全管理

作者:赵师的工作日(赵明中)

现役Oracle ACE、MySQL 8.0 ocp、TiDB PCTA\PCTP、Elasticsearch Certified Engineer

微信号:mzzhao23

微信公众号:赵师的工作日

墨天轮社区:赵师的工作日

CSND:赵师的工作日

在 MongoDB 中,安全管理的核心包括鉴权(Authentication)和角色管理(Role-Based Access Control, RBAC),这两个方面直接影响到数据库的访问控制和权限管理。

一、MongoDB 鉴权

1、什么是鉴权

鉴权(Authentication)是指验证用户身份的过程,确保只有经过授权的用户可以访问 MongoDB 数据库。MongoDB 提供了多种方式来进行用户鉴权,默认情况下,MongoDB 允许任何用户不需要登录即可访问数据库,但为了保障安全,强烈建议在生产环境中启用鉴权。

2、启用鉴权

要启用 MongoDB 的鉴权功能,需要修改 MongoDB 配置文件 mongod.conf 或启动 MongoDB 服务时指定 --auth 参数。

配置文件启用鉴权

在 mongod.conf 文件中,找到 security 部分,启用鉴权:

复制代码
security:
  authorization: "enabled"

启动时启用鉴权

如果没有使用配置文件,可以在启动 MongoDB 时添加 --auth 参数来启用鉴权:

复制代码
mongod --auth --dbpath /data/db

启用鉴权后,MongoDB 会要求所有连接到数据库的客户端进行身份验证。

3、用户身份验证机制

MongoDB 支持多种身份验证机制,常见的有以下几种:

  • MongoDB 内置身份验证:MongoDB 默认使用自己的用户认证机制,用户名和密码存储在 admin 数据库中。
  • LDAP 集成:可以将 MongoDB 与 LDAP 服务集成,以便使用 LDAP 用户数据库进行身份验证。
  • x.509 证书认证:通过使用 SSL/TLS 证书来验证客户端的身份,适用于要求高安全性的环境。

对于大多数情况,内置的用户名和密码认证就足够了。

创建管理员账户

在启用鉴权之后,首先需要在 admin 数据库创建一个超级管理员账户。可以通过以下步骤创建管理员账户:

(1)启动 MongoDB 实例时不启用鉴权(即不加 --auth 参数)。

(2)连接到 MongoDB 实例并创建管理员账户:

复制代码
use admin
db.createUser({
  user: "admin",
  pwd: "adminpassword",  // 密码应足够复杂
  roles: [{ role: "root", db: "admin" }]
})

(3)退出 MongoDB,并重新启动实例时启用鉴权(即加 --auth 参数)。

复制代码
mongod --auth --dbpath /data/db

(3)使用管理员账户进行验证:

复制代码
mongo -u admin -p adminpassword --authenticationDatabase admin
4、身份验证的注意事项
  • 强密码策略:使用强密码以提高账户的安全性。
  • 避免使用默认用户名:尽量避免使用 admin 或其他容易猜到的用户名。
  • 定期审查和更新密码:确保定期更换管理员密码。
  • 启用 TLS/SSL 加密:通过启用 TLS/SSL 加密保证数据在传输过程中不被窃取。

二、MongoDB 角色管理

1、什么是角色管理

MongoDB 提供了基于角色的访问控制(RBAC,Role-Based Access Control),通过角色管理控制每个用户对数据库的访问权限。每个角色由一组权限组成,用户可以被授予一个或多个角色,从而获得不同的操作权限。

2、内置角色

MongoDB 提供了一些内置的角色,常用的角色包括:

  • root:具有所有数据库的所有权限,适用于超级管理员。
  • dbAdmin:用于管理数据库的结构(例如创建索引、查看数据库状态等)。
  • readWrite:具有在指定数据库中执行读取和写入操作的权限。
  • read:具有在指定数据库中执行读取操作的权限。
  • clusterAdmin:具有管理集群级别配置(例如管理分片和副本集)权限的角色。
  • userAdmin:用于管理用户和角色的权限。

这些内置角色覆盖了大部分日常管理需求,但你也可以根据需求创建自定义角色。

常见内置角色示例:

复制代码
use admin

// 创建一个具有读写权限的用户
db.createUser({
  user: "readwriteUser",
  pwd: "password123",
  roles: [{ role: "readWrite", db: "test" }]
})

// 创建一个具有管理数据库权限的用户
db.createUser({
  user: "dbAdminUser",
  pwd: "password456",
  roles: [{ role: "dbAdmin", db: "test" }]
})
3、创建自定义角色

除了使用内置角色,MongoDB 还支持创建自定义角色。通过自定义角色,你可以精确地控制用户对数据库的访问权限。自定义角色通过定义一组操作权限来实现。

示例:创建一个自定义角色

复制代码
use admin
db.createRole({
  role: "customRole",
  privileges: [
    {
      resource: { db: "test", collection: "" },
      actions: ["find", "insert"]
    }
  ],
  roles: []  // 该角色不继承其他角色
})

在上述示例中,我们创建了一个名为 customRole 的角色,该角色仅允许在 test 数据库中执行 find 和 insert 操作。

创建用户并赋予自定义角色

复制代码
use admin
db.createUser({
  user: "customUser",
  pwd: "password789",
  roles: [{ role: "customRole", db: "admin" }]
})
4、角色管理的最佳实践
  • 最小权限原则:每个用户应仅授予完成其任务所需的最少权限。避免过度授予权限,尤其是敏感的数据库操作权限。
  • 角色的分配:避免将权限过于集中,特别是对于具有高权限的角色(如 root 和 userAdmin),应严格控制谁能访问。
  • 定期审计和回收权限:定期审查用户的角色和权限,确保不再需要某个角色的用户能够及时删除或修改其角色。
  • 使用内置角色优先:尽可能使用 MongoDB 提供的内置角色,而不是自定义角色,以减少管理复杂度。
相关推荐
cipher18 小时前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
jiayou641 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤2 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区3 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
AI全栈实验室3 天前
MongoDB迁移金仓踩了5个坑,最后一个差点回滚
mongodb
随逸1773 天前
《从零搭建NestJS项目》
数据库·typescript
一次旅行4 天前
网络安全总结
安全·web安全
加号34 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏4 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐4 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端