【MongoDB系列】3. MongoDB 安全策略:验证和授权

news2025/1/21 14:03:53

前言

前面文章中通过客户端工具(MongoDB Shell、Robo 3T)连接 MongoDB 服务时,只要有 IP 地址和端口号,就能连接到数据库,之后就能操作数据库。这是因为默认安装的 MongoDB 没有启用身份验证,也没有设置初始用户名和密码。然而这会导致很多数据安全问题。

MongoDB 提供了多种方式来提高数据库的安全性,例如身份验证访问控制加密等。

本文主要介绍 MongoDB 提供的内置角色和权限,然后通过开启身份验证,为用户指定不同的访问权限,来提供数据库的安全性

前两篇文章,我们分别在 Windows,Linux 和 Docker 中安装了 MongoDB 数据库。本文所介绍的内容,以 Linux 环境中的 MongoDB 为例进行演示。Windows 系统中的操作基本一致。

区分验证和授权

验证即身份验证。用户在连接到 MongoDB 服务时,需要提供用户名,密码和验证数据库进行身份的验证。

授权就是权限控制。做过后台管理系统的小伙伴肯定对 RBAC 模型不陌生。MongoDB 也采用了 RBAC 模型,创建用户时需要为其指定角色,来获取相应的操作数据库的权限。

身份验证只是限制用户能否连接数据库服务,而通过权限控制,就能更精细的控制用户对数据库的各种操作。类比常见的后台管理系统,管理员和普通用户都能登录系统,然后他们能访问的页面、能做的操作却大有不同。

MongoDB 内置角色

MongoDB 通过 RBAC 授予用户对数据和命令的访问权限,并提供了多种内置角色来提供数据库系统中通常需要的不同级别的访问权限。除了使用内置角色,还支持用户创建定义的角色。

这一部分的内容官网有详尽的说明,我们先了解一些常用的角色和权限。

数据库读写角色:

  • read:允许用户读取指定数据库
  • readWrite:允许用户读写指定数据库

数据库管理员角色:

  • dbAdmin:允许用户进行索引创建、删除,查看统计或访问 system.profile,但没有角色和用户管理的权限
  • dbOwner:提供对数据库执行任何操作的能力。这个角色组合了 readWrite、dbAdmin 和 userAdmin 角色授权的特权
  • userAdmin:提供了在当前数据库中创建和修改角色和用户的能力

所有数据库角色:

  • readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限
  • readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限
  • userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限
  • dbAdminAnyDataBase:只在 admin 数据库中可用,赋予用户所有数据库的 adAdmin 权限

超级用户角色:

  • root:只在 admin 数据库中可用,超级用户,拥有超级权限

本文中我们主要用到 root 角色来设置数据库的超级管理员,然后使用 readdbOwner 角色来为某个数据库创建不同权限的用户。

身份验证

开启身份验证

在启动 MongoDB 服务时,通过设置 --auth在命令行中开启身份验证:

$ mongod -f /data/mongodb/mongodb.conf --auth

或者在配置文件开启 security.authorization

security: 
  authorization: enabled
  • authorization:表示是否开启用户访问控制,即客户端是否需要通过用户名和密码验证的方式访问数据库服务。默认为 disabled。

如下,此时 MongoDB 服务已经开启了身份验证:

image-20221110141908071

总结:

开启身份验证:

启动 mongod 服务时,使用 --auth;

使用 mongosh 客户端工具连接到 mongod 服务;

创建一个超级管理员账号;

创建超级管理员用户

MongoDB 开启身份验证后,是没有默认的用户名和密码的,需要自己进行设置

使用 mongosh 连接服务:

$ mongosh

image-20221110143005242

开启验证后,即使不输入用户名密码也能进入到数据库中,但此时没有权限操作数据库,比如:

image-20221110143232244

此时唯一能做的事情就是创建一个超级管理员角色的用户

创建超级管理员需要进入 admin 数据库,然后使用 db.createUser 方法创建用户:

use admin;

db.createUser({
  user: "Kunwu",
  pwd: "abc123",
  roles: [
    { role: "root", db: "admin"}
  ]
});

配置项说明:

  • user:创建的用户名。
  • pwd:创建的用户密码。
  • roles:设置用户角色信息,是一个数组,可以设置多种角色。
  • role:设置用户的角色,MongoDB 提供若干种不同的角色,这里设置为超级用户角色 root
  • db:设置用户权限生效的数据库。由于 root 角色的特殊性,这里只能设置为 admin。但是具备了 root 角色的用户,具有超级权限。

image-20221110145315071

使用超级管理员连接服务

开启身份验证后,通过客户端工具(MongoDB Shell、Robo 3T 等)连接到 MongoDB 服务时,需要指定用户名和密码,有两种验证方式。

方式1:连接时验证

在连接数据库服务时指定用户名和认证数据库:

$ mongosh -u Kunwu --authenticationDatabase admin
  • -u/–user:指定用户名

  • –authenticationDatabase:指定认证数据库。认证数据库,就是创建用户时所处的那个数据库。上文创建 Kunwu 时所在的数据库是 admin,所以他的认证数据库就是 admin。

然后命令行中会提示你输入密码:

image-20221110234434581

输入密码后,回车确认即可登录:

image-20221110234527592

也可以直接在命令行通过 -p/--password 来输入密码:

$ mongosh -u Kunwu -p abc123 --authenticationDatabase admin

方式2:连接后验证

先不提供用户名、密码和验证数据库,而是在连接到数据库服务之后,进入认证数据库,使用 db.auth 方法验证用户名和密码。

$ mongosh

验证身份:

use admin;

db.auth('Kunwu', 'abc123');

image-20221110160528461

使用 Robo 3T 连接

创建一个新连接。在 Connection 中输入数据库服务的 IP 和端口:

image-20221110162721247

在第二个 Authentication中依次输入:

  • Database:创建用户时指定的验证数据库
  • User Name:用户名
  • Password:用户密码

image-20221110162403451

然后点击左下角的测试按钮,进行连接测试:

image-20221110162311453

之后就可以使用 Robo 3T 来管理数据库库了。

关于认证数据库的一点补充

认证数据库,就是指创建用户时所处于的那个数据库。比如前文是在 admin 数据库中创建的超级管理员的用户 Kunwu,那么此用户的验证数据库就是 admin。在登录数据库时,authenticationDatabase 就需要指定为 admin

验证数据库并不意味着用户只能操作这一个数据库

MongoDB 中内置了多种角色,创建用户时可以指定多个角色和数据库,此时指定的数据库才是用户能操作的数据库。比如:

db.createUser({
  user: "Kunwu",
  pwd: "abc123",
  roles: [
    { role: "read", db: "db1"},
    { role: "readWrite", db: "db2"},
    { role: "dbOwner", db: "db2"},
  ]
});

此时,用户 Kunwu 就能操作 db1、db2、db3 这三个数据库,并且具备不同的权限。

所以,结论就是认证数据库并不等同于用户能操作的数据库,这是两个不同的概念。

为应用单独创建用户

超级用户具备最高权限,它适合用来管理其他用户,而不应该用来操作具体的数据库。

我们需要为每一个应用创建单独的用户,来使用数据库服务。比如有一个管理系统 manage,可以为它创建多个用户,有的只能读取数据,有的可以读写数据,有的具备完全权限等等。

先以超级管理员身份登录到MongoDB中:

$ mongosh -u Kunwu -p abc123 --authenticationDatabase admin

然后为 manage 数据库创建不同的用户:

use manage;

db.create({
  user: 'ManageAdmin',
  pwd: 'admin123',
  roles: [
    { role: "dbOwner", db: 'manage'}
  ]
});

db.create({
  user: 'ManageRead',
  pwd: 'user123',
  roles: [
    { role: "read", db: 'manage'}
  ]
})

