如何在Ubuntu 16.04上安装和保护MongoDB

MongoDB是一个面向文档的数据库,是免费和开源的。它被归类为NoSQL数据库,因为它不依赖于传统的基于表的关系数据库结构... 在本教程的第一部分中,我们将使用MongoDB Repository来安装最新版本的MongoDB。在第二部分中,我们将启用身份验证以在本地系统上保护它。最后,在第三部分中,我们将展示如何更安全地允许远程连接(如果需要)。

介绍

MongoDB是一个面向文档的数据库,是免费和开源的。它被归类为NoSQL数据库,因为它不依赖于传统的基于表的关系数据库结构。相反,它使用类似JSON的文档和动态模式。与关系数据库不同,MongoDB在将数据添加到数据库之前不需要预定义模式。您可以随时根据需要更改模式,而无需使用更新的模式设置新的数据库。 在本教程的第一部分中,我们将使用MongoDB Repository来安装最新版本的MongoDB。在第二部分中,我们将启用身份验证以在本地系统上保护它。最后,在第三部分中,我们将展示如何更安全地允许远程连接(如果需要)。

先决条件

要遵循本教程,您需要: 当这个到位后,你就准备好了。

第一部分:设置服务器

第1步 - 添加MongoDB存储库

MongoDB已经包含在Ubuntu包存储库中,但官方MongoDB存储库提供了最新的版本,是推荐的安装软件的方式。在这一步中,我们将把这个官方仓库添加到我们的服务器。 Ubuntu通过验证软件包是否使用GPG密钥进行签名来确保软件包的真实性,因此我们首先必须导入官方MongoDB存储库的密钥。
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
以下输出确认我们已成功导入密钥:
输出
Executing: /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元包,其中包括服务器上的守护程序,配置和init脚本,shell和管理工具。
sudo apt-get install mongodb-org
按提示输入或键入Y继续。安装完成后,我们将启动Mongo守护程序:
sudo systemctl start mongod
由于systemctl不提供输出,因此我们将检查状态以验证服务是否已正常启动。
sudo systemctl status mongod
输出
● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2017-02-17 18:57:26 UTC; 17min ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 2811 (mongod)
    Tasks: 17
   Memory: 56.8M
      CPU: 7.294s
   CGroup: /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套接字上的连接。它不会自动打开到Internet。 但是,默认情况下仍然禁用身份验证,因此本地系统上的所有用户都可以完全访问数据库。为了确保这一点,我们将创建一个管理用户,启用身份验证和测试。

第1步 - 添加管理用户

要添加我们的用户,我们将连接到Mongo shell:
mongo
当我们使用Mongo shell时的输出警告我们没有为数据库启用访问控制,并且对数据和配置的读/写访问不受限制。
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
Server has startup warnings:
2017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten]
2017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten] **          See 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] ** WARNING: Access control is not enabled for the database.
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
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
switched to db admin
> db.createUser(
...   {
...     user: "AdminSammy",
...     pwd: "AdminSammy'sSecurePassword",
...     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
...   }
... )
Successfully added user: {
        "user" : "AdminSammy",
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
}

键入'exit'并按ENTER或使用CTRL+C离开客户端。 此时,我们的用户将被允许输入凭据,但是在我们启用身份​​验证并重新启动MongoDB守护程序之前,不需要这样做。

第2步 - 启用身份验证

mongod.conf文件中启用mongod.conf 。 一旦我们启用它并重新启动mongod ,用户仍然能够连接到Mongo而不进行验证,但他们将需要提供用户名和密码,才能进行交互。 让我们打开配置文件:
sudo nano /etc/mongod.conf
#security部分中,我们将删除security前的散列以启用节。然后,我们将添加授权设置。当我们完成后,行应该像下面的摘录:
mongodb.conf
 . . .
security:
  authorization: "enabled"
 . . . 
注意,“安全”行在开头没有空格,“授权”行必须缩进两个空格 一旦我们保存并退出该文件,我们将重新启动守护进程:
sudo systemctl restart mongod
如果我们在配置中发生错误,dameon不会启动。因为systemctl不提供输出,我们将使用其status选项来确保它:。
sudo systemctl status mongodb
如果我们在输出中看到Active: active (running) ,并且它以下面的文本结束,我们可以确保restart命令成功:
Jan 23 19:15:42 MongoHost systemd[1]: Started High-performance, schema-free document-oriented database.
验证守护程序后,让我们测试身份验证。

第3步 - 验证未认证的用户是否受限

首先,让我们连接没有凭据,以验证我们的操作受到限制:
mongo 
现在我们已启用验证,所有先前的警告都已解决。
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 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选项连接,以提供用户名,并提示输入密码。 我们还需要提供数据库,其中我们使用--authenticationDatabase选项存储用户的身份验证--authenticationDatabase
mongo -u AdminSammy -p --authenticationDatabase admin
我们会提示输入密码,因此请提供密码。一旦我们输入正确的密码,我们将被放入shell,我们可以发出show dbs命令:
MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 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
注意:如果输出指示防火墙处于inactive ,请使用以下命令激活它:
sudo ufw enable
一旦启用,重新运行状态命令, sudo ufw status将显示规则。如有必要,请确保允许SSH。
sudo ufw allow OpenSSH
除非我们对先决条件进行了更改,否则输出应显示仅允许OpenSSH:
Status: 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
sudo ufw status
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
27017                       ALLOW      client_ip_address
OpenSSH (v6)               ALLOW       Anywhere (v6)
注意:如果您是UFW的新用户,您可以在“ UFW要点:常见防火墙规则和命令 ”指南中了解更多信息。 有了这个防火墙规则,我们准备配置MongoDB在其公共接口上监听。

第2步 - 配置公共bindIP

要允许远程连接,我们将把主机的公共路由IP地址添加到mongod.conf文件中。
sudo nano /etc/mongod.conf
net节中,将MongoHost的IP添加到bindIp行:
/etc/mongod.conf的摘录
 . . .
net:
  port: 27017
  bindIp: 127.0.0.1,IP_of_MongoHost
 . . .
我们将保存并退出该文件,然后重新启动守护程序:
sudo systemctl restart mongod
正如我们之前所做的,我们将确认重新启动是否成功:
sudo systemctl status mongodb
输出应包含Active: active (running) ,我们可以继续进行最后的测试。 Mongo现在正在监听其默认端口。

第3步 - 测试远程连接

我们将通过从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安装广告。 下一步: