Linux环境开启MongoDB的安全认证

文章目录

  • 1. MongoDB安全认证简介
    • 1.1 访问控制
    • 1.2 角色
    • 1.3 权限
  • 2. MongoDB中的常见角色
  • 3. MongoDB Shell
    • 3.1 下载MongoDB Shell
    • 3.2 通过MongoDB Shell连接MongoDB
  • 4. 创建管理员用户
  • 5. 为具体的数据库创建用户
  • 6. 开启权限认证
  • 7. 重启MongoDB服务
  • 8. 连接MongoDB
  • 9. MongoDB数据库被黑的情况

阅读本文前可以先阅读以下文章:

  • Linux环境下安装MongoDB
  • MongoDB快速入门(MongoDB简介、MongoDB的应用场景、MongoDB中的基本概念、MongoDB的数据类型、MongoDB的安装与部署、MongoDB的常用命令)
  • MongoDB的常用命令(数据库操作、集合操作、文档操作)

1. MongoDB安全认证简介

默认情况下,MongoDB 实例启动运行时是没有开启用户访问权限控制的,也就是说任何客户端都可以随意连接到MongoDB实例进行各种操作,MongoDB 不会对连接客户端进行用户验证,这是非常危险的


为了保障 MongoDB 的安全,MongoDB 官网给出了以下建议:

  1. 使用新的端口:如果使用默认的 27017 端口,一旦知道了 IP 地址就能连接上,不太安全
  2. 设置 MongoDB 的网络环境:将 MongoDB 部署到公司服务器内网,这样外网是访问不到的,公司内部使用 VPN 访问
  3. 开启安全认证:既要设置服务器之间的内部认证方式,也要设置客户端连接到集群的账号密码认证方式

本文采用开启安全认证的方式,在此之前,我们先来了解三个概念:访问控制、角色、权限

1.1 访问控制

MongoDB 使用基于角色的访问控制(Role-Based Access Control,RBAC)来管理用户对实例的访问

通过对用户授予一个或多个角色来控制用户访问数据库资源的权限和数据库操作的权限,在对用户分配角色之前,用户无法访问实例

1.2 角色

在 MongoDB 中通过角色对用户授予相应数据库资源的操作权限,每个角色当中的权限可以显式指定,也可以通过继承获得其他角色的权限

1.3 权限

权限由指定的数据库资源(resource)以及允许在指定资源上进行的操作(action)组成

  1. 资源(resource)包括:数据库、集合、部分集合和集群
  2. 操作(action)包括:对资源进行的增、删、改、查(CRUD)操作

2. MongoDB中的常见角色

角色名称数据库描述
read单个数据库允许用户读取指定数据库的所有数据。
readWrite单个数据库允许用户读取和写入指定数据库的所有数据。
dbAdmin单个数据库允许用户执行管理操作,如索引创建、删除以及查看统计信息。
userAdmin单个数据库允许用户管理数据库的用户和角色。
clusterAdminadmin允许用户执行集群管理操作,如添加和删除节点、关闭节点等。
readAnyDatabaseadmin允许用户读取所有数据库。
readWriteAnyDatabaseadmin允许用户读取和写入所有数据库。
userAdminAnyDatabaseadmin允许用户管理所有数据库的用户和角色。
dbAdminAnyDatabaseadmin允许用户管理所有数据库。
rootadmin超级用户角色,具有最高的权限,可以对任何数据库执行任何操作。
backupadmin允许用户备份数据库。
restoreadmin允许用户从备份中恢复数据库。
hostManageradmin允许用户执行监控和管理服务器操作。
clusterMonitoradmin允许用户监控集群状态。
changeStream单个数据库允许用户监听变更流事件。
enableShardingadmin允许用户开启数据库的分片。
bypassDocumentValidation单个数据库允许用户绕过文档验证。

3. MongoDB Shell

3.1 下载MongoDB Shell

MongoDB 6.x 版本之后移除了 mongo 连接工具,需要自行下载 MongoDB Shell

下载地址:MongoDB Shell Download

MongoDB Shell 的官方文档:安装 mongosh


选择 Linux 发行版本的信息,选择 tgz 格式,最后点击 Copy link

在这里插入图片描述

在 Linux 终端执行下载命令(该命令会将文件下载到当前路径)

curl -o mongosh-2.3.3-linux-x64.tgz 复制的地址

查看已下载的文件

ls -l

在这里插入图片描述

将文件解压到当前目录

tar -zxvf mongosh-2.3.3-linux-x64.tgz

在这里插入图片描述

为 mongosh 文件赋予执行权限

chmod +x mongosh-2.3.3-linux-x64/bin/mongosh

