mongodb分片集群開啟安全認證


原文地址:https://blog.csdn.net/uncle_david/article/details/78713551

對於搭建好的mongodb副本集加分片集群,為了安全,啟動安全認證,使用賬號密碼登錄。

默認的mongodb是不設置認證的。只要ip和端口正確就能連接,這樣是不安全的。mongodb官網上也說,為了能保障mongodb的安全可以做以下幾個步驟:

1、使用新的端口,默認的27017端口如果一旦知道了ip就能連接上,不太安全

2、設置mongodb的網絡環境,最好將mongodb部署到公司服務器內網,這樣外網是訪問不到的。公司內部訪問使用vpn等

3、開啟安全認證。認證要同時設置服務器之間的內部認證方式,同時要設置客戶端連接到集群的賬號密碼認證方式

環境准備
最簡單的集群是3*3,即三個分片和三個副本集,可以保證高可用,即使一台機器全宕機了,服務仍然能夠正常訪問。

mongodb版本:mongodb-linux-x86_64-rhel70-3.4.9.tgz

操作系統:centos7

三台服務器:10.12.40.82,10.12.40.83,10.12.40.86

mongodb副本集加分片集群搭建

10.12.40.82 10.12.40.83 10.12.40.86
mongos:23000 mongos:23000 mongos:23000
config server:23100 config server:23100 config server:23100
shard server1 主節點:23101 shard server1從節點:23101 shard server1 仲裁節點:23101
shard server2從節點:23102 shard server2仲裁節點:23102 shard server2主節點:23102
shard server3仲裁節點:23103 shard server3主節點:23103 shard server3從節點:23103

 

紅色部分為各個節點的端口號。

 

對副本集執行訪問控制需要配置兩個方面:

    1、副本集和共享集群的各個節點成員之間使用內部身份驗證,可以使用密鑰文件或x.509證書。密鑰文件比較簡單,本文介紹的也是使用密鑰文件,官方推薦如果是測試環境可以使用密鑰文件,但是正是環境,官方推薦x.509證書。原理就是,集群中每一個實例彼此連接的時候都檢驗彼此使用的證書的內容是否相同。只有證書相同的實例彼此才可以訪問

    2、使用客戶端連接到mongodb集群時,開啟訪問授權。對於集群外部的訪問。如通過可視化客戶端,或者通過代碼連接的時候,需要開啟授權。

 

下面開始詳細說明:

1、生成密鑰文件。
    1.1在keyfile身份驗證中,副本集中的每個mongod實例都使用keyfile的內容作為共享密碼,只有具有正確密鑰文件的mongod或者mongos實例可以連接到副本集。密鑰文件的內容必須在6到1024個字符之間,並且在unix/linux系統中文件所有者必須有對文件至少有讀的權限。

    1.2可以用任何方式生成密鑰文件例如:

openssl rand -base64 756 > /data/mongodb/testKeyFile.file
chmod 400 /data/mongodb/keyfile/testKeyFile.file

第一條命令是生成密鑰文件,第二條命令是使用chmod更改文件權限,為文件所有者提供讀權限
2、將密鑰復制到集群中的每台機器(82,83,86)的指定位置

如:scp -P22 /data/mongodb/testKeyFile.file root@10.12.40.86:/data/mongodb

    2.1一定要保證密鑰文件一致。文件位置隨便。但是為了方便查找,建議每台機器都放到一個固定的位置。我的配置文件都放在/data/mongodb/testKeyFile.file

3、預先創建好一個管理員賬號和密碼然后將集群中的所有mongod和mongos全部關閉
賬號可以在集群認開啟認證以后添加。但是那時候添加比較謹慎。只能添加一次,如果忘記了就無法再連接到集群。建議在沒開啟集群認證的時候先添加好管理員用戶名和密碼然后再開啟認證再重啟

連接任意一台機器的mongos

mongo --port 23000


添加用戶

use admin //注意一定要使用admin數據庫
db.createUser(
{
user:"your account",
pwd:"your password",
roles:[{role:"root",db:"admin"}]
}
)

然后依次連接到每一台機器上執行。

killall mongod
killall mongos

然后刪除每個mongod實例存儲數據存儲路徑下面的mongod.lock(如果后面啟動不報錯可以不處理)
  3.1可以發現。集群多少有的節點都關閉了。沒開啟認證的集群如果開啟認證需要集群宕機幾分鍾。當然也有熱啟動的方式,官方文檔中有介紹

說明:可以先開啟認證重啟后再添加用戶。但是只能在admin庫添加一次,所以如果忘記了,或者權限分配不恰當就無法再更改,所以建議先添加用戶再開啟認證重啟,並且集群不建議在每個單節點添加用戶,並且建議單節點關閉初始添加賬號的權限,詳情見enableLocalhostAuthBypass)

4、使用訪問控制強制重新啟動復制集的每個成員**** 
    這個步驟比較重要。設置訪問控制有兩種方式。我選擇在配置文件里面配置好。(也可以在啟動命令時使用命令來指定)

   4.1依次在每台機器上的mongod(注意是所有的mongod不是mongos)的配置文件中加入下面一段配置。如我在10.12.40.83上的config server,shard1,shard2,shard3都加入下面的配置文件

security:
  keyFile: /data/mongodb/testKeyFile.file
  authorization: enabled

   4.2依次在每台機器上的mongos配置文件中加入下面一段配置。如我在10.12.40.83上的mongos配置文件中加入上面的一段配置

security:
  keyFile: /data/mongodb/testKeyFile.file

解釋:

    mongos比mongod少了authorization:enabled的配置。原因是,副本集加分片的安全認證需要配置兩方面的,副本集各個節點之間使用內部身份驗證,用於內部各個mongo實例的通信,只有相同keyfile才能相互訪問。所以都要開啟keyFile: /data/mongodb/testKeyFile.file

    然而對於所有的mongod,才是真正的保存數據的分片。mongos只做路由,不保存數據。所以所有的mongod開啟訪問數據的授權authorization:enabled。這樣用戶只有賬號密碼正確才能訪問到數據

    4.3重啟每個mongo示例。因為我的認證配置在了配置文件里面,所以啟動命令不需要再加認證的參數 (例如--auth等)

mongod -f /data/mongodb/config/configs.config
mongod -f /data/mongodb/config/shard1.config
mongod -f /data/mongodb/config/shard2.config
mongod -f /data/mongodb/config/shard3.config
mongos -f /data/mongodb/config/mongos.config

    依次重啟三台機器的mongod和mongos實例

 

5、連接mongodb集群
如果用mongo sell腳本連接

mongo --port 23000
use admin
db.auth("your account","your password")

 

如果返回1表示連接成功,然后你就可以訪問自己的數據庫啦~!如use testDB


免責聲明!

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



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