天天看點

mongodb安全認證

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           

再登入認證就可以了。