当前位置: 首页 > news >正文

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)

相关文章:

Linux环境开启MongoDB的安全认证

文章目录 1. MongoDB安全认证简介1.1 访问控制1.2 角色1.3 权限 2. MongoDB中的常见角色3. MongoDB Shell3.1 下载MongoDB Shell3.2 通过MongoDB Shell连接MongoDB 4. 创建管理员用户5. 为具体的数据库创建用户6. 开启权限认证7. 重启MongoDB服务8. 连接MongoDB9. MongoDB数据库…...

django基于Python的农产品销售系统的设计与实现

摘 要 随着现代人们的快速发展,农产品销售系统已成为农产品的需求。该平台采用Python技术和django搭建系统框架,后台使用MySQL数据库进行信息管理;通过个人中心、用户管理、商家管理、产品类型管理、农产品管理、系统管理、订单管理等功能&a…...

linux复习5:C prog

编辑 缩排 为了使C源代码更加整洁易读,可以使用一些工具来自动格式化代码,例如cb(C程序美化器)、bcpp(C美化器)和indent等。 编译 编译并链接C文件 gcc hello.c -o hello 将 hello.c 编译并链接成可执行文…...

Go语言24小时极速学习教程(三)常见标准库用法

常见标准库 常见标准库即Go语言自带的库,这里的所有包都可以通过import直接引入,如果你觉得实在是不好用,那么请先保证你学会了标准库的基础上,再学一下Gookit,特别是其中的GoUtil,千万不要轻易自己去造轮…...

大数据环境下的高效数据清洗策略

大数据环境下的高效数据清洗策略 在当今这个信息爆炸的时代,大数据已成为企业决策和科学研究不可或缺的重要资源。然而,数据的海量性、多样性和复杂性也给数据处理带来了前所未有的挑战,其中数据清洗是确保数据质量和后续分析准确性的关键步…...

基于SpringBoot3+mybatis搭建的历史上的今天API接口服务 及 Mybatis 应该有个更好的方法来隐藏 Pojo 类中的字段

一、Mybatis有没有比较好的方法隐藏 Pojo 类中的字段 使用 Mybatis 时,为了实现通用的CURD,在定义实体类pojo时,会尽量将能用得上的数据库字段都定义到 pojo中,但是在查询的时候却有不一样的需求。mybatis的文档地址链接&#xff…...

Python 3 字符串

Python 3 字符串 字符串在Python中是一种基本的数据类型,用于存储文本数据。Python中的字符串是不可变的,这意味着一旦创建了一个字符串,就不能更改其内容。字符串可以用单引号()、双引号("&#xff…...

Android集成FCM(Firebace Cloud Messaging )

集成FCM官方文档 Firebace主页面 将 Firebase 添加到您的 Android 应用 1、进入Firebace页面,创建自己的项目 2、点击自己创建好的项目,在右侧选择Cloud Messaging 3、点击Android去创建 google-services.json 4、将下载的 google-services.json 文件…...

基于 RBF 神经网络辨识的单神经元 PID 模型参考自适应控制

这是一个基于 RBF 神经网络辨识 和 单神经元 PID 模型参考自适应控制 的系统框图,包含以下主要部分: RBF 神经网络模块:用于对系统进行辨识,输入误差 e(t)e(t)e(t) 和误差变化量 Δe(t)\Delta e(t)Δe(t),输出与系统特…...

2024年 Web3开发学习路线全指南

Web3是一个包含了很多领域的概念,不讨论币圈和链圈的划分,Web3包括有Defi、NFT、Game等基于区块链的Dapp应用的开发;也有VR、AR等追求视觉沉浸感的XR相关领域的开发;还有基于区块链底层架构或者协议的开发。 这篇文章给出的学习路…...

Ubuntu22.04LTS 部署前后端分离项目

一、安装mysql8.0 1. 安装mysql8.0 # 更新安装包管理工具 sudo apt-get update # 安装 mysql数据库,过程中的选项选择 y sudo apt-get install mysql-server # 启动mysql命令如下 (停止mysql的命令为:sudo service mysql stop&#xff0…...

「Mac玩转仓颉内测版23」基础篇3 - 深入理解整数类型

本篇将详细讲解Cangjie中的整数类型,探讨整数的定义、操作、表示范围、进制表示、类型转换及应用场景,帮助开发者在Cangjie中灵活运用整数类型构建程序逻辑。 关键词 有符号整数与无符号整数表示范围与溢出进制表示类型转换字面量与操作 一、整数类型概…...

渗透测试导学

渗透测试导学 渗透测试概念 渗透测试是干什么? 渗透测试的定义和目的:渗透测试是一种通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全性能的评估方法。它的目的是通过识别安全问题,帮助了解当前的安全状况,从而…...

Django实现智能问答助手-基础配置

设置 Django 项目、创建应用、定义模型和视图、实现问答逻辑,并设计用户界面。下面是一步一步的简要说明: 目录: QnAAssistant/ # 项目目录 │ ├── QnAAssistant/ # 项目文件夹 │ ├── init.py # 空文件 │ ├── settings.py # 项目配…...

亚马逊商品详情API接口解析,Json数据示例返回

亚马逊的商品详情API接口(如Amazon Product Advertising API)允许开发者获取商品的详细信息,包括价格、描述、图片URL等。以下是一个示例的JSON数据返回结构,以及相应的解析说明。请注意,实际返回的数据结构可能会根据…...

git根据远程分支创建本地新分支

比如我当前本地仓库有4个 remote 仓库&#xff0c;我希望根据其中的一个 <remote>/<branch> 创建本地分支&#xff1a; 先使用 github fetch <remote> 拉取 <remote> 的分支信息&#xff0c;然后在 git checkout -b 创建新分支时使用 -t <remote>…...

Android U 多任务启动分屏——SystemUI流程(更新中)

前文 Android U 多任务启动分屏——Launcher流程&#xff08;下分屏&#xff09; 前文说到通过ISplitScreen接口跨进程调用到了SystemUI进程&#xff0c;我们继续分析分屏在systemui中的实现。 wmshell实现分屏 实现ISplitScreen接口 代码路径&#xff1a;frameworks/base/…...

使用SaaS化的Aurora应用快速搭建私人ChatGPT助手

使用SaaS化的Aurora应用快速搭建私人ChatGPT助手 简介&#xff1a; Aurora是一个带UI且免费的GPT私人聊天助手&#xff0c;可切换GPT-3.5&#xff0c;4&#xff0c;4o等常用版本。用户可通过部署Aurora&#xff0c;快速打造自己专属的AI助手。阿里云计算巢已将Aurora打包为SaaS…...

.NET 9与C# 13革新:新数据类型与语法糖深度解析

记录&#xff08;Record&#xff09;类型 使用方式&#xff1a; public record Person(string FirstName, string LastName); 适用场景&#xff1a;当需要创建不可变的数据结构&#xff0c;且希望自动生成 GetHashCode 和 Equals 方法时。不适用场景&#xff1a;当数据结构需…...

2.fs文件系统模块

文章目录 [TOC](文章目录)2.5.练习-成绩管理2.5.1在files文件夹下新建成绩.txt文件2.5.2.新建对应的js文件 2.6.fs模块-路径动态拼接的问题 3.path路径模块3.1什么是path路径模块3.2.路径拼接3.3.获取路径中的文件名3.4.获取路径中的文件扩展名3.5.案例3.5.1.步骤13.5.2.调用fs…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...