dbOwner 角色的用户拥有对 manage 数据库执行任何操作的能力。而 read 角色的用户只能从数据库中读取数据。

使用 manage 数据库的管理员用户登录:

$ mongosh -u ManageAdmin -p admin123 --authenticationDatabase manage

使用 manage 数据库的普通用户登录:

$ mongosh -u ManageRead -p user123 --authenticationDatabase manage

总结

到这里,我们简单介绍了 MongoDB 的身份验证和授权的机制。

对于新安装的 MongoDB ,它是没有开启身份验证的。需要进入 admin 数据库,创建一个 root 角色的超级管理员用户。之后再针对具体应用的数据库,使用管理员用户为其创建不同权限的用户,从而做到针对数据库安全的基本保障。

关于角色权限还有很多内容,比如某个角色具体拥有哪些权限,如何创建自定义角色,如何修改用户密码,更新角色等等,大家可以自行访问官网或者查阅其他资料。

感谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/943142.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PlotAI = Matplotlib + AI

PlotAI是在 Python 和 Matplotlib 中创建绘图的最简单方法,它使用 LLM 生成Python代码和Matplotlib绘图。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 1、PlotAI简介 PlotAI的思路: 用户提供输入数据框和提示。PlotAI 构建了 LLM 的提示&…

代码随想录打卡—day46—【DP】— 8.29 背包END

1 139. 单词拆分 139. 单词拆分 做了很久...估计2h 一开始我的思路卡死了 看题解之后的思路的详解见注释, 我的写法和carl 答案在一些微小的细节上略有不同,我的更好理解,但他的解法更简单。 我写的过程中,需要注意下标和字符…

记一次空字符串判断的大坑

1. 控制台打印数据如下 2.尝试做判断 如图我肉眼看到的是 " " 于是我做了如下判断 结果竟然是false 我做了修改 竟然还是false 3. 开始各种转数据类型 发现了问题,空字符串的布尔值应该是false,但是这个玩意儿是true 4. 查看数据 我发现在往控制台粘贴数据时,是个…

SAP SD之如何定义销售组织(Sales Organization)

目录 前言 一、注意点 二、创建步骤 1.Step By Step 总结 前言 SAP中的销售组织是SD中的最高级别组织单位,负责公司中发生的所有销售和服务活动。销售组织是根据公司的销售需求在SAP中定义的。控制向客户销售、谈判销售等条款。它只能分配给一个公司代码和一个…

Python(Web时代)—— Django数据库整合

简介 ORM框架介绍 ORM(Object Relation Mapping)框架,可以帮助我们把类和数据表进行一个映射,让我们可以通过类和类对象来直接操作数据库中的数据。 优势:根据对接的数据库引擎翻译成对应的sql语句,所以…

平均值和方差的点估计、区间估计

0,预备知识 0.1,中心极限定理 0.2,均值的标准误差 0.3,卡方分布 1,总体均值的无偏估计量 2.1,当总体方差已知时对样本均值的描述(Z统计量) 2.2,当总体方差未知时对样本均…

RabbitMq深度学习

什么是RabbitMq? RabbitMQ是一个开源的消息队列中间件,它实现了高级消息队列协议(AMQP)。它被广泛用于分布式系统中的消息传递和异步通信。RabbitMQ提供了一种可靠的、可扩展的机制来传递消息,使不同的应用程序能够相互之间进行…

成都优优聚:美团代运营趋势在哪儿?

美团代运营作为一种经营模式,在当今日益竞争激烈的市场中扮演着重要的角色。它为商家提供了全方位的服务,从市场推广到订单管理,从团购券的制作到售后服务,帮助商家解决了运营中的各种难题。 首先,美团代运营的核心优势…

重磅OpenAI发布ChatGPT企业版本

8月29日凌晨,Open AI官网发布ChatGPT企业版本! 企业版简介: ChatGPT企业版提供企业级安全和隐私、无限的高速 GPT-4 访问、用于处理更长输入的更长上下文窗口、高级数据分析功能、自定义选项等等。人工智能可以协助和提升我们工作生活的各个…

