如何在 Ubuntu 16.04 上安装 MongoDB 并确保其安全

介绍

MongoDB 是一个以文档为导向的数据库,它是免费的和开源的。它被归类为 NoSQL 数据库,因为它不依赖于传统的基于表的关系数据库结构。相反,它使用 JSON 类似的文档与动态方案。与关系数据库不同,MongoDB 在您将数据添加到数据库之前不需要预先定义的图表。您可以随时更改图表,而无需使用更新的图表来设置新的数据库。

在本教程的第一部分中,我们将使用MongoDB存储库来安装MongoDB的最新版本。在第二部分中,我们将启用身份验证来保护它在本地系统上。

前提条件

要遵循本教程,您将需要:

当这一点到位时,你准备跟随。

第一部分:设置服务器

步骤 1 – 添加 MongoDB 存储库

MongoDB 已经包含在 Ubuntu 包存储库中,但官方 MongoDB 存储库提供了最新的版本,是安装软件的推荐方式。

Ubuntu 通过验证它们是用 GPG 密钥签名的来确保软件包的真实性,所以我们必须先导入官方 MongoDB 存储库的密钥。

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

以下输出证实我们已成功导入密钥:

1[label Output]
2Executing: /tmp/tmp.IdwenTia0s/gpg.1.sh --keyserver
3hkp://keyserver.ubuntu.com:80
4--recv
50C49F3730359A14518585931BC711F9BA15703C6
6gpg: requesting key A15703C6 from hkp server keyserver.ubuntu.com
7gpg: key A15703C6: public key "MongoDB 3.4 Release Signing Key <[email protected]>" imported
8gpg: Total number processed: 1
9gpg:               imported: 1  (RSA: 1)

接下来,我们将添加 MongoDB 存储库细节,以便apt知道下载包的位置。

1echo "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

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

1sudo apt-get update

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

第2步:安装MongoDB

我们将安装mongodb-org meta-package,其中包括服务器上的daemon、配置和 init脚本、壳和管理工具。

1sudo apt-get install mongodb-org

按入或键入Y,在提示时继续进行。一旦安装完成,我们将启动Mongo Daemon:

1sudo systemctl start mongod

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

1sudo systemctl status mongod
 1[label Output]
 2 mongod.service - High-performance, schema-free document-oriented database
 3   Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
 4   Active: active (running) since Fri 2017-02-17 18:57:26 UTC; 17min ago
 5     Docs: https://docs.mongodb.org/manual
 6 Main PID: 2811 (mongod)
 7    Tasks: 17
 8   Memory: 56.8M
 9      CPU: 7.294s
10   CGroup: /system.slice/mongod.service
11           └─2811 /usr/bin/mongod --quiet --config /etc/mongod.conf

现在我们已经手动启动了 DAEMON 并确认它正在运行,我们将确保它在启动时自动重新启动:

1sudo systemctl enable mongod

以下输出证实命令成功:

1[secondary_label Output]
2Created symlink from /etc/systemd/system/multi-user.target.wants/mongod.service
3to /lib/systemd/system/mongod.service.

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

第二部分:保护MongoDB

任何用户都可以创建和破坏数据库,以及从默认情况下读取和写入其内容,这是复杂的,因为这些早期版本也配置了MongoDB大象默认情况下在所有界面上聆听,这意味着自动脚本可以检测未受防火墙保护的MongoDB实例,如果未启用身份验证,则可以完全访问MongoDB。

这种情况在 3.x 版本以及一些包管理器提供的早期版本中得到缓解,因为现在的 DAEMON 已被限制在 127.0.0.1 上,所以它只会接受 Unix 插槽上的连接。

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

步骤 1 – 添加管理用户

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

1mongo

当我们使用Mongo壳时的输出提醒我们,数据库没有启用访问控制,数据和配置的阅读/写入访问是无限制的。

 1[secondary_label Output]
 2MongoDB shell version v3.4.2
 3connecting to: mongodb://127.0.0.1:27017
 4MongoDB server version: 3.4.2
 5Welcome to the MongoDB shell.
 6For interactive help, type "help".
 7For more comprehensive documentation, see
 8        http://docs.mongodb.org/
 9Questions? Try the support group
10        http://groups.google.com/group/mongodb-user
11Server has startup warnings:
122017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten]
132017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
142017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
152017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten]
162017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
172017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
182017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten]
19>

我们可以自由选择管理员用户的名称,因为特权级别来自userAdminAnyDatabase的角色分配。 数据库admin指定了身份证存储地点。

设置您选择的用户名,并确保您选择自己的安全密码,并在下面的命令中替换它们:

1use admin
2db.createUser(
3  {
4    user: "AdminSammy",
5    pwd: "AdminSammy'sSecurePassword",
6    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
7  }
8)

当我们发出db.createUser命令时,壳将在每个行前预先预留三个点,直到命令完成。

 1[secondary_label Output]
 2> use admin
 3switched to db admin
 4> db.createUser(
 5...   {
 6... user: "AdminSammy",
 7... pwd: "AdminSammy'sSecurePassword",
 8... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
 9...   }
10... )
11Successfully added user: {
12        "user" : "AdminSammy",
13        "roles" : [
14                {
15                        "role" : "userAdminAnyDatabase",
16                        "db" : "admin"
17                }
18        ]
19}

