[.NET] MongoDB 啟用安全驗證模式

介紹使用 MongodDB Enabled Authentication 時的設定方式。

前言


之前有提到,MongoDB 預設是未啟用安全驗證模式,當然我們為了確保資料庫的安全性與使用者的控管,在實際運行時就必須要使用安全驗證模式,本篇就來介紹一下如何啟用安全驗證模式。

 

角色


首先,先釐清在 MongoDB 中,各種不同的角色有什麼區別,基本的角色種類如下。

 

資料庫使用者角色

read : 讀取特定資料庫的權限,例如 find() 等方法。

readWrite : 讀取與寫入特定資料庫的權限,例如 insert(), remove() 及 update() 等方法。

 

資料庫管理角色

dbAdmin : 提供特定資料庫管理權限,例如 create(), createCollection() 及 drop() 等方法,另外只有此角色可讀取 system.profile 集合。

userAdmin : 提供特定資料庫可讀寫 system.users 集合權限。

 

管理角色

clusterAdmin : 提供多個資料庫管理權限,適用於管理資料庫,無法訪問本地或設定資料庫。

 

任意資料庫管理角色

readAnyDatabase : 同樣只提供讀取功能,但可以訪問 MongoDB 中任意的資料庫。

readWriteAnyDatabase : 同樣只提供讀取與寫入功能,但可以訪問 MongoDB 中任意資料庫。

userAdminAnyDatabase : 權限同等於 userAdmin ,但可以訪問 MongoDB 中任意資料庫。

dbAdminAnyDatabse : 權限同等於 dbAdmin ,但可以訪問 MongoDB 中任意的資料庫。

 

如需要詳細的權限說明,可參考 User Privilege Roles in MongoDB 文件。

 

啟用 MongoDB 安全驗證模式


在將 MongoDB 以安全驗證模式啟動之前,必須要先加入資料庫管理員帳號,這需要注意的是 MongoDB 的資料庫帳號於每個不同資料庫都各自獨立,也就意味著在 Database1 中建立的帳號在 Database2 中並不存在,且如建立同名帳號權限也可以是不一樣的 。而在啟動安全驗證之前,必須要先在 admin 資料庫建立一個管理帳號 ( admin 資料庫名大小寫必須一致),如未在 admin 先建立管理帳戶,之後在使用 --auth 啟動 MongoDB 時就會發生 ERROR 1067 服務啟動失敗問題。

 

連線至 MongoDB 切換到 admin 資料庫,指令如下。

use admin

 

切換完成後接著輸入 addUser 來建立總管理帳號,指令如下。

db.addUser( { user:"Arvin", pwd:"password", roles: [ "userAdminAnyDatabase","readWriteAnyDatabase"] } )

 

完成後返回以下內容即完成新增。

{
        "user" : "arvin",
        "pwd" : "fa7eafa2b8492e286a744b778ec19aa7",
        "roles" : [  "userAdminAnyDatabase","readWriteAnyDatabase", ],
        "_id" : ObjectId("530595cddd0ae160b82444cb")
}

 

接下來需要調整啟動 MongoDB 時使用安全驗證模式,在啟動時增加一個參數 --auth 即可,如下指令。

mongod --auth

 

如果是使用設定檔的方式,只需要在設定檔中增加 auth = true 即可,如下。

dbpath = D:\MongoDB\data
logpath = D:\MongoDB\log\mongo.log
logappend = true
auth = true

 

到此可以測試看看安全驗證是否設定成功,連接入 MongoDB shell ,輸入 show collections 指令會發現跳出無權限訊息,如下圖。

 

接著進行登入動作,輸入以下指令,看到回傳 1 則表示登入成功。

db.auth("arvin","password")

 

登入後再嘗試輸入 show collections 查看所有集合就能夠讀取了,如下圖。

 

如果針對特定資料庫設定使用者帳號,這時就可以透過這個總管理帳號至不同資料庫使用 addUser() 指令新增,例如需要在 test 資料庫加入一個新使用者帳號並只給予 readWrite 權限。

 

程式碼使用安全驗證連線 MongoDB


在 MongoDB 設定好安全驗證後,原本程式碼的部分就需要調整成安全驗證的連線方式,有兩種方式可以調整,如下。

 

1.修改連線字串

mongodb://<username>:<passowrd>@localhost:27017/<database>

範例

mongodb://testdbo:password@localhost:27017/test

 

2.建立安全憑證物件


// 建立 Server 位置物件
var serverAddress = new MongoServerAddress("localhost", 27017);
// 建立安全證書物件
var credential = MongoCredential.CreateMongoCRCredential("test", "testdbo", "password");
// 設定 Client 物件
var clientSettings = new MongoClientSettings
{
    Server = serverAddress,
    Credentials = new[] { credential }
};
// 產生 MongoClient 物件
_mongoClient = new MongoClient(clientSettings);
// 取得 MongoServer 物件
_mongoServer = _mongoClient.GetServer();
// 取得 MongoDatabase 物件
_mongoDatabase = _mongoServer.GetDatabase("test");
// 取得 Collection
_mongoCollection = _mongoDatabase.GetCollection<Product>("Products");

 

以上就是針對於 MongoDB 如使用安全驗證之後需要進行的設定與調整介紹。

 

參考資料


Access Control Tutorials

Authenticate to MongoDB with the C# Driver

 

 


以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)