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 提供的内置角色,而不是自定义角色,以减少管理复杂度。
相关推荐
红姐跨境书7 小时前
从零打造高性能 API 网关: Go 语言中的双缓冲 Dynamic Config 最佳实践
安全
十二同学啊9 小时前
向量数据库:从核心原理到 RAG 与 Java 实战
数据库
蓝速科技10 小时前
会议室门牌公告通知发布选型与落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
迪康Defender12 小时前
终端安全实战:如何高效解决企业U盘泄密与管控难题
运维·网络·安全·web安全·终端安全管理
一 乐13 小时前
二手交易平台|基于springboot + vue二手交易平台(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序
网安小学生(兼顾数据库版)13 小时前
固件+软件供应链:ONEKEY+Mend如何实现全链路安全覆盖
网络·安全·web安全
SelectDB13 小时前
同等资源下 Apache Doris 4.2 vs StarRocks 4.1.1:1TB SSB 与 TPC-H 性能实测
大数据·数据库·数据分析
这个DBA有点耶13 小时前
数据库集群与分布式架构:三条技术路线对比、金仓KES RAC实测数据与决策框架
数据库·程序员·架构
MayBaymax13 小时前
MongoDB 索引与事务
java·数据库·mongodb
SelectDB13 小时前
Doris vs ClickHouse:企业 OLAP 走向下一阶段,两种技术路线如何选择
大数据·数据库·数据分析