1. 事物的四大特性 事務是邏輯上的一組操作,要麼都執行,要麼都不執行 原子性(Atomicity):事務是最小的執行單位,不允許分割。事務的原子性確保動作要麼全部完成,要麼完全不起作用; 一致性(Consistency):執行事務前後,數據保持一致,例如轉賬業務中,無論事務是否成功,轉賬者和收款人 ...
線上mongo是四節點的副本集,其中一個節點是延遲並且隱藏不參與選舉。由於業務的需要,現在需要開啟mongo的安全認證。根據官網的介紹( https://www.mongodb.com/zh-cn/docs/manual/tutorial/enforce-keyfile-access-control-in-existing-replica-set-without-downtime/),可以採取不停機(transitionToAuth: true)的方式,將副本集更新為密鑰文件身份驗證,並且連接到副本集的客戶端也需要認證。
1.基於角色的訪問控制
MongoDB 採用基於角色的訪問控制 (RBAC) 來管理對 MongoDB 系統的訪問。向用戶授予一個或多個角色,而這些角色決定了該用戶對資料庫資源和操作的訪問許可權。在分配的角色之外,該用戶無權訪問系統。
因此需要先創建角色,不同的角色對應不同的許可權。其次在創建用戶,將用戶分配不同的角色。需要註意的是,在創建用戶時需要指定Authentication Database,這個db就是此用戶的身份驗證資料庫,不同的用戶訪問不同的db,也可以統一指定一個db用於認證,比如admin。
2.開啟安全認證
- 用戶許可權
賬號分配遵循最小許可權原則,分別是read(只讀),readWrite(讀寫),dbAdmin(日常運維管理),userAdmin(管理用戶許可權),clusterAdmin(副本集管理),clusterMonitor(監控),backup(備份用戶)
查看代碼
#只讀
db.getSiblingDB("admin").runCommand( {createUser: "onlyread",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "readAnyDatabase", db:"admin" }]} )
#讀寫
db.getSiblingDB("admin").runCommand( {createUser: "readwrite",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "readWriteAnyDatabase", db:"admin" }]} )
#dbadmin
db.getSiblingDB("admin").runCommand( {createUser: "dbadmin",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "dbAdminAnyDatabase", db:"admin" }]} )
#useradmin
db.getSiblingDB("admin").runCommand( {createUser: "grantadmin",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "userAdminAnyDatabase", db:"admin" }]} )
#clusterAdmin
db.getSiblingDB("admin").runCommand( {createUser: "replAdmin",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "clusterAdmin", db:"admin" }]} )
#superuser
db.getSiblingDB("admin").runCommand( {createUser: "rootuser",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "root", db:"admin" }]} )
#clusterMonitor
db.getSiblingDB("admin").runCommand( {createUser: "monitor",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "clusterMonitor", db:"admin" }]} )
#備份還原
db.getSiblingDB("admin").createRole({ "role": "pbmAnyAction",
"privileges": [
{ "resource": { "anyResource": true },
"actions": [ "anyAction" ]
}
],
"roles": []
});
db.getSiblingDB("admin").createUser({user: "pbmuser",
"pwd": "secretpwd",
"roles" : [
{ "db" : "admin", "role" : "readWrite", "collection": "" },
{ "db" : "admin", "role" : "backup" },
{ "db" : "admin", "role" : "clusterMonitor" },
{ "db" : "admin", "role" : "restore" },
{ "db" : "admin", "role" : "pbmAnyAction" }
]
});
- 創建密鑰文件
查看代碼
openssl rand -base64 756 > 文件路徑
chmod 400 文件路徑
- 拷貝密鑰文件至所有節點
- 配置文件
在配置文件中,添加以下內容
查看代碼
security:
keyFile: 文件路徑
clusterAuthMode: keyFile
authorization: enabled
transitionToAuth: true
解釋
keyFile指明密鑰文件路徑
clusterAuthMode副本集之間的認證方式為密鑰文件
authorization開啟認證
transitionToAuth: true 過渡狀態,既接受經過身份驗證的連接,也接受未經身份驗證的連接
- 應用程式連接
開啟安全認證之後,應用程式需要修改url,加上賬號,密碼,以及認證db
查看代碼
mongodb://賬號:密碼@ip1:port,ip2:port,ip3:port/admin?authSource=admin
- 滾動重啟
現在重啟其他兩個節點,主庫在降級重啟
- 監控用戶
這裡就需要監控一下,沒有使用認證方式連接的用戶了
統計所有鏈接的ip
查看代碼
grep "connection accepted from" /data1/mongo_rs1/log/mongod.log | awk -F ':' '{print $3}' | awk '{print $NF}' | sort | uniq
統計所有認證的ip
grep "authenticated" /data1/mongo_rs1/log/mongod.log | awk -F ':' '{print $3}' | awk '{print $NF}' | sort | uniq
對比以上兩個結果,找出沒有認證的ip
找出認證失敗的IP
grep "AuthenticationFailed" /data1/mongo_rs1/log/mongod.log| grep -v "requestId" | awk -F ':' '{print $3}' | awk '{print $NF}' | sort | uniq
- 取消過渡狀態
持續監控一段時間,直到沒有出現未認證的ip,在取消過渡狀態
刪除配置文件transitionToAuth: true,並滾動重啟