MongoDB入門實戰教程(3)


上一篇我們了解了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:

其次,將其拷貝到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實戰指南》(圖書)

△推薦訂閱學習

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM