前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站。
簡介
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 的更多信息。