介绍
MongoDB 是一个以文档为导向的数据库,它是免费的和开源的。它被归类为 NoSQL 数据库,因为它不依赖于传统的基于表的关系数据库结构。相反,它使用 JSON 类似的文档与动态方案。与关系数据库不同,MongoDB 在您将数据添加到数据库之前不需要预先定义的图表。您可以随时更改图表,而无需使用更新的图表来设置新的数据库。
在本教程的第一部分中,我们将使用MongoDB存储库来安装MongoDB的最新版本。在第二部分中,我们将启用身份验证来保护它在本地系统上。
前提条件
要遵循本教程,您将需要:
- ** 一台 Ubuntu 16.04 服务器** 配置了非 root 用户和防火墙,通过遵循 Ubuntu 16.04 初始服务器设置指南 。
当这一点到位时,你准备跟随。
第一部分:设置服务器
步骤 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 安装只允许需要访问的主机的连接。
以下步骤:**
- 若要加密过境中的数据,请参阅 MongoDB 的安全文档 运输加密
- 有关使用和管理 MongoDB 的更多信息,请参阅 这些 DigitalOcean 社区文章。