mongo的認證包括用戶端-伺服器認證和伺服器節點間的認證。
用戶端-伺服器認證
用戶端-伺服器認證可以通過使用者名、密碼實作。
舉例為
nh_sc
庫添加使用者
nh_mongo
,指定角色為dbAdmin:
root@faith129:~# mongo 192.168.47.130
nh_sc:PRIMARY> use nh_sc
switched to db nh_sc
nh_sc:PRIMARY> db.createUser({user:"nh_mongo",pwd:"nh_mongo",roles:[{role:"dbAdmin",db:"nh_sc"}]})
Successfully added user: {
"user" : "nh_mongo",
"roles" : [
{
"role" : "dbAdmin",
"db" : "nh_sc"
}
]
}
檢視目前庫所有角色:
nh_sc:PRIMARY> show roles
{
"role" : "dbAdmin",
"db" : "nh_sc",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "dbOwner",
"db" : "nh_sc",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "enableSharding",
"db" : "nh_sc",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "read",
"db" : "nh_sc",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "readWrite",
"db" : "nh_sc",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "userAdmin",
"db" : "nh_sc",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
角色可選項:
read:允許使用者讀取指定資料庫
readWrite:允許使用者讀寫指定資料庫
dbAdmin:允許使用者在指定資料庫中執行管理函數,如索引建立、删除,檢視統計或通路system.profile
userAdmin:允許使用者向 system.users 集合寫入,可以找指定資料庫裡建立、删除和管理使用者
clusterAdmin:隻在 admin 資料庫中可用,賦予使用者所有分片和複制集相關函數的管理權限。
readAnyDatabase:隻在 admin 資料庫中可用,賦予使用者所有資料庫的讀權限
readWriteAnyDatabase:隻在 admin 資料庫中可用,賦予使用者所有資料庫的讀寫權限
userAdminAnyDatabase:隻在 admin 資料庫中可用,賦予使用者所有資料庫的 userAdmin 權限
dbAdminAnyDatabase:隻在 admin 資料庫中可用,賦予使用者所有資料庫的 dbAdmin 權限。
root:隻在 admin 資料庫中可用。超級賬号,超級權限
登陸admin庫可以檢視所有使用者:
nh_sc:PRIMARY> use admin
switched to db admin
nh_sc:PRIMARY> db.system.users.find()
{ "_id" : "nh_sc.nh_mongo", "userId" : UUID("0de75229-9278-4bdc-aadf-ee66972fc42f"), "user" : "nh_mongo", "db" : "nh_sc", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "xnUr7j8zMJznkCivakZ93g==", "storedKey" : "DYDX9Rn6JoeDtNHWUFtN3SzcSGI=", "serverKey" : "e1r46NjlYTwqnpGFyHNUxR+mEPI=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "q8N1VBRQuEU/WP8c5M+nysb6cD6w8iep7XOItA==", "storedKey" : "+b1pBRgedX03PJ/7Ci4QzzICi15kECLyQa47bZRE8cs=", "serverKey" : "AtrB9wvV6ByjdrMPPxiW8XLj2vI5DGocu1YXVwWkz1s=" } }, "roles" : [ { "role" : "dbAdmin", "db" : "nh_sc" } ] }
測試
db.auth("tom","123")
登陸測試
現在有兩種方式進行使用者身份的驗證。
第一種類似MySql用戶端連接配接時,指定使用者名、密碼、db名稱:
mongo --port 27017 -u "adminUser" -p "adminPass" --authenticationDatabase "admin"
第二種用戶端連接配接後,再進行驗證:
root@faith129:/server/deployments/mongodb-4.2.6# mongo 192.168.47.130
nh_sc:PRIMARY> use admin
switched to db admin
nh_sc:PRIMARY> db.auth("nh_admin","nh_admin")
1
注意要先選擇資料庫再執行
db.auth()
,輸出 1 表示驗證成功。
還有一點需要注意,如果
admin
庫沒有任何使用者的話,即使在其他資料庫中建立了使用者,啟用身份驗證,預設的連接配接方式依然會有超級權限。
伺服器節點間認證
啟用使用者名、密碼認證後,登陸mongo叢集,會發現副本集狀态:
目前登入節點狀态為:RECOVERING
叢集中其他節點狀态為:not reachable/healthy
原因就啟用認證後,不僅用戶端連接配接需要認證,叢集内不同節點之間也需要互相認證,否則叢集内各節點之間無法通信,會造成了目前登入節點一直是RECOVERING狀态,而其他節點則為
not reachable
狀态。
解決方式為添加節點認證,mongodb官方文檔:
https://docs.mongodb.com/manual/core/security-internal-authentication/#keyfiles
keyfile為基本認證方式,使用方式為生成秘鑰檔案,例如:
root@faith129:/server/deployments/mongodb-4.2.6# openssl rand -base64 745 > /data/mongodb/keyfile
root@faith129:/server/deployments/mongodb-4.2.6# cat /data/mongodb/keyfile
/PifVc2MpR/T5spjh3Be6IPIU+cqmCJRpiApdFCvhfRaXcZEt+iszmmsCCsiUwWN
9PdmPRJ/rcXIzI1S+XGiqeEsFuCNH4PDBaf98CHCUv5aHclMi8cHdmSZtLuwBuiD
fmwjvoTk0XMZfN8Qc4NubJ7yAVRwGWYXWdbwb+H/bEhtmWd/8lOcOVhSagK/PHQ7
NXEfvMf+d48tUjBwRdb1NoSO/Jn2VntoAlhDHZVZvN3w4WvzCKE0vOgLbaCkdzUl
NftUMj3/8nWxw8frY6FwoB0Azfr+Upor5ERmfxjcWn/1W2XVI13+aPW/9W2mkQIp
sInot8L8s9IbhSwfDo2i7x9172Bt1f+XBH4IiqtTuPn5+h+k9+ceu2CZQ+0acrSt
nlnf2dlFVoewE+qhg7jrzhauAVYHCQAP4qOIHrbWnN9Idj+gRgqGx+COgf+6xsvs
268Fuh+x2NFqgSwtw8hvtJQQHI1ds9WncEjwN6OsSPd7rYnOyIrjaJZJ17KcMaFH
kbe4VcfoSTIYVMN+EaefMwnQhjesYUuCATGh8cOQ6Rym36oH4FAS7ICmY7/gCHFi
RagAxAHNDuNqpoeIEbCEcNGuUA65Zub88pqIWE4dIUH8K66ss//1iqltBV0ij2OR
C2gj0pBdRvZ9MgIuGy4NRSf/fmW74VSmufe7VsPOp3gwttOt2HyRL/NRfYLmQXGu
Xxpz0eBO7ecaDZJWoGPAwoPRAFavljCDMuE7LTdb19qdLqUGC/1TZMsyCla1DEGw
LXNaYV+Getx/8IwPlZmhpRvMcLDTPRAG+upE044APGtiAJBUe8/G1yUssPFxmXnz
ZuJoZ37o6ivi1BY3Nj78/3M7mKvgvqAzZ+lvy/WRYzPRa6sVrQkqy5R772eyy/Oj
raG56X7yJn3TIsgO8/HJ+Uiws/PVDuuXl28VcVOx1XfDyj40CIVrP5P2RxUfMkpP
i0bDwqZbx8B/Yp5/UTmXEtJw8UI2FHNseA==
root@faith129:/server/deployments/mongodb-4.2.6# scp /data/mongodb/keyfile root@faith130:/data/mongodb
keyfile 100% 1012 1.0KB/s 00:00
root@faith129:/server/deployments/mongodb-4.2.6# scp /data/mongodb/keyfile root@faith141:/data/mongodb
keyfile
分發檔案到每個mongo節點,并修改檔案權限為600:
root@faith129:/server/deployments/mongodb-4.2.6# chmod 600 /data/mongodb/keyfile
root@faith129:/server/deployments/mongodb-4.2.6# ll /data/mongodb/keyfile
-rw------- 1 root root 1012 May 12 23:45 /data/mongodb/keyfile
在mongodb.yml中配置:
security:
authorization: enabled
clusterAuthMode: keyFile
keyFile: /data/mongodb/keyfile
再登入認證就可以了。