将下载的二进制文件添加到PATH环境变量中

sudo cp mongosh-2.3.3-linux-x64/bin/mongosh /usr/local/bin/
sudo cp mongosh-2.3.3-linux-x64/bin/mongosh_crypt_v1.so /usr/local/lib/

3.2 通过MongoDB Shell连接MongoDB

MongoDB Shell 的官方教程:使用 MongoDB Shell 连接到 MongoDB 部署


使用以下命令连接 MongoDB

mongosh --host 127.0.0.1 --port 27017

连接成功的界面

在这里插入图片描述


附带用户名和密码的连接方式

mongosh --host 127.0.0.1 --port 27017 --username wuyanzu --password

在这里插入图片描述

4. 创建管理员用户

先切换到 admin 数据库

use admin;

接着创建一个管理员用户(密码中不要出现 #$!@ 等特殊符号)

db.createUser({user: "wuyanzu",pwd: "6nJPsG6m4ESx9mra",roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
});

命令中每个部分的详细解释:

  • db.createUser({ ... }):这是MongoDB的命令,用于在当前数据库实例中创建一个新的用户
  • user: "wuyanzu":这是新用户的用户名。在这个例子中,用户名是wuyanzu
  • pwd: "6nJPsG6m4ESx9mra":这是新用户的密码。在这个例子中,密码是UxrhiPSI9bh65mgs。在实际操作中,应该使用一个强密码来确保安全性
  • roles: [{ role: "userAdminAnyDatabase", db: "admin" }]:这是为新用户分配的角色列表。在这个例子中,用户被分配了一个角色
    • role: "userAdminAnyDatabase":这是分配给用户的角色名称。userAdminAnyDatabase是一个内置角色,它允许用户在任何数据库中管理用户和角色
    • db: "admin":这是角色将被分配的数据库。尽管userAdminAnyDatabase角色适用于所有数据库,但角色本身必须分配在admin数据库中,因为这是一个特殊的权限角色

在这里插入图片描述

5. 为具体的数据库创建用户

用管理员用户登录之后,为具体的数据库(比如一个叫做 article 的数据库)创建用户


首先切换到要创建用户的数据库(如果数据库不存在会自动创建)

use article;

创建一个用户并为用户授予适当的角色

db.createUser({user: "niekeyi",pwd: "rVEK8GfVjvM5NMUo",roles: [{ role: "readWrite", db: "article" },{ role: "dbAdmin", db: "article" }]
});

命令中每个部分的详细解释:

  • db.createUser({ ... }):这是MongoDB shell命令,用于在当前数据库实例中创建一个新的用户。
  • user: "niekeyi":这是新用户的用户名。在这个例子中,用户名设置为niekeyi
  • pwd: "rVEK8GfVjvM5NMUo":这是新用户的密码。在这个例子中,密码设置为rVEK8GfVjvM5NMUo
  • roles: [...]:这是一个数组,用于指定分配给新用户的角色列表。角色定义了用户在数据库中的权限。
    • { role: "readWrite", db: "article" }:这表示新用户在article数据库中拥有读写权限。readWrite角色允许用户执行以下操作:
      • 读取所有非系统集合的数据。
      • 插入、更新和删除数据。
    • { role: "dbAdmin", db: "article" }:这表示新用户在article数据库中拥有数据库管理权限。dbAdmin角色允许用户执行以下操作:
      • 创建和删除索引。
      • 收集统计信息。
      • 视图管理。
      • 复制数据库中的数据。
      • 备份数据库(尽管通常备份是通过MongoDB的工具如mongodump来执行的)。
      • 恢复数据库(通常通过mongorestore工具)。

在这里插入图片描述

6. 开启权限认证

修改 MongoDB 的配置文件,开启权限认证

vim /home/ubuntu/mongodb/single/mongod.conf
security:authorization: enabled

在这里插入图片描述

完整的配置文件(已开启安全认证)

systemLog:# MongoDB 发送所有日志输出的目标指定为文件# The path of the log file to which mongod or mongos should send all diagnostic logging informationdestination: file# mongod 或 mongos 应向其发送所有诊断日志记录信息的日志文件的路径path: "/home/ubuntu/mongodb/single/log/mongod.log"# 当 mongos 或 mongod 实例重新启动时,mongos 或 mongod 会将新条目附加到现有日志文件的末尾logAppend: truestorage:# mongod 实例存储其数据的目录。storage.dbPath 设置仅适用于 mongod# The directory where the mongod instance stores its data. Default Value is "/data/db"dbPath: "/home/ubuntu/mongodb/single/data/db"# processManagement:security:authorization: enablednet:# 服务实例绑定的 IP,默认是 127.0.0.1# bindIp: 127.0.0.1bindIp: 0.0.0.0# 绑定的端口,默认是 27017port: 27017

7. 重启MongoDB服务

输入以下指令重启 MongoDB 服务

sudo systemctl restart mongodb.service

8. 连接MongoDB

通过 Compass 或 navicat 等工具连接 MongoDB

在这里插入图片描述

选择通过用户名和密码进行验证

在这里插入图片描述

在这里插入图片描述

如果连接失败,需要指定数据库

在这里插入图片描述

9. MongoDB数据库被黑的情况

如果是在云服务器上部署的 MongoDB,一定要开启安全认证,否则你的 MongoDB 数据库将在极短的时间内被黑

在这里插入图片描述

MongoDB 被黑之后,将会出现一个名为 READ__ME_TO_RECOVER_YOUR_DATA 的数据库,数据库中会有一个名为 README 的集合,集合中会有一个文档,文档的内容大概如下:

{
_id: ObjectId(‘672c2dcafbee857340b0b1b1’),
content: ‘All your data is backed up. You must pay 0.0053 BTC to bc1q307y2v8aujqwrej8m9v998yj0m242km989t8d2 In 48 hours, your data will be publicly disclosed and deleted. (more information: go to http://2fix.info/mdb)After paying send mail to us: dzen+1amnxt@onionmail.org and we will provide a link for you to download your data. Your DBCODE is: 1AMNXT’
}

{_id: ObjectId('672c2dcafbee857340b0b1b1'),content: 'All your data is backed up. You must pay 0.0053 BTC to bc1q307y2v8aujqwrej8m9v998yj0m242km989t8d2 In 48 hours, your data will be publicly disclosed and deleted. (more information: go to http://2fix.info/mdb)After paying send mail to us: dzen+1amnxt@onionmail.org and we will provide a link for you to download your data. Your DBCODE is: 1AMNXT'
}

简单翻译一下就是:你的数据被我黑掉了,要想拿回你的数据,就在 48 小时内打钱给指定的账户(而且还要用比特币),否则你的数据将会在公开后被删除

  • 知名服务使用的端口(如 MySQL 服务使用的 3306 端口、Redis 服务使用的 6379 端口、MongoDB 服务使用的 27017 端口),如果不开启安全认证,或者密码的安全等级太低,是很容易被爆破的
  • 为了避免 MongoDB 数据库被黑,我们一定要开启 MongoDB 的安全认证(必要情况下可以使用新的端口来部署 MongoDB)

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

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

相关文章

Flutter封装Coap

前言 我们根据Coap数据通信流程写一个公共组件,用户只要在原本的组件外嵌套这个公共组件就可以使用Coap的功能,这样做更加的方便便捷。 具体步骤 封装一个udp函数 创建一个工厂函数,工厂函数初始化时监听广播数据发送广播函数&#xff1a…

探索 Vue.js:构建交互式前端的强大工具

在当今的 web 开发领域,前端技术日新月异,而 Vue.js 作为一款备受瞩目的 JavaScript 框架,以其简洁易用、高效灵活的特点,赢得了众多开发者的青睐。今天,就让我们深入了解一下 Vue.js 的相关知识,同时也探讨…

Java方法中的可变参数列表

在Java中,可变参数列表(Variable Argument List)允许方法接受不定数量的参数。可变参数列表通过在方法参数类型后加上三个点(...)来定义。可变参数列表实际上是一个数组,因此可以在方法内部像操作数组一样操…

PVE的优化与温度监控(二)—无法识别移动硬盘S.M.A.R.T信息的思考并解决

前情提要:空闲2.5英寸机械硬盘,直接放到PVE上测试NAS 使用,通过SATA线的方式让小主机不太美观,并且失去了前期调试的安全性。购入移动硬盘盒,缺点,USB 连接,会失去一些特性。比如本文中遇到的问…

嵌入式硬件实战基础篇(二)-稳定输出3.3V的太阳能电池-无限充放电

引言:本内容主要用作于学习巩固嵌入式硬件内容知识,用于想提升下述能力,针对学习稳压芯片和电容以及电池之间的运用,对于硬件PCB以及原理图的练习和前面硬件篇的实际运用;太阳能是一种清洁、可再生的能源,广…

Word和Excel使用有感

1.画图 折线图:适用于多个y值的画图 散点图:适合需要对x轴进行自定义时使用 2.word和excel的联动 1)excel中的数据导入word直接复制即可 若是表格中的数据要导入word 则先将表格中的数据拆分出来,再直接复制到word中 2&#…

OpenCV相机标定与3D重建(3)校正鱼眼镜头畸变的函数calibrate()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::fisheye::calibrate 函数是 OpenCV 中用于校正鱼眼镜头畸变的一个重要函数。该函数通过一系列棋盘格标定板的图像来计算相机的内参矩阵和畸变…

【过程控制系统】第6章 串级控制系统

目录 6. l 串级控制系统的概念 6.1.2 串级控制系统的组成 6.l.3 串级控制系统的工作过程 6.2 串级控制系统的分析 6.2.1 增强系统的抗干扰能力 6.2.2 改善对象的动态特性 6.2.3 对负荷变化有一定的自适应能力 6.3 串级控制系统的设计 6.3.1 副回路的选择 2.串级系…

24/11/22 项目拆解 艺术风格转移

我们有时候想把两种艺术风格整合,创造更具艺术特色的艺术品,人很难办到,但是人工智能可以,比如下面将艺术画的风格转移到照片上。 我们先来初步了解一下实现上述功能的数学原理 所谓艺术风格,其实就是边缘,颜色&#…

中断的详细流程

一、中断请求 中断请求是中断过程的起始阶段,由需要CPU服务的外设(中断源)向CPU发出请求信号。这个信号可以是电平信号或边沿信号,具体取决于中断系统的设计和中断源的类型。 二、中断判优 当系统中存在多个中断源时&#xff0…

Unity图形学之CubeMap立方体贴图

1.CubeMap:有六个面的贴图组成 2. 假反射:反射天空盒子 (1)正常UV采样: (2)Cube的采样:利用反射角采样,反射角X和Cube的交点采样 Shader "Custom/TestReflect"…

LLM Inference Unveiled

题目:LLM Inference Unveiled: Survey and Roofline Model Insights 链接:https://arxiv.org/abs/2402.16363 这也是一篇推理加速的综述,重点关注一下它的组织结构吧,也就是它对推理加速方法的分类 论文给的全文结构图&#xff…

Cesium的ClearCommand的流程

ClearCommand是在每帧渲染前可以将显存的一些状态置为初始值,就如同把擦黑板。当然也包括在绘制过程中擦掉部分的数据,就如同画家在开始绘制的时候会画导览线(如透视线),轮廓出来后这些导览线就会被擦除。 我画了一个…

【系统架构设计师】真题论文: 论企业应用系统的分层架构风格 (包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2013年 试题1)解题思路论文素材参考常见分层架构模式分层架构风格的优势分层架构风格在企业应用系统中的应用案例真题题目(2013年 试题1) 软件架构风格是描述一类特定应用领域中系统组织方式的惯用模…

【Linux】重定向,dup

目录 文件描述符分配规则 重定向 dup ​编辑 输出重定向 追加重定向 输入重定向。 重定向会影响后面的程序替换吗? 1号文件和2号文件 2号文件输出重定向 下标之间的重定向 文件描述符分配规则 重定向 把显示器文件关闭后,本来应该写给显示器…

大语言模型---梯度的简单介绍;梯度的定义;梯度计算的方法

1. 梯度介绍 如果我们在一座山上(一个山的坡度有很多,陡峭的,平缓的),想要从山顶下山。而梯度就像告诉我们如何沿着最陡的下坡路线走,以尽快到达山脚(最低点)。 2. 梯度的定义 梯度…

【JAVA】一次操蛋的nginx镜像之旅

一、前言 由于我们的项目中使用到了nginx,同时我们的nginx是通过docker镜像进行安装的,由于nginx出现了问题,需要重新安装。于是。。。 二、通过docker进行安装 docker pull nginx:latest 1.5.2 脚本文件 在/home/docker/script路径下创…

ubuntu24挂载硬盘记录

1、显示硬盘及所属分区情况。在终端窗口中输入如下命令: sudo fdisk -l 找到自己硬盘的分区 我的地址/dev/sda 2、显示硬盘及所属分区情况。在终端窗口中输入如下命令,格式化自己硬盘: sudo mkfs -t ext4 /dev/sda 3、在终端窗口中输入如下…

力扣第 60 题 “第 k 个排列”

题目描述 给定整数 n 和 k,返回由 1 到 n 组成的排列中第 k 个排列。 所有排列按字典序排列。1 ≤ n ≤ 9,1 ≤ k ≤ n!。 解题思路 要快速找到第 k 个排列,可以利用数学方法而不是生成所有排列: 1. 知识点:阶乘与…

springcloud读取nacos配置中心的json文件

由于业务需要,将一些json数据存放到了nacos配置中心上 ①服务启动读取nacos进行数据初始化 Slf4j Component Data public class NacosJsonInitializeRunner implements ApplicationRunner{//以下属性都是nacos相关的Value("${nacos.config.server-addr}&quo…