Linux环境开启MongoDB的安全认证

embedded/2024/11/24 1:51:45/

文章目录

  • 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.ppmy.cn/embedded/139998.html

相关文章

优化装配,提升品质:虚拟装配在汽车制造中的关键作用

汽车是各种零部件的有机结合体,因此汽车的装配工艺水平和装配质量直接影响着汽车的质量与性能。在汽车装配过程中,经常会发生零部件间干涉或装配顺序不合理等现象,且许多零部件制造阶段产生的质量隐患要等到实际装配阶段才能显现出来&#xf…

mysql 去重 补全 取出重复 变量 函数 和存储过程

连接更新 UPDATE JOIN SET UPDATE Sheet4 us JOIN () temp ON us.id temp.idSET us.name temp.name;补全查询 COALESCE LAG OVER SELECTid,COALESCE (NAME,LAG( NAME ) OVER ( ORDER BY id )) FROMusers源数据: 张三 123 李四 4567 补全后的:&#x…

ONVIF协议操作摄像头方法

一.前言 简单介绍一下涉及到的名称。SOAP是一种基于XML的RPC协议规范,gSOAP是一个开发SOAP和XML应用(它们组成了webservice)的工具。ONVIF协议就是在SOAP协议规范的基础之上定义的一套用于网络摄像机的标准协议。 二.gsoap工具 gsoa…

Java与Kotlin在鸿蒙中的地位

在当今移动操作系统领域,华为推出的鸿蒙系统(HarmonyOS)正逐渐崭露头角,成为与Android、iOS并驾齐驱的操作系统之一。对于开发者而言,了解如何为鸿蒙系统开发高质量的应用程序变得至关重要。在这篇文章中,我…

Kafka-Controller角色需要做什么?

一、上下文 《Kafka-Controller选举》博客中分析了Controller是如何选举出来的,且比如会执行onControllerFailover()。接下来让我们看看Controller角色都承担了哪些职责。 二、注册监听器 在从zookeeper读取资源前,注册监听器以获取 broker/topic 的回…

雷达图像用dB使图像细节更好

数字例子:雷达图像转换为dB尺度的影响 假设我们有一个雷达图像,其Sigma0值的线性表示如下: 像素A的Sigma0值为0.2(较暗)像素B的Sigma0值为1.0(中等亮度)像素C的Sigma0值为5.0(较亮…

Nginx通过url获取代理地址,动态代理

目的 底层服务返回的ws地址代理成wss的, 但是我们不知道底层服务返回的地址ip port所以 通过拼接的方式来通过url信息中获取到ws地址信息,进行动态代理 nginx.conf server {listen 11081 ssl;server_name localhost11081;rewrite ^/old-url$ /new-url permanent;add_…

如何在WPF中嵌入其它程序

在WPF中嵌入其它程序&#xff0c;这里提供两种方案 一、使用WindowsFormHost 使用步骤如下 1、添加WindowsFormsIntegration和System.Windows.Forms引用 2、在界面上放置WindowsFormHost和System.Windows.Forms.Panel 1 <Grid> 2 <WindowsFormsHost> 3…