DEA创建maven项目,项目结构无src目录和pom.xml文件内容

File > Settings > Build,Execution,Deployment > Build Tools > Maven > Runnner,界面中VM Options 输入框中填入-DarchetypeCataloginternal,重启IDEA,打开即会有src目录和pom.xml文件。 -DarchetypeCataloginternal -DarchetypeCatal…

【校招VIP】产品思维设计之用户需求分析

考点介绍: 理解用户需求时需要我们在看待产品的时候不能以我们创造者的专业身份来看,而需要用同理心,将自己转变为一个产品的典型用户,才能准确挖掘到用户心底最真实的诉求。 『产品思维设计之用户需求分析』相关题目及解析内容可…

新版白话空间统计(26)标准距离

前文再续,书接上一回。 上次我们讲了方向分布工具,这个工具会生成一个标准差椭圆,其中有这样的一句话描述: “短半轴表示数据分布的范围,短半轴越短,表示数据呈现的向心力越明显;反之&#xf…

探索OLED透明屏的优缺点:引领科技未来的革命性突破

OLED透明屏作为一项革命性的创新技术,其令人惊叹的透明度和柔性性能引起了全球范围内的关注。 然而,了解OLED透明屏的优缺点对于我们全面认识其在科技未来中的地位至关重要。 今天,尼伽将深入探讨OLED透明屏的优势和限制,并借助…

耐世特Nexteer EDI解决方案

耐世特Nexteer曾经为美国通用汽车全资子公司,是一家集研发、制造、销售于一体的全球化集团公司。耐世特汽车系统公司是转向系统及相关先进技术的全球供应商。该公司为60多家汽车制造商设计、制造、销售电动助力转向器、液压助力转向器、转向管柱和传动轴产品&#x…

Nacos基础(3)——nacos+nginx 集群的配置和启动 端口开放 nginx反向代理nacos集群

目录 引出nacos集群nginx反向代理nacos集群停止单例nacos准备8848和8858修改cluster.conf配置【配置】修改启动配置文件【配置】开放8858的端口分别以集群方式启动【启动】前端访问查看生产者测试8858nacos nginx反向代理配置代理tcp代理http启动nginx反向代理容器生产者访问测…

C++内存分区模式

内存分区模型 代码区:存放函数体的二进制代码,由操作系统管理的全局区:存放全局变量和静态变量以及常量栈区:由编辑器自动分配释放,存放函数的参数值,局部变量等堆区:由程序员分配和释放&#…

【操作记录】pytorch_geometric安装方法

pytorch_geometric安装方法 github地址 主要不要直接pip install安装,会由于依赖无法安装而失败 点击here手动安装依赖 选择对应的pytorch版本,我的是Win10 Python3.8.3Pytorch1.8.1CUDA10.2 手动下载四个依赖包本地安装: 主要不要直接&am…

高效高精分板的关键驱动装置:PCB分板机切割主轴

随着电子制造业的快速发展,分板机成为了一种必不可少的生产设备,PCB分板机切割主轴作为关键驱动装置,扮演着重要的角色。 PCB分板机切割主轴由电机、轴承、传动系统和控制系统等组成。电机产生的动力通过传动系统传递给主轴,主轴…

项目经理常用工具01

主要工具 表达工具—SCRTV方法 情境 Scene:明确问题:是什么?冲突 Confilict:提出疑问:怎么了?原因 Reason:分析原因:为什么?策略 Tactics:进行决策:怎么办…

运用Python解析HTML页面获取资料

在网络爬虫的应用中,我们经常需要从HTML页面中提取图片、音频和文字资源。本文将介绍如何使用Python的requests库和BeautifulSoup解析HTML页面,获取这些资源。 一、环境准备 首先,确保您已经安装了Python环境。接下来,我们需要安…