在Ubuntu 16.04上安装和保护MongoDB的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

简介

MongoDB 是一个免费且开源的面向文档的数据库。它被归类为 NoSQL 数据库,因为它不依赖于传统的基于表的关系型数据库结构。相反,它使用类似 JSON 的动态模式文档。与关系型数据库不同,MongoDB 在向数据库添加数据之前不需要预定义模式。您可以随时和任意次数地更改模式,而无需设置具有更新后模式的新数据库。

在本教程的第一部分中,我们将使用 MongoDB 仓库来安装最新版本的 MongoDB。在第二部分中,我们将启用身份验证以在本地系统上进行安全设置。最后,在第三部分中,我们将展示如何更安全地允许远程连接(如果需要的话)。

先决条件

要按照本教程操作,您需要:

  • 一个配置了非 root sudo 用户和防火墙的 Ubuntu 16.04 服务器,可以按照 Ubuntu 16.04 初始服务器设置指南进行配置。

当这些条件都满足时,您就可以开始操作了。

第一部分:设置服务器

步骤 1 — 添加 MongoDB 仓库

MongoDB 已经包含在 Ubuntu 软件包仓库中,但官方的 MongoDB 仓库提供了最新版本,并且是安装该软件的推荐方式。在这一步中,我们将向服务器添加官方仓库。

Ubuntu 通过验证软件包是否使用 GPG 密钥签名来确保软件包的真实性,因此我们首先需要导入官方 MongoDB 仓库的密钥。

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

以下输出确认了我们已成功导入密钥:

执行: /tmp/tmp.IdwenTia0s/gpg.1.sh --keyserver
hkp://keyserver.ubuntu.com:80
--recv
0C49F3730359A14518585931BC711F9BA15703C6
gpg: requesting key A15703C6 from hkp server keyserver.ubuntu.com
gpg: key A15703C6: public key "MongoDB 3.4 Release Signing Key <packaging@mongodb.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

接下来,我们将添加 MongoDB 仓库的详细信息,以便 apt 知道从哪里下载软件包。执行以下命令创建 MongoDB 的列表文件。

echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

最后,我们将更新软件包列表。

sudo apt-get update

现在我们已经准备好安装 MongoDB 了。

步骤 2 — 安装 MongoDB

我们将在服务器上安装 mongodb-org 元包,该包包括守护程序、配置和初始化脚本、shell 和管理工具。

sudo apt-get install mongodb-org

在提示时按 Enter 键或输入 Y 继续。安装完成后,我们将启动 Mongo 守护程序:

sudo systemctl start mongod

由于 systemctl 不提供输出,我们将检查状态以验证服务是否已正确启动。

sudo systemctl status mongod
● mongod.service - 高性能、无模式文档导向数据库Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)Active: active (running) since Fri 2017-02-17 18:57:26 UTC; 17min agoDocs: https://docs.mongodb.org/manualMain PID: 2811 (mongod)Tasks: 17Memory: 56.8MCPU: 7.294sCGroup: /system.slice/mongod.service└─2811 /usr/bin/mongod --quiet --config /etc/mongod.conf

q 退出。现在我们已经手动启动了守护程序并验证了它是否正常运行,我们将确保它在启动时自动重新启动:

sudo systemctl enable mongod

以下输出确认了命令执行成功:

Created symlink from /etc/systemd/system/multi-user.target.wants/mongod.service
to /lib/systemd/system/mongod.service.

接下来,我们将采取必要步骤来保护我们的数据库。

第二部分:保护 MongoDB

早期版本的 MongoDB 存在漏洞,因为默认情况下不需要身份验证即可与数据库交互。任何用户都可以默认创建和销毁数据库,以及读取和写入其内容。这一情况加剧了,因为早期版本还默认配置了 MongoDB 守护程序在所有接口上监听,这意味着自动化脚本可以检测到未受防火墙保护且未启用身份验证的 MongoDB 实例,并且如果身份验证未启用,可以完全访问 MongoDB。

在 3.x 发行版以及一些软件包管理器提供的早期版本中,这种情况已得到缓解,因为守护程序现在绑定到 127.0.0.1,因此只会接受 Unix 套接字上的连接。它不会自动对外开放。

然而,身份验证仍然默认禁用,因此本地系统上的任何用户都可以完全访问数据库。为了保护数据库,我们将创建一个管理用户,启用身份验证并进行测试。

步骤 1 — 添加管理员用户

要添加用户,我们将连接到 Mongo shell:

mongo

当我们使用 Mongo shell 时,输出会警告我们数据库未启用访问控制,并且对数据和配置的读/写访问是不受限制的。


MongoDB shell 版本 v3.4.2
连接到:mongodb://127.0.0.1:27017
MongoDB 服务器版本:3.4.2
欢迎使用 MongoDB shell。
要获取交互式帮助,请键入 "help"。
要获取更全面的文档,请参阅http://docs.mongodb.org/
有问题吗?请尝试支持小组http://groups.google.com/group/mongodb-user
服务器启动时有警告:
2017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten]
2017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten] ** 警告:强烈建议使用 XFS 文件系统与 WiredTiger 存储引擎
2017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten] **          请参阅 http://dochub.mongodb.org/core/prodnotes-filesystem
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten]
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten] ** 警告:数据库未启用访问控制。
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten] **          对数据和配置的读写访问是不受限制的。
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten]
>

我们可以自由选择管理员用户的名称,因为权限级别来自角色 userAdminAnyDatabase 的分配。数据库 admin 指定了凭据的存储位置。您可以在 MongoDB 安全认证部分了解更多关于身份验证的信息。

设置您选择的用户名,并确保选择自己的安全密码并将其替换为以下命令中:

use admin
db.createUser({user: "AdminSammy",pwd: "AdminSammy'sSecurePassword",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]}
)

当我们发出 db.createUser 命令时,shell 会在每行前面添加三个点,直到命令完成。之后,当用户已添加时,我们应该收到以下反馈。


> use admin
切换到 db admin
> db.createUser(
...   {
...     user: "AdminSammy",
...     pwd: "AdminSammy'sSecurePassword",
...     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
...   }
... )
成功添加用户:{"user" : "AdminSammy","roles" : [{"role" : "userAdminAnyDatabase","db" : "admin"}]
}

输入 ‘exit’ 并按 ENTER 或使用 CTRL+C 离开客户端。

此时,我们的用户将被允许输入凭据,但在启用身份验证并重新启动 MongoDB 守护程序之前,他们将不需要这样做。

步骤 2 — 启用身份验证

身份验证在 mongod.conf 文件中启用。一旦我们启用它并重新启动 mongod,用户仍然可以连接到 Mongo 而无需进行身份验证,但在他们进行交互之前,他们将需要提供用户名和密码。

让我们打开配置文件:

sudo nano /etc/mongod.conf

#security 部分,我们将删除 security 前面的井号以启用该部分。然后我们将添加授权设置。完成后,行应该如下摘录所示:

. . .
security:authorization: "enabled". . . 

请注意,“security” 行开头没有空格,“authorization” 行必须缩进两个空格。

保存并退出文件后,我们将重新启动守护程序:

sudo systemctl restart mongod

如果我们在配置中出现错误,守护程序将无法启动。由于 systemctl 不提供输出,我们将使用其 status 选项来确保它已经启动:

sudo systemctl status mongod

如果我们在输出中看到 Active: active (running),并且它以以下文本结束,我们可以确保 restart 命令成功:


Jan 23 19:15:42 MongoHost systemd[1]: Started High-performance, schema-free document-oriented database.

验证守护程序已启动后,让我们测试身份验证。

步骤 3 — 验证未经身份验证的用户受到限制

首先,让我们尝试在没有凭据的情况下连接,以验证我们的操作是否受到限制:

mongo 

现在我们已经启用了身份验证,所有之前的警告都已解决。


MongoDB shell 版本 v3.4.2
连接到:mongodb://127.0.0.1:27017
MongoDB 服务器版本:3.4.2

我们已连接到 test 数据库。我们将使用 show dbs 命令测试我们的访问是否受限:

show dbs

2017-02-21T19:20:42.919+0000 E QUERY    [thread1] Error: listDatabases failed:{"ok" : 0,"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }","code" : 13,"codeName" : "Unauthorized". . . 

我们将无法在未经身份验证的情况下创建用户或执行类似的特权任务。

让我们退出 shell 以继续:

exit

接下来,我们将确保我们的管理员用户确实具有访问权限。

步骤 4 — 验证管理员用户的访问权限

我们将使用 -u 选项作为管理员连接,以提供用户名,并使用 -p 选项提示输入密码。我们还需要使用 --authenticationDatabase 选项提供存储用户身份验证凭据的数据库。

mongo -u AdminSammy -p --authenticationDatabase admin

我们将被提示输入密码,因此请提供密码。一旦输入正确的密码,我们将进入 shell,在那里我们可以发出 show dbs 命令:


MongoDB shell 版本 v3.4.2
输入密码:
连接到:mongodb://127.0.0.1:27017
MongoDB 服务器版本:3.4.2>

与被拒绝访问不同,我们应该看到可用的数据库:

show dbs

admin  0.000GB
local  0.000GB

输入 exit 或按 CTRL+C 退出。

请参阅 MongoDB 文档以了解更多关于身份验证、基于角色的访问控制以及用户和角色的信息。

第三部分:配置远程访问(可选)

在开始使用允许远程连接的安装之前,理想情况下,我们将在 MongoDB 后面设置外部防火墙,通过虚拟专用网络(VPN)进行保护,或者通过堡垒主机进行限制。然而,在我们朝着这个目标努力的过程中,我们可以采取相对简单的步骤,即在数据库服务器上启用防火墙,并将访问限制为特定的主机或主机。

步骤 1 — 启用 UFW

在 Ubuntu 16.04 的初始服务器设置先决条件中,我们启用了 UFW 并且只允许 SSH 连接。在为客户端机器打开端口之前,让我们验证 UFW 的状态:

sudo ufw status

除非我们对先决条件进行了更改,否则输出应显示只允许 OpenSSH:


状态:activeTo                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

接下来,我们将允许访问默认的 MongoDB 端口 27017,但将该访问限制为特定主机。如果您更改了默认端口,请确保在下面的命令中进行更新。

sudo ufw allow from client_ip_address to any port 27017

对于每个需要访问的额外客户端,重新运行此命令并使用 IP 地址进行检查。我们将再次运行 ufw status 来双重检查规则:

sudo ufw status

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
27017                       ALLOW      client_ip_address
OpenSSH (v6)               ALLOW       Anywhere (v6)

有了这个防火墙规则,我们已经准备好配置 MongoDB 以侦听其公共接口。

步骤 2 — 配置公共 bindIP

为了允许远程连接,我们将在 mongod.conf 文件中添加主机的公共可路由 IP 地址。

sudo nano /etc/mongod.conf

net 部分,将 MongoHost 的 IP 添加到 bindIp 行:

. . .
net:port: 27017bindIp: 127.0.0.1,IP_of_MongoHost. . .

我们将保存并退出文件,然后重新启动守护程序:

sudo systemctl restart mongod

与之前一样,我们将确认重启是否成功:

sudo systemctl status mongod

输出应包含 Active: active (running),然后我们可以进行最终测试。Mongo 现在正在监听其默认端口。

第三步 — 测试远程连接

我们将通过在 mongodb.conf 文件中找到的 IP 地址添加 --host 标志来测试 Mongo 是否在其公共接口上监听。

mongo -u AdminSammy -p --authenticationDatabase admin --host IP_address_of_MongoHost
MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://107.170.233.82:27017/
MongoDB server version: 3.4.2

成功到达提示符表明守护程序正在其公共 IP 上监听。此时,MongoDB 主机与远程连接之间的任何交易都是未加密的,因此在测试防火墙之前,下一步应该是保护这些交易。有关此内容的帮助,请参阅 MongoDB 的安全文档中的传输加密部分。

结论

在本教程中,我们已将 MongoDB 存储库添加到我们的软件包列表中,以安装最新可用版本的 MongoDB,添加了一个管理用户,并启用了身份验证。

我们还展示了如何配置 MongoDB 以接受远程连接,但通过配置服务器防火墙,防止 MongoDB 安装被广告,只允许来自需要访问的主机的连接。

下一步:

  • 要加密传输中的数据,请参阅 MongoDB 的安全文档中的传输加密部分
  • 在 DigitalOcean 社区文章中了解有关使用和管理 MongoDB 的更多信息。

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

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

相关文章

Spring MVC入门3

看完这篇博客你能学到什么 理解JSON的使用理解注解PathVariable理解解注解RequestPart理解cookie和Session的基本概念理解cookie和Session的区别 如果想真正掌握&#xff0c;还需要自己勤加练习。 正文 JSON JSON概念 JSON&#xff1a;JavaScript Object Notation 【JavaS…

【YOLOv8】 用YOLOv8实现数字式工业仪表智能读数(一)

上一篇圆形表盘指针式仪表的项目受到很多人的关注&#xff0c;咱们一鼓作气&#xff0c;把数字式工业仪表的智能读数也研究一下。本篇主要讲如何用YOLOV8实现数字式工业仪表的自动读数&#xff0c;并将读数结果进行输出&#xff0c;若需要完整数据集和源代码可以私信。 目录 &…

gin源码分析

一、高性能 使用sync.pool解决频繁创建的context对象&#xff0c;在百万并发的场景下能大大提供访问性能和减少GC // ServeHTTP conforms to the http.Handler interface. // 每次的http请求都会从sync.pool中获取context&#xff0c;用完之后归还到pool中 func (engine *Engin…

在C++中怎样使用C库

在C中使用C库是一个相对直接的过程&#xff0c;因为C是从C发展而来的&#xff0c;并且与C高度兼容。这意味着你可以直接在C代码中使用C库函数、头文件和变量&#xff0c;而无需进行特殊转换。以下是一些基本的步骤和注意事项&#xff0c;用于在C中使用C库&#xff1a; 1. 包含…

c语言位操作符相关题目之交换两个数的值

文章目录 一、题目二、方法11&#xff0c;思路2&#xff0c;代码实现 三、方法21&#xff0c;思路2&#xff0c;代码实现 四、方法31&#xff0c;思路2&#xff0c;代码实现 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 实现两个变量的…

浅谈PostCSS

1. 背景 css的预处理器语言&#xff08;比如 sass&#xff0c; less&#xff0c; stylus&#xff09;的扩展性不好&#xff0c;你可以使用它们已有的功能&#xff0c;但如果想做扩展就没那么容易。 sass是很常用的css预处理器语言&#xff0c;在webpack中要使用它&#xff0c;…

设计模式使用场景实现示例及优缺点(结构型模式——组合模式)

结构型模式 组合模式&#xff08;Composite Pattern&#xff09; 组合模式使得用户对单个对象和组合对象的使用具有一致性。 有时候又叫做部分-整体模式&#xff0c;它使我们树型结构的问题中&#xff0c;模糊了简单元素和复杂元素的概念&#xff0c;客户程序可以像处理简单元…

小米起诉“小米”商标侵权,索赔500万!

近日浙江丽水有家叫小米的公司&#xff0c;因为商标侵权被小米科技起诉索赔500万&#xff0c;需要变更企业名称&#xff0c;官网也不能用“小米智能大家居”等&#xff0c;还有其它的赔偿&#xff0c;普推知产商标老杨分析&#xff0c;“小米智能大家居”“小米”&#xff0c;后…

【Flask从入门到精通:第九课:数据库基本操作、数据表操作以及数据操作】

数据库操作 数据库驱动&#xff08;drivers&#xff09;模块&#xff1a;pymysql、MySQLDB 数据库基本操作 在SQLAlchemy中&#xff0c;添加、修改、删除操作&#xff0c;均由数据库会话(sessionSM)管理。 会话用 db.session 表示。在准备把数据写入数据库前&#xff0c;要先…

交易平台Zero Hash现已支持SUI交易

Zero Hash是一家领先的加密货币和稳定币基础设施平台&#xff0c;为包括Stripe、Shift4和Franklin Templeton在内的公司提供支持&#xff0c;现在也支持对SUI的访问。此举使Zero Hash的客户及其终端用户能够使用SUI。 提供API和SDK以及专注于无缝连接法币、加密货币和稳定币的…

读人工智能全传11人工智能会出什么错

1. 人工智能会出什么错 1.1. 一些报道是公正合理的&#xff0c;不过坦白地说&#xff0c;大部分报道都愚蠢得无可救药 1.2. 一些报道颇有知识性和引导性&#xff0c;而大部分则是杞人忧天式的恐吓 1.3. 滑稽的报道迎合了大众对人工智能的“终结者式恐惧” 1.3.1. 我们创造出…

html设计(两种常见的充电效果)

第一种 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

方便快捷传文件—搭建rsync文件传输服务器

比如我们有一个服务器&#xff0c;想把各个机器的文件都通过脚本传给这台机&#xff0c;用sftp或者直接rsync就必须输密码&#xff0c;肯定不行&#xff0c;做等效性免密又麻烦&#xff0c;怎么办呢&#xff0c;这么办&#xff01; 在服务端 yum -y install rsync #编辑&…

Vue3 关于scss预编译中:deep 其中的deep如何理解

在SCSS预处理器中&#xff0c;:deep是一个伪类选择器&#xff0c;用于选择一个元素的所有后代元素&#xff0c;无论它们在DOM结构中的层级深度如何。换句话说&#xff0c;:deep选择器是一个类似于CSS中的后代选择器&#xff0c;但是它可以不考虑嵌套层级的限制&#xff0c;而是…

Android MessageQueue 源码分析

类注释 /*** Low-level class holding the list of messages to be dispatched by a* {link Looper}. Messages are not added directly to a MessageQueue,* but rather through {link Handler} objects associated with the Looper.** <p>You can retrieve the Messa…

【FineGrip】全光学感知:一种新的通用遥感图像解释任务和细粒度数据集(IEEE TGRS 2024)

摘要 目前的遥感解译模型通常集中于单一的任务&#xff0c;如检测、分割或字幕。但是&#xff0c;针对特定任务设计的模型无法实现综合多层次解译。该领域也缺乏多任务联合解译数据集。本文提出Panoptic Perception&#xff0c;一个新的任务和一个新的细粒度数据集&#xff08…

apache Kylin系列介绍及配置

Apache Kylin是一个开源的分布式分析引擎,用于OLAP(联机分析处理)数据处理。它专门设计用于处理大规模的数据集,并提供快速的查询和分析能力。 apache Kylin架构: Apache Kylin是一个开源的分布式分析引擎,旨在提供高性能、低延迟的OLAP(联机分析处理)能力。下面是Ap…

nvim工具介绍

1. **seoul256.vim**: 一个基于首尔色彩的低对比度 Vim 颜色方案&#xff0c;适用于 256 色终端或 GVim。 2. **vim-easy-align**: Vim 插件&#xff0c;用于对齐文本。 3. **vim-go**: Vim 的 Go 语言插件&#xff0c;支持语法高亮、自动缩进等。 4. **coc.nvim**: 集成了 LSP…

GESP CCF C++ 二级认证真题 2024年6月

第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级&#xff0c;那他可以选择的认证语言有几种&#xff1f;&#xff08; &#xff09; A. 1 B. 2 C. 3 D. 4 第 2 题 下面流程图在yr输入2024时&#xff0c;可以判定yr代表闰年&#xff0c;并输出 2月…

介绍一款数据准实时复制(CDC)中间件 `Debezium`

简介 文章开头先介绍一下什么是CDC。数据准实时复制(CDC)是目前行内实时数据需求大量使用的技术。常用的中间件有Canal、Debezium、Flink CDC等 下面我们做一下对比 各有优缺点吧,本主要介绍一下Debezium中间件。 Debezium是什么 Debezium是一个为变更数据捕获(CDC)提供…