上一篇我們了解了MongoDB的復制集概念和復制集的搭建,本篇我們來了解一下如何實現數據恢復 和 提升安全性的一些實踐。
1 Mongo Tools實現數據恢復
MongoDB 4.4之后,備份與恢復功能就和主版本分離開了,因此如果我們想要實現備份與恢復就需要獨立下載Tools包。
下載地址:https://www.mongodb.com/try/download/database-tools
這里,我們下載后將tgz包放到master節點下。
配置Mongo Tools
首先,解壓壓縮包並重命名,然后將其移動到指定目錄下:
tar -zvxf mongodb-database-tools-rhel70-x86_64-100.3.1.tgz mv mongodb-database-tools-rhel70-x86_64-100.3.1 tools mv tools /usr/local/mongodb
然后,為tools在master節點下配置環境變量:
Step1. 修改profile文件並刷新
cat >>/etc/profile<<"EOF" >export PATH=$PATH:/usr/local/mongodb/tools/bin >EOF source /etc/profile
Step2. 修改.bashrc文件
cat >>/root/.bashrc<<"EOF" >export PATH="$PATH:/usr/local/mongodb/tools/bin" >EOF
測試數據恢復
首先,下載測試數據備份dump:
鏈接: https://pan.baidu.com/s/1wII6S_-ipup4nu9NDKlWcw 提取碼: ihjm
其次,將其拷貝到master節點(因為我們只在master節點安裝了tools)並解壓:
tar -zvxf mongodb-database-tools-rhel70-x86_64-100.3.1.tgz
最后,在解壓的目錄下(我這里是/usr/local/mongodb/)執行mongorestore:
mongorestore -h mongo-master:27017
執行結果如下圖所示:
可以看到,有100000條記錄成功恢復。
我們也可以驗證一下:
可以看到orders表已經恢復到mock數據庫中。
此外,我們還可以使用mongo tools實現數據的備份,只需借助 mongodump 命令,示例如下:
# 排除指定的集合 mongodump --db test --excludeCollection=users --excludeCollection=salaries # 指定ip,端口,用戶名,認證,壓縮,輸出目錄 mongodump --host mongo-master --port 37017 --username user --password "pass" --gzip --out /opt/backup/mongodump-2020-05-17
2 提升安全性的實踐
默認是無安全性的設置
MongoDB默認的配置是無安全性的,用戶名密碼都不需要就可以直接連接。在默認模式下,一般不要開放外網連接端口,否則你的MongoDB很可能會被攻擊和刪庫。
更改MongoDB默認端口
MongoDB默認的端口是27017,一般線上環境都建議更改默認端口,比如改為20270,只需在mongodb.conf中配置即可。
net: bindIp: 0.0.0.0 port: 20270 # port
MongoDB的用戶認證方式
MongoDB提供了以下的用戶認證方式:
本次我們實踐一下用戶名+密碼的認證方式來提高一點安全性。
MongoDB的授權基於角色的權限控制,不同權限的用戶對數據庫的操作不同。這一點,跟傳統的關系型數據庫如MySQL、MSSQL沒有多大差異。
Mongo集群節點的認證
首先,我們需要配置一下Mongo集群節點的認證,目前有兩種認證方式。
這里,我們采用第一種,即Keyfile的方式。
Step1.在master節點上通過openssl生成Keyfile:
mkdir /usr/local/mongodb/certs cd /usr/local/mongodb/certs openssl rand -base64 756 > mongo-repl-set.key chmod 400 mongo-repl-set.key
Step2.將這個Keyfile復制到兩個slave節點上,文件目錄的組織可以保持一致。
Step3.分別修改各個節點的mongodb.conf,添加security的配置:
systemLog: destination: file path: /usr/local/mongodb/logs/mongodb.log # log path logAppend: true storage: dbPath: /usr/local/mongodb/data # data directory net: bindIp: 0.0.0.0 port: 27017 # port security: #authorization: enabled keyFile: /usr/local/mongodb/certs/mongo-repl-set.key replication: replSetName: localrs processManagement: fork: true
然后,重新啟動這個復制集集群中的三個節點。
創建認證用戶
首先,MongoDB規定,創建的第一個用戶一定要在admin數據庫,並且角色是 userAdminAnyDatabase。
use admin db.createUser({user:"admin",pwd:"yourpassword", roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
創建完第一個用戶,就可以用這個用戶登錄並創建其他角色的用戶了。
其次,創建一個集群的admin用戶:
use admin db.auth("admin","yourpassword") db.createUser({user:"replicasAdmin",pwd:"yourpassword", roles:[{role:"clusterAdmin",db:"admin"}]})
這時,你就可以用這個replicasAdmin用戶作為你的復制集的使用賬號了。
對於生產環境,你還需要自定義一些角色並生成對應用戶來控制訪問權限,例如下面的授權:
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'}] }
最后,你也可以創建一個root用戶,和Linux系統一樣,這是一個超級用戶賬號:
use admin db.auth("admin","yourpassword") db.createUser({user:"root",pwd:"yourpassword", roles:[{role:"root",db:"admin"}]})
當然,由於這個賬號權限太大,不建議分給應用程序層面(比如.NET或Java應用)進行聯接使用。
重啟復制集集群
將三個節點的mongodb.conf中的 security.authorization:true 的注釋去掉,重啟復制集:
...... security: authorization: enabled keyFile: /usr/local/mongodb/certs/mongo-repl-set.key ......
3 總結
本文介紹了如何通過Mongo Tools實現數據恢復 和 提高安全性的一些實踐。
下一篇,我們會學習MongoDB的基本操作和查詢。
參考資料
唐建法,《MongoDB高手課》(極客時間)
郭遠威,《MongoDB實戰指南》(圖書)
△推薦訂閱學習