1. 程式人生 > >MongoDB安全訪問控制

MongoDB安全訪問控制

一、概述

有時候我們會看到有些伺服器或者資料庫被別人惡意攻擊,會導致中毒或者資料被盜取所,以我們對自己的伺服器和資料庫的訪問安全性控制就顯得至關重要。

今天我們來說說MongoDB的幾點安全性訪問控制,可以通過的IP、埠或者使用賬戶、密碼登入,來提高我們資料庫和伺服器的安全性訪問情況,主要是通過

啟動Mongod服務的時候,指定相關的引數,或者基於角色上讀寫或者管理許可權上的控制,接下來讓我們一起來看一下。

二、指定相關引數

1、--auth

我們在啟動mongodb服務的時候,可以新增--auth引數,MongoDB會驗證客戶端連線的賬戶和密碼,

以確定其是否有訪問的許可權。如果認證不通過,那麼客戶端不能訪問MongoDB的資料庫。

我們來驗證下,MongoDB預設是不開啟賬密驗證的

[[email protected] bin]# ./mongod --dbpath /usr/local/mongodb/data/db
[[email protected] bin]# ./mongo
MongoDB Enterprise > show dbs   //預設是可以檢視到所有例項
local       
test       
MongoDB Enterprise > use admin
switched to db admin
//切換到admin下建立dba使用者
MongoDB Enterprise > db.createUser({user:"dba",pwd:"dba",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
Successfully added user: {
    "user" : "dba",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
//檢視下剛剛有沒有剛剛建立的使用者
MongoDB Enterprise > show users
{
    "_id" : "admin.dba",
    "user" : "dba",
    "db" : "admin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}
或者使用這樣的命令檢視所
MongoDB Enterprise > db.system.users.find()
{ "_id" : "admin.dba", "user" : "dba", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "qv2mpn/EzS7DjhwYPn0iJQ==", 
"storedKey" : "FNwJUOCaOIeEBfJwuJPpx4nUs1k=", "serverKey" : "rXL2hql7dsxytS3G7aFxSob7ACs=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }

然後我們再重啟服務,這次重新啟動的時候要加上--auth引數

[[email protected] bin]# ./mongod --dbpath /usr/local/mongodb/data/db  --auth
[[email protected] bin]# ./mongo
MongoDB Enterprise > use admin
switched to db admin
MongoDB Enterprise > show dbs   //新增上--auth引數後,沒有進行驗證檢視資料庫例項的時候直接報錯沒有執行的許可權
2018-05-30T11:02:02.277+0800 E QUERY    [thread1] Error: listDatabases failed:{
    "ok" : 0,
    "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
    "code" : 13
} :
[email protected]
/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/mongo.js:62:1 [email protected]/mongo/shell/utils.js:761:19 [email protected]/mongo/shell/utils.js:651:15 @(shellhelp2):1:1 //接著我們進行驗證下後再檢視例項 MongoDB Enterprise > db.auth('dba','dba') //1表示驗證通過,0表示驗證不通過(賬密不匹配) 1 MongoDB Enterprise > show dbs //驗證通過後就能夠正常檢視到例項 admin local test

2、--port

預設埠是27017,該引數指定Mongod對應的埠,如果指定埠後用其他埠是無法訪問的

//啟動服務的時候指定埠28017
[[email protected] bin]# ./mongod --dbpath /usr/local/mongodb/date/db  --port 28017
//然後我們再訪問看看
[[email protected] bin]# ./mongo  //沒有指定埠的時候,無法訪問
MongoDB shell version: 3.2.8
connecting to: test
2018-06-05T17:31:51.737+0800 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2018-06-05T17:31:51.738+0800 E QUERY    [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :
[email protected]/mongo/shell/mongo.js:229:14
@(connect):1:6
exception: connect failed
[[email protected] bin]# ./mongo --port=28017    //指定28017埠後,可以正常訪問
MongoDB shell version: 3.2.8
connecting to: 127.0.0.1:28017/test
Server has startup warnings: 
2018-06-05T17:26:59.313+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2018-06-05T17:26:59.313+0800 I CONTROL  [initandlisten] 
MongoDB Enterprise > show dbs
local  0.000GB

3、--bind_ip

預設是沒有IP管控的,該引數指定Mongod服務對應其他可以訪問的IP,如果指定後只能是指定的IP才有訪問許可權

//設定只有本地IP才能訪問 127.0.0.1
[[email protected] bin]# ./mongod --dbpath /usr/local/mongodb/date/db  --bind_ip 127.0.0.1
//使用另一個IP訪問情況
[[email protected] bin]# ./mongo --bind_id IP1  //設定前是可以IP2是可以訪問IP的
Error parsing command line: unrecognised option '--bind_id'
try './mongo --help' for more information
[[email protected] bin]# ./mongo 10.130.170.41
MongoDB shell version: 3.2.8
connecting to: IP1/test
Server has startup warnings: 
2018-06-06T15:32:54.546+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2018-06-06T15:32:54.546+0800 I CONTROL  [initandlisten] 
MongoDB Enterprise > show dbs
local  0.000GB
[[email protected] bin]# ./mongo IP1  設定後IP2訪問IP1就報錯
MongoDB shell version: 3.2.8
connecting to: IP1/test
2018-06-06T15:51:40.506+0800 W NETWORK  [thread1] Failed to connect to 10.130.170.41:27017, reason: errno:111 Connection refused
2018-06-06T15:51:40.506+0800 E QUERY    [thread1] Error: couldn't connect to server 10.130.170.41:27017, connection attempt failed :
[email protected]/mongo/shell/mongo.js:231:14
@(connect):1:6
exception: connect failed

可以新增多個IP訪問,中間用逗號‘,’隔開,例如

[[email protected] bin]# ./mongod --dbpath /usr/local/mongodb/date/db  --bind_ip 127.0.0.1,IP2

三、基於角色許可權

clipboard.png

驗證資料庫使用者角色:

1、在test集合上建立只讀和讀寫使用者

//只讀使用者 readonly
MongoDB Enterprise > db.createUser({user:"readonly",pwd:"123",roles:[{role:"read",db:"test"}]})
Successfully added user: {
    "user" : "readonly",
    "roles" : [
        {
            "role" : "read",
            "db" : "test"
        }
    ]
}
//讀寫使用者  readwrite
MongoDB Enterprise > db.createUser({user:"readwrite",pwd:"123123",roles:[{role:"readWrite",db:"test"}]})
Successfully added user: {
    "user" : "readwrite",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "test"
        }
    ]
}
//檢視使用者
MongoDB Enterprise > show users
{
    "_id" : "test.readonly",
    "user" : "readonly",
    "db" : "test",
    "roles" : [
        {
            "role" : "read",
            "db" : "test"
        }
    ]
}
{
    "_id" : "test.readwrite",
    "user" : "readwrite",
    "db" : "test",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "test"
        }
    ]
}

2、重啟mongod服務

[[email protected] bin]# ./mongod --dbpath /usr/local/mongodb/data/db --auth

3、驗證使用者許可權

a.只讀使用者的許可權

MongoDB Enterprise > db.auth('readonly','123')
1
MongoDB Enterprise > db.mongo.insert({"no":"F2","name":"Lily"})  //寫入資料報錯
WriteResult({
    "writeError" : {
        "code" : 13,
        "errmsg" : "not authorized on test to execute command { insert: \"mongo\", documents: [ { _id: ObjectId('5b17a675637751cda118430b'), no: \"F2\", name: \"Lily\" } ], ordered: true }"
    }
})
MongoDB Enterprise > db.mongodb.find()  //可以檢視資料
{ "_id" : ObjectId("5b17a4be2d7daf7945717c22"), "no" : "F1", "name" : "Jack" }
//從以上可以看出只讀使用者無法寫入資料,但是可以檢視集合的資料

b.讀寫使用者

MongoDB Enterprise > db.auth('readwrite','123123')
1
MongoDB Enterprise > db.mongodb.insert("no":"F2","name":"Lily") //可以寫入資料
2018-06-06T17:18:25.698+0800 E QUERY    [thread1] SyntaxError: missing ) after argument list @(shell):1:22
MongoDB Enterprise > db.mongodb.insert({"no":"F2","name":"Lily"})
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise > db.mongodb.find()  //同時也可以檢視
{ "_id" : ObjectId("5b17a4be2d7daf7945717c22"), "no" : "F1", "name" : "Jack" }
{ "_id" : ObjectId("5b17a6f1637751cda118430c"), "no" : "F2", "name" : "Lily" }
//從上可以看出,讀寫使用者既可以檢視集合的資料也可以寫入資料

四、總結

管理員可以管理所有資料庫,但是不能直接管理其他資料庫,要先在admin資料庫認證後才可以,要注意的是,

MongoDB預設是沒有管理員賬號,所以要先新增管理員賬號,再開啟許可權認證。所以,基於安全性的考慮,訪問許可權的控制還是