输入退出并按ENTER,或使用CTRL+C离开客户端。

在此时,我们的用户将被允许输入凭证,但直到我们启用身份验证并重新启动MongoDB大门之前,他们将不会被要求这样做。

步骤 2 – 允许身份验证

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

打开配置文件:

1sudo nano /etc/mongod.conf

#安全部分中,我们将删除安全前面的哈希,以启用 stanza. 然后我们将添加授权设置。

1[label mongodb.conf]
2 . . .
3security:
4  authorization: "enabled"
5 . . .

请注意,安全线在开始时没有空格,而授权线必须有两个空格。

一旦我们保存并退出文件,我们将重新启动DAEMON:

1sudo systemctl restart mongod

如果我们在配置中犯了错误,Dameon 将不会启动. 由于systemctl不提供输出,我们将使用其状态选项来确保:

1sudo systemctl status mongod

如果我们在输出中看到活跃:活跃(运行),并以下面文本的样子结束,我们可以确定重新启动命令成功了:

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

验证了 DAEMON 已启动,让我们测试身份验证。

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

首先,让我们连接没有凭证来验证我们的行动受到限制:

1mongo

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

1[secondary_label Output]
2MongoDB shell version v3.4.2
3connecting to: mongodb://127.0.0.1:27017
4MongoDB server version: 3.4.2

我们已连接到测试数据库,我们将通过显示 dbs命令来测试我们的访问是否受到限制:

1show dbs
1[secondary_label Output]
22017-02-21T19:20:42.919+0000 E QUERY    [thread1] Error: listDatabases failed:{
3        "ok" : 0,
4        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
5        "code" : 13,
6        "codeName" : "Unauthorized"
7 . . .

我们无法在没有身份验证的情况下创建用户或类似的特权任务。

让我们离开壳来继续:

1exit

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

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

我们将作为我们的管理员连接到-u选项来提供用户名和-p来请求密码,我们还需要提供我们存储用户身份验证凭证的数据库与--authenticationDatabase选项。

1mongo -u AdminSammy -p --authenticationDatabase admin

一旦我们输入正确的密码,我们将被扔进壳中,在那里我们可以发出显示dbs命令:

1[secondary_label Output]
2MongoDB shell version v3.4.2
3Enter password:
4connecting to: mongodb://127.0.0.1:27017
5MongoDB server version: 3.4.2
6
7>

而不是被拒绝访问,我们应该看看可用的数据库:

1show dbs
1[secondary_label Output]
2admin 0.000GB
3local 0.000GB

输入退出或按CTRL+C来退出。

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

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

在我们开始使用允许远程连接的安装之前,理想情况下,我们会有一个外部防火墙背后的MongoDB,由虚拟私人网络(VPN)保护,或通过堡垒主机受到限制。

步骤 1 - 允许 UFW

Ubuntu 16.04 初始服务器设置前提条件中,我们启用了 UFW,只允许 SSH 连接。

1sudo ufw status

<$>[注] 注: 如果输出表示防火墙不活跃,请用下列方式激活它:

1sudo ufw enable

一旦启用,重启状态命令,sudo ufw status将显示规则。

1sudo ufw allow OpenSSH

美元

除非我们对前提条件进行了更改,否则输出应该显示只有 OpenSSH 是允许的:

1[secondary_label Output]
2Status: active
3
4To Action From
5--                         ------      ----
6OpenSSH ALLOW Anywhere
7OpenSSH (v6)               ALLOW Anywhere (v6)

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

1sudo ufw allow from client_ip_address to any port 27017

重新运行此命令,使用每个需要访问的额外客户端的 IP 地址。

1sudo ufw status
1[secondary_label Output]
2To Action From
3--                         ------      ----
4OpenSSH ALLOW Anywhere
527017 ALLOW client_ip_address
6OpenSSH (v6)               ALLOW Anywhere (v6)

<$>[注] 注: 如果您是新的UFW,您可以在指南中了解更多信息, UFW Essentials: Common Firewall Rules and Commands

有了这个防火墙规则,我们已经准备好将MongoDB配置为在其公共界面上收听。

步骤 2 – 配置公共 bindIP

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

1sudo nano /etc/mongod.conf

net字段中,将MongoHost的IP添加到bindIp字段:

1[label Excerpt of /etc/mongod.conf]
2 . . .
3net:
4  port: 27017
5  bindIp: 127.0.0.1,IP_of_MongoHost
6 . . .

我们将保存并退出文件,然后重新启动DAEMON:

1sudo systemctl restart mongod

正如我们之前所做的,我们将确认重启成功:

1sudo systemctl status mongod

输出应该包含活跃:活跃(运行),我们可以继续进行最后的测试。

步骤 3 – 测试远程连接

我们将测试Mongo是否在其公共界面上收听,通过添加--host旗帜,并从mongodb.conf文件中添加IP地址。

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

在此时,任何远程连接和MongoDB主机之间的交易都是未加密的,所以下一步,在测试防火墙之前,应该是确保这些交易。

结论

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

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

以下步骤:**

Published At
Categories with 技术
Tagged with
comments powered by Disqus