前些天发现了一个巨牛的人工智能学习网站,普通易懂,风趣幽默,不由得分享一下给各人。点击跳转到网站。
简介
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@mongo
- db.com>" imported
- gpg: Total number processed: 1
- gpg: imported: 1 (RSA: 1)
复制代码 接下来,我们将添加 MongoDB 仓库的详细信息,以便 apt 知道从哪里下载软件包。执行以下命令创建 MongoDB 的列表文件。
- echo "deb [ arch=amd64,arm64 ] http://repo.mongo
- db.org/apt/ubuntu xenial/mongo
- db-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongo
- db-org-3.4.list
复制代码 末了,我们将更新软件包列表。
现在我们已经准备好安装 MongoDB 了。
步骤 2 — 安装 MongoDB
我们将在服务器上安装 mongo
db-org 元包,该包包罗守护步伐、设置和初始化脚本、shell 和管理工具。
- sudo apt-get install mongo
- db-org
复制代码 在提示时按 Enter 键或输入 Y 继续。安装完成后,我们将启动 Mongo 守护步伐:
- sudo systemctl start mongo
- d
复制代码 由于 systemctl 不提供输出,我们将查抄状态以验证服务是否已精确启动。
- sudo systemctl status mongo
- d
复制代码- ● mongo
- d.service - 高性能、无模式文档导向数据库
- Loaded: loaded (/lib/systemd/system/mongo
- d.service; disabled; vendor preset: enabled)
- Active: active (running) since Fri 2017-02-17 18:57:26 UTC; 17min ago
- Docs: https://docs.mongo
- db.org/manual
- Main PID: 2811 (mongo
- d)
- Tasks: 17
- Memory: 56.8M
- CPU: 7.294s
- CGroup: /system.slice/mongo
- d.service
- └─2811 /usr/bin/mongo
- d --quiet --config /etc/mongo
- d.conf
复制代码 按 q 退出。现在我们已经手动启动了守护步伐并验证了它是否正常运行,我们将确保它在启动时自动重新启动:
- sudo systemctl enable mongo
- d
复制代码 以下输出确认了命令执行成功:
- Created symlink from /etc/systemd/system/multi-user.target.wants/mongo
- d.service
- to /lib/systemd/system/mongo
- d.service.
复制代码 接下来,我们将采取必要步骤来掩护我们的数据库。
第二部分:掩护 MongoDB
早期版本的 MongoDB 存在毛病,因为默认情况下不必要身份验证即可与数据库交互。任何用户都可以默认创建和烧毁数据库,以及读取和写入其内容。这一情况加剧了,因为早期版本还默认设置了 MongoDB 守护步伐在所有接口上监听,这意味着自动化脚本可以检测到未受防火墙掩护且未启用身份验证的 MongoDB 实例,而且如果身份验证未启用,可以完全访问 MongoDB。
在 3.x 发行版以及一些软件包管理器提供的早期版本中,这种情况已得到缓解,因为守护步伐现在绑定到 127.0.0.1,因此只会担当 Unix 套接字上的连接。它不会自动对外开放。
然而,身份验证仍然默认禁用,因此当地系统上的任何用户都可以完全访问数据库。为了掩护数据库,我们将创建一个管理用户,启用身份验证并进行测试。
步骤 1 — 添加管理员用户
要添加用户,我们将连接到 Mongo shell:
当我们利用 Mongo shell 时,输出会警告我们数据库未启用访问控制,而且对数据和设置的读/写访问是不受限制的。
- MongoDB shell 版本 v3.4.2连接到:mongo
- db://127.0.0.1:27017MongoDB 服务器版本:3.4.2欢迎利用 MongoDB shell。要获取交互式资助,请键入 "help"。要获取更全面的文档,请参阅 http://docs.mongo
- db.org/有问题吗?请实验支持小组 http://groups.google.com/group/mongo
- db-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.mongo
- db.org/core/prodnotes-filesystem2017-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 — 启用身份验证
身份验证在 mongo
d.conf 文件中启用。一旦我们启用它并重新启动 mongo
d,用户仍然可以连接到 Mongo 而无需进行身份验证,但在他们进行交互之前,他们将必要提供用户名和密码。
让我们打开设置文件:
- sudo nano /etc/mongo
- d.conf
复制代码 在 #security 部分,我们将删除 security 前面的井号以启用该部分。然后我们将添加授权设置。完成后,行应该如下摘录所示:
- . . .
- security:
- authorization: "enabled"
- . . .
复制代码 请注意,“security” 行开头没有空格,“authorization” 行必须缩进两个空格。
生存并退出文件后,我们将重新启动守护步伐:
- sudo systemctl restart mongo
- d
复制代码 如果我们在设置中出现错误,守护步伐将无法启动。由于 systemctl 不提供输出,我们将利用其 status 选项来确保它已经启动:
- sudo systemctl status mongo
- d
复制代码 如果我们在输出中看到 Active: active (running),而且它以以下文本结束,我们可以确保 restart 命令成功:
- Jan 23 19:15:42 MongoHost systemd[1]: Started High-performance, schema-free document-oriented database.
复制代码 验证守护步伐已启动后,让我们测试身份验证。
步骤 3 — 验证未经身份验证的用户受到限制
起首,让我们实验在没有凭据的情况下连接,以验证我们的操作是否受到限制:
现在我们已经启用了身份验证,所有之前的警告都已办理。
- MongoDB shell 版本 v3.4.2连接到:mongo
- db://127.0.0.1:27017MongoDB 服务器版本:3.4.2
复制代码 我们已连接到 test 数据库。我们将利用 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 以继续:
接下来,我们将确保我们的管理员用户确实具有访问权限。
步骤 4 — 验证管理员用户的访问权限
我们将利用 -u 选项作为管理员连接,以提供用户名,并利用 -p 选项提示输入密码。我们还必要利用 --authenticationDatabase 选项提供存储用户身份验证凭据的数据库。
- mongo
- -u AdminSammy -p --authenticationDatabase admin
复制代码 我们将被提示输入密码,因此请提供密码。一旦输入精确的密码,我们将进入 shell,在那里我们可以发出 show dbs
命令:
- MongoDB shell 版本 v3.4.2输入密码:连接到:mongo
- db://127.0.0.1:27017MongoDB 服务器版本:3.4.2>
复制代码 与被拒绝访问不同,我们应该看到可用的数据库:
- admin 0.000GB
- local 0.000GB
复制代码 输入 exit
或按 CTRL+C 退出。
请参阅 MongoDB 文档以相识更多关于身份验证、基于角色的访问控制以及用户和角色的信息。
第三部分:设置远程访问(可选)
在开始利用允许远程连接的安装之前,抱负情况下,我们将在 MongoDB 后面设置外部防火墙,通过假造专用网络(VPN)进行掩护,大概通过堡垒主机进行限制。然而,在我们朝着这个目标努力的过程中,我们可以采取相对简单的步骤,即在数据库服务器上启用防火墙,并将访问限制为特定的主机或主机。
步骤 1 — 启用 UFW
在 Ubuntu 16.04 的初始服务器设置先决条件中,我们启用了 UFW 而且只允许 SSH 连接。在为客户端呆板打开端口之前,让我们验证 UFW 的状态:
除非我们对先决条件进行了更改,否则输出应显示只允许 OpenSSH:
- 状态:active
- To 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 来双重查抄规则:
- To Action From
- -- ------ ----
- OpenSSH ALLOW Anywhere
- 27017 ALLOW client_ip_address
- OpenSSH (v6) ALLOW Anywhere (v6)
复制代码 有了这个防火墙规则,我们已经准备好设置 MongoDB 以侦听其公共接口。
步骤 2 — 设置公共 bindIP
为了允许远程连接,我们将在 mongo
d.conf 文件中添加主机的公共可路由 IP 地址。
- sudo nano /etc/mongo
- d.conf
复制代码 在 net 部分,将 MongoHost 的 IP 添加到 bindIp 行:
- . . .
- net:
- port: 27017
- bindIp: 127.0.0.1,IP_of_MongoHost
- . . .
复制代码 我们将生存并退出文件,然后重新启动守护步伐:
- sudo systemctl restart mongo
- d
复制代码 与之前一样,我们将确认重启是否成功:
- sudo systemctl status mongo
- d
复制代码 输出应包含 Active: active (running),然后我们可以进行最终测试。Mongo 现在正在监听其默认端口。
第三步 — 测试远程连接
我们将通过在 mongo
db.conf 文件中找到的 IP 地址添加 --host 标记来测试 Mongo 是否在其公共接口上监听。
- mongo
- -u AdminSammy -p --authenticationDatabase admin --host IP_address_of_MongoHost
复制代码- MongoDB shell version v3.4.2Enter password:connecting to: mongo
- db://107.170.233.82:27017/MongoDB server version: 3.4.2
复制代码 成功到达提示符表明守护步伐正在其公共 IP 上监听。此时,MongoDB 主机与远程连接之间的任何买卖业务都是未加密的,因此在测试防火墙之前,下一步应该是掩护这些买卖业务。有关此内容的资助,请参阅 MongoDB 的安全文档中的传输加密部分。
结论
在本教程中,我们已将 MongoDB 存储库添加到我们的软件包列表中,以安装最新可用版本的 MongoDB,添加了一个管理用户,并启用了身份验证。
我们还展示了怎样设置 MongoDB 以担当远程连接,但通过设置服务器防火墙,防止 MongoDB 安装被广告,只允许来自必要访问的主机的连接。
下一步:
- 要加密传输中的数据,请参阅 MongoDB 的安全文档中的传输加密部分
- 在 DigitalOcean 社区文章中相识有关利用和管理 MongoDB 的更多信息。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |