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

前言

前面文章中通过客户端工具(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.mzph.cn/news/61652.shtml

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

相关文章

【webpack】HMR热更新原理

本文:参考文章 一、HMR是什么,为什么出现 1、出现的原因 之前,应用的加载、更新都是一个页面级别的操作,即使单个代码文件更新,整个页面都要刷新,才能拿到最新的代码同步到浏览器,导致会丢失…

创作纪念日-我的第1024天

机缘 不知不觉已经成为创作者的第1024天啦… … 刚开始接触博客的初衷就是为了记笔记📒、记总结📝,或许对于当时就等同于是为了找工作。坚持学习并持续输出博客一年后,这时我发现再写博客,不在是为了找一份工作&…

python-华为云modelarts的免费codelab运行chatglm2-6b-int4

前提:当前提供 了8核64G的免费体验规格,每天三个小时限额 地址:https://console.huaweicloud.com/modelarts/?regioncn-north-4#/dashboard 下载模型:请参考另一个文章 创建环境(自带环境是pytorch1.8的,…

大数据精准营销怎么满足用户的个性化需求?

近年来在AI和媒体的带动下,大数据分析不断介入,各行各业都开始陆续依仗大数据营销这棵大树,以此来更加高效、便捷、智能、精准的服务于用户。 这就像追求恋人一样,投其所好方能成为眷属。 大数据精准营销的好处: 相…

Spring Cloud 微服务2

Eureka 注册中心,服务的自动注册、发现、状态监控 Ribbon 负载均衡,Eureka中已经集成了负载均衡组件 Hystrix 熔断器,用于隔离访问远程服务、第三方库,防止出现级联失败。 Feign 远程调用,将Rest的请求进行隐藏&a…

【SpringBoot】Swagger和knife4j的使用

文章目录 前言1.什么是Swagger和Knife4j2.Swagger和Knife4j怎么用2.1 引入依赖2.2 设置配置类2.3 启动验证 3.完结撒花 前言 springboot笔记集合: springboot笔记合计 没用的废话理论不多说,会用就完了 1.什么是Swagger和Knife4j Swagger是一种开源的API描述语言…

排序之选择排序

文章目录 前言一、直接选择排序1、直接选择排序基本思想2、直接选择排序代码实现3、直接选择排序的效率 二、堆排序1、堆排序2、堆排序的效率 前言 选择排序的基本思想就是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,…

Java 的线程安全机制之`synchronized`

前言:首先,线程表示一条单独的执行流,每个线程有自己的执行计数器,有自己的栈,但可以共享内存,共享内存是实现线程协作的基础,但共享内存有两个问题,竞态条件和内存可见性。解决这些…

pdf文件打开后部分文字无法显示

场景:pdf文件在系统内预览正常,但是下载到本地电脑上,使用wps查看,部分标题会消失,只有标题里面的数字还能显示出来 经过一系列排查,发现查看的电脑上缺失了字体,使用wps查看时,缺失…

TCP/IP五层模型、封装和分用

1.网络通信基础2.协议分层OSI七层协议模型TCP/IP五层/四层协议模型【重点】 3. 封装&分用 1.网络通信基础 IP地址:表示计算机的位置,分源IP和目标IP;举个例子:买快递,商家从上海发货,上海就是源IP&…

分布式锁,使用方案

1、锁方案: 可以往数据库中插入一条数据,这条数据利用 唯一索引 使数据是唯一的。 能插入,就表示数据没有锁,可以正常执行 插入报错 ‘数据的唯一性’ ,则表示数据已经枷锁了,不能执行 执行完成后&#xff…

MySQL之脏读,不可重复读与幻读的概念及区别

MySQL是一款常用的关系型数据库,但在使用过程中,可能会遇到一些问题,比如脏读、不可重复读和幻读。这些问题可能会导致数据的不一致性,因此需要了解它们的概念及区别。 1. 脏读 首先是脏读。脏读是指在一个事务中读取了另一个事…

【高阶数据结构】AVL树 {概念及实现;节点的定义;插入并调整平衡因子;旋转操作:左单旋,右单旋,左右双旋,右左双旋;AVL树的验证及性能分析}

AVL树 一、AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明…

Vite学习笔记

前言: 在浏览器支持 ES 模块之前,JavaScript 并没有提供原生机制让开发者以模块化的方式进行开发。这也正是我们对 “打包” 这个概念熟悉的原因:使用工具抓取、处理并将我们的源码模块串联成可以在浏览器中运行的文件。 打包构建工具演变&a…

Java泛型机制

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:每天一个知识点 ✨特色专栏&#xff1a…

【UE 材质】模型部分透明

材质节点如下,这里简单解释一下。首先通过“Mask”节点将"Texture Coordinate" 节点中的“G”通道分离出来,然后通过“if”节点进行判断,当值小于0.5时为透明,当颜色不小于5时为不透明。可以通过一个参数来控制模型透明…

会不会激发对modern c++的新兴趣

可变参数好像很厉害的样子&#xff0c;会节省很多手写代码&#xff0c;让编译器自动帮我们生成代码 template<typename Fun, typename...Args> void invoke(Fun&& fun, Args&&...args) { fun(std::forward<Args>(args)...); } 任意函数包装器…

云计算的三个主要服务模型:IaaS、PaaS 和 SaaS

文章目录 介绍基础设施即服务&#xff08;Infrastructure as a Service&#xff0c;IaaS&#xff09;平台即服务&#xff08;Platform as a Service&#xff0c;PaaS&#xff09;软件即服务&#xff08;Software as a Service&#xff0c;SaaS&#xff09; 区别基础设施即服务&…

Java“牵手”天猫淘口令转换API接口数据,天猫API接口申请指南

天猫平台商品淘口令接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取天猫商品的标题、价格、库存、商品快递费用&#xff0c;宝贝ID&#xff0c;发货地&#xff0c;区域ID&#xff0c;快递费用&#xff0c;月销量、总销量、库存、详情描…

代码随想录第五十天|123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 题目链接/文章讲解/视频讲解&#xff1a;代码随想录 1.代码展现 //123.买卖股票的最佳时机 int maxProfit(vector<int>& prices) {if (prices.size() 1) {return 0;}//step1 构建dp数组vector<vector<int>> dp(prices.size(…