在Ubuntu 16.04上安裝和保護MongoDB的方法

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站。

簡介

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 的更多信息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44533.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44533.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44533.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring MVC入門3

看完這篇博客你能學到什么 理解JSON的使用理解注解PathVariable理解解注解RequestPart理解cookie和Session的基本概念理解cookie和Session的區別 如果想真正掌握&#xff0c;還需要自己勤加練習。 正文 JSON JSON概念 JSON&#xff1a;JavaScript Object Notation 【JavaS…

【YOLOv8】 用YOLOv8實現數字式工業儀表智能讀數(一)

上一篇圓形表盤指針式儀表的項目受到很多人的關注&#xff0c;咱們一鼓作氣&#xff0c;把數字式工業儀表的智能讀數也研究一下。本篇主要講如何用YOLOV8實現數字式工業儀表的自動讀數&#xff0c;并將讀數結果進行輸出&#xff0c;若需要完整數據集和源代碼可以私信。 目錄 &…

gin源碼分析

一、高性能 使用sync.pool解決頻繁創建的context對象&#xff0c;在百萬并發的場景下能大大提供訪問性能和減少GC // ServeHTTP conforms to the http.Handler interface. // 每次的http請求都會從sync.pool中獲取context&#xff0c;用完之后歸還到pool中 func (engine *Engin…

在C++中怎樣使用C庫

在C中使用C庫是一個相對直接的過程&#xff0c;因為C是從C發展而來的&#xff0c;并且與C高度兼容。這意味著你可以直接在C代碼中使用C庫函數、頭文件和變量&#xff0c;而無需進行特殊轉換。以下是一些基本的步驟和注意事項&#xff0c;用于在C中使用C庫&#xff1a; 1. 包含…

c語言位操作符相關題目之交換兩個數的值

文章目錄 一、題目二、方法11&#xff0c;思路2&#xff0c;代碼實現 三、方法21&#xff0c;思路2&#xff0c;代碼實現 四、方法31&#xff0c;思路2&#xff0c;代碼實現 總結 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一、題目 實現兩個變量的…

淺談PostCSS

1. 背景 css的預處理器語言&#xff08;比如 sass&#xff0c; less&#xff0c; stylus&#xff09;的擴展性不好&#xff0c;你可以使用它們已有的功能&#xff0c;但如果想做擴展就沒那么容易。 sass是很常用的css預處理器語言&#xff0c;在webpack中要使用它&#xff0c;…

設計模式使用場景實現示例及優缺點(結構型模式——組合模式)

結構型模式 組合模式&#xff08;Composite Pattern&#xff09; 組合模式使得用戶對單個對象和組合對象的使用具有一致性。 有時候又叫做部分-整體模式&#xff0c;它使我們樹型結構的問題中&#xff0c;模糊了簡單元素和復雜元素的概念&#xff0c;客戶程序可以像處理簡單元…

小米起訴“小米”商標侵權,索賠500萬!

近日浙江麗水有家叫小米的公司&#xff0c;因為商標侵權被小米科技起訴索賠500萬&#xff0c;需要變更企業名稱&#xff0c;官網也不能用“小米智能大家居”等&#xff0c;還有其它的賠償&#xff0c;普推知產商標老楊分析&#xff0c;“小米智能大家居”“小米”&#xff0c;后…

【Flask從入門到精通:第九課:數據庫基本操作、數據表操作以及數據操作】

數據庫操作 數據庫驅動&#xff08;drivers&#xff09;模塊&#xff1a;pymysql、MySQLDB 數據庫基本操作 在SQLAlchemy中&#xff0c;添加、修改、刪除操作&#xff0c;均由數據庫會話(sessionSM)管理。 會話用 db.session 表示。在準備把數據寫入數據庫前&#xff0c;要先…

交易平臺Zero Hash現已支持SUI交易

Zero Hash是一家領先的加密貨幣和穩定幣基礎設施平臺&#xff0c;為包括Stripe、Shift4和Franklin Templeton在內的公司提供支持&#xff0c;現在也支持對SUI的訪問。此舉使Zero Hash的客戶及其終端用戶能夠使用SUI。 提供API和SDK以及專注于無縫連接法幣、加密貨幣和穩定幣的…

