NoSQL | MongoDB入門實戰(zhàn)教程(3)

上一篇我們了解了MongoDB的復(fù)制集概念和復(fù)制集的搭建,本篇我們來了解一下如何實現(xiàn)數(shù)據(jù)恢復(fù) 和 提升安全性的一些實踐。
MongoDB 4.4之后,備份與恢復(fù)功能就和主版本分離開了,因此如果我們想要實現(xiàn)備份與恢復(fù)就需要獨立下載Tools包。
下載地址:https://www.mongodb.com/try/download/database-tools

這里,我們下載后將tgz包放到master節(jié)點下。
配置Mongo Tools
首先,解壓壓縮包并重命名,然后將其移動到指定目錄下:
tar -zvxf mongodb-database-tools-rhel70-x86_64-100.3.1.tgzmv mongodb-database-tools-rhel70-x86_64-100.3.1 toolsmv tools /usr/local/mongodb
然后,為tools在master節(jié)點下配置環(huán)境變量:
Step1. 修改profile文件并刷新
cat /etc/profile<<"EOF">export PATH=$PATH:/usr/local/mongodb/tools/bin>EOFsource /etc/profile
Step2. 修改.bashrc文件
cat >>/root/.bashrc<<"EOF"export PATH="$PATH:/usr/local/mongodb/tools/bin"EOF
測試數(shù)據(jù)恢復(fù)
首先,下載測試數(shù)據(jù)備份dump:
鏈接: https://pan.baidu.com/s/1wII6S_-ipup4nu9NDKlWcw提取碼: ihjm
其次,將其拷貝到master節(jié)點(因為我們只在master節(jié)點安裝了tools)并解壓:
tar -zvxf mongodb-database-tools-rhel70-x86_64-100.3.1.tgz最后,在解壓的目錄下(我這里是/usr/local/mongodb/)執(zhí)行mongorestore:
mongorestore -h mongo-master:27017執(zhí)行結(jié)果如下圖所示:

可以看到,有100000條記錄成功恢復(fù)。
我們也可以驗證一下:

可以看到orders表已經(jīng)恢復(fù)到mock數(shù)據(jù)庫中。
此外,我們還可以使用mongo tools實現(xiàn)數(shù)據(jù)的備份,只需借助 mongodump 命令,示例如下:
# 排除指定的集合mongodump --db test --excludeCollection=users --excludeCollection=salaries# 指定ip,端口,用戶名,認(rèn)證,壓縮,輸出目錄mongodump --host mongo-master --port 37017 --username user --password "pass" --gzip --out /opt/backup/mongodump-2020-05-17
默認(rèn)是無安全性的設(shè)置
MongoDB默認(rèn)的配置是無安全性的,用戶名密碼都不需要就可以直接連接。在默認(rèn)模式下,一般不要開放外網(wǎng)連接端口,否則你的MongoDB很可能會被攻擊和刪庫。
更改MongoDB默認(rèn)端口
MongoDB默認(rèn)的端口是27017,一般線上環(huán)境都建議更改默認(rèn)端口,比如改為20270,只需在mongodb.conf中配置即可。
net:bindIp: 0.0.0.0: 20270 # port
MongoDB的用戶認(rèn)證方式
MongoDB提供了以下的用戶認(rèn)證方式。

本次我們實踐一下用戶名+密碼的認(rèn)證方式來提高一點安全性。
MongoDB的授權(quán)基于角色的權(quán)限控制,不同權(quán)限的用戶對數(shù)據(jù)庫的操作不同。這一點,跟傳統(tǒng)的關(guān)系型數(shù)據(jù)庫如MySQL、MSSQL沒有多大差異。

Mongo集群節(jié)點的認(rèn)證
首先,我們需要配置一下Mongo集群節(jié)點的認(rèn)證,目前有兩種認(rèn)證方式。

這里,我們采用第一種,即Keyfile的方式。
Step1.在master節(jié)點上通過openssl生成Keyfile:
mkdir /usr/local/mongodb/certscd /usr/local/mongodb/certsopenssl rand -base64 756 > mongo-repl-set.keychmod 400 mongo-repl-set.key
Step2.將這個Keyfile復(fù)制到兩個slave節(jié)點上,文件目錄的組織可以保持一致。
Step3.分別修改各個節(jié)點的mongodb.conf,添加security的配置:
systemLog:destination: filepath: /usr/local/mongodb/logs/mongodb.log # log pathlogAppend: truestorage:dbPath: /usr/local/mongodb/data # data directorynet:bindIp: 0.0.0.0port: 27017 # portsecurity:#authorization: enabledkeyFile: /usr/local/mongodb/certs/mongo-repl-set.keyreplication:replSetName: localrsprocessManagement:: true
然后,重新啟動這個復(fù)制集集群中的三個節(jié)點。
創(chuàng)建認(rèn)證用戶
首先,MongoDB規(guī)定,創(chuàng)建的第一個用戶一定要在admin數(shù)據(jù)庫,并且角色是 userAdminAnyDatabase。
use admindb.createUser({user:"admin",pwd:"yourpassword",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
創(chuàng)建完第一個用戶,就可以用這個用戶登錄并創(chuàng)建其他角色的用戶了。
其次,創(chuàng)建一個集群的admin用戶:
use admindb.auth("admin","yourpassword")db.createUser({user:"replicasAdmin",pwd:"yourpassword",roles:[{role:"clusterAdmin",db:"admin"}]})
這時,你就可以用這個replicasAdmin用戶作為你的復(fù)制集的使用賬號了。
對于生產(chǎn)環(huán)境,你還需要自定義一些角色并生成對應(yīng)用戶來控制訪問權(quán)限,例如下面的授權(quán):
db.createRole({role: 'sampleRole',privileges: [{resource: {db: 'sampledb', collection: 'sample'},actions: ["update"]}],roles: [{role: 'read',db: 'sampledb'}]})db.createUser({user: 'sampleUser',pwd: 'password',roles: [{role: 'sampleRole', db: 'admin'}]}
最后,你也可以創(chuàng)建一個root用戶,和Linux系統(tǒng)一樣,這是一個超級用戶賬號:
use admindb.auth("admin","yourpassword")db.createUser({user:"root",pwd:"yourpassword",roles:[{role:"root",db:"admin"}]})
當(dāng)然,由于這個賬號權(quán)限太大,不建議分給應(yīng)用程序?qū)用妫ū热?NET或Java應(yīng)用)進(jìn)行聯(lián)接使用。
重啟復(fù)制集集群
將三個節(jié)點的mongodb.conf中的 security.authorization:true 的注釋去掉,重啟復(fù)制集:
......security:authorization: enabledkeyFile: /usr/local/mongodb/certs/mongo-repl-set.key......
本文介紹了如何通過Mongo Tools實現(xiàn)數(shù)據(jù)恢復(fù) 和 提高安全性的一些實踐。
下一篇,我們會學(xué)習(xí)MongoDB的基本操作和查詢。
參考資料
唐建法,《MongoDB高手課》(極客時間)
郭遠(yuǎn)威,《MongoDB實戰(zhàn)指南》(圖書)