讀人工智能全傳11人工智能會出什么錯

1. 人工智能會出什么錯 1.1. 一些報道是公正合理的&#xff0c;不過坦白地說&#xff0c;大部分報道都愚蠢得無可救藥 1.2. 一些報道頗有知識性和引導性&#xff0c;而大部分則是杞人憂天式的恐嚇 1.3. 滑稽的報道迎合了大眾對人工智能的“終結者式恐懼” 1.3.1. 我們創造出…

html設計(兩種常見的充電效果)

第一種 完整代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

方便快捷傳文件—搭建rsync文件傳輸服務器

比如我們有一個服務器&#xff0c;想把各個機器的文件都通過腳本傳給這臺機&#xff0c;用sftp或者直接rsync就必須輸密碼&#xff0c;肯定不行&#xff0c;做等效性免密又麻煩&#xff0c;怎么辦呢&#xff0c;這么辦&#xff01; 在服務端 yum -y install rsync #編輯&…

Vue3 關于scss預編譯中:deep 其中的deep如何理解

在SCSS預處理器中&#xff0c;:deep是一個偽類選擇器&#xff0c;用于選擇一個元素的所有后代元素&#xff0c;無論它們在DOM結構中的層級深度如何。換句話說&#xff0c;:deep選擇器是一個類似于CSS中的后代選擇器&#xff0c;但是它可以不考慮嵌套層級的限制&#xff0c;而是…

Android MessageQueue 源碼分析

類注釋 /*** Low-level class holding the list of messages to be dispatched by a* {link Looper}. Messages are not added directly to a MessageQueue,* but rather through {link Handler} objects associated with the Looper.** <p>You can retrieve the Messa…

【FineGrip】全光學感知:一種新的通用遙感圖像解釋任務和細粒度數據集(IEEE TGRS 2024)

摘要 目前的遙感解譯模型通常集中于單一的任務&#xff0c;如檢測、分割或字幕。但是&#xff0c;針對特定任務設計的模型無法實現綜合多層次解譯。該領域也缺乏多任務聯合解譯數據集。本文提出Panoptic Perception&#xff0c;一個新的任務和一個新的細粒度數據集&#xff08…

apache Kylin系列介紹及配置

Apache Kylin是一個開源的分布式分析引擎,用于OLAP(聯機分析處理)數據處理。它專門設計用于處理大規模的數據集,并提供快速的查詢和分析能力。 apache Kylin架構: Apache Kylin是一個開源的分布式分析引擎,旨在提供高性能、低延遲的OLAP(聯機分析處理)能力。下面是Ap…

nvim工具介紹

1. **seoul256.vim**: 一個基于首爾色彩的低對比度 Vim 顏色方案&#xff0c;適用于 256 色終端或 GVim。 2. **vim-easy-align**: Vim 插件&#xff0c;用于對齊文本。 3. **vim-go**: Vim 的 Go 語言插件&#xff0c;支持語法高亮、自動縮進等。 4. **coc.nvim**: 集成了 LSP…

GESP CCF C++ 二級認證真題 2024年6月

第 1 題 小楊父母帶他到某培訓機構給他報名參加CCF組織的GESP認證考試的第1級&#xff0c;那他可以選擇的認證語言有幾種&#xff1f;&#xff08; &#xff09; A. 1 B. 2 C. 3 D. 4 第 2 題 下面流程圖在yr輸入2024時&#xff0c;可以判定yr代表閏年&#xff0c;并輸出 2月…

介紹一款數據準實時復制(CDC)中間件 `Debezium`

簡介 文章開頭先介紹一下什么是CDC。數據準實時復制(CDC)是目前行內實時數據需求大量使用的技術。常用的中間件有Canal、Debezium、Flink CDC等 下面我們做一下對比 各有優缺點吧,本主要介紹一下Debezium中間件。 Debezium是什么 Debezium是一個為變更數據捕獲(CDC)提供…