mongodb學習之:安全和認證

來源:互聯網
上載者:User

標籤:一個使用者   bcs   error:   collect   mongo   Owner   tab   auth   完成   

mongodb預設是不認證的,預設沒有帳號,只要能串連上服務就可以對資料庫進行各種操作,mongodb認為安全最好的方法就是在一個可信的環境中運行它,保證之後可信的機器才能訪問它。因此需要在登入的時候進行使用者認證

建立一個資料庫新使用者用db.createUser()方法,如果使用者存在則返回一個使用者重複錯誤。文法: 
db.createUser(user, writeConcern) 
user這個文檔建立關於使用者的身份認證和訪問資訊; 
writeConcern這個文檔描述保證MongoDB提供寫操作的成功報告。

· user文檔,定義了使用者的以下形式: 
{ user: “”, 
pwd: “”, 
customData: { }, 
roles: [ 
{ role: “”, db: “” } | “”, 
… 

}

user文檔欄位介紹: 
user欄位,為新使用者的名字; 
pwd欄位,使用者的密碼; 
cusomData欄位,為任意內容,例如可以為使用者全名介紹; 
roles欄位,指定使用者的角色,可以用一個空數組給新使用者設定空角色; 
在roles欄位,可以指定內建角色和使用者定義的角色。

角色有如下幾種:

1. 資料庫使用者角色:read、readWrite;

2. 資料庫管理角色:dbAdmin、dbOwner、userAdmin;

3. 叢集管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;

4. 備份恢複角色:backup、restore;

5. 所有資料庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase

6. 超級使用者角色:root  

// 這裡還有幾個角色間接或直接提供了系統超級使用者的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)

7. 內部角色:__system

PS:關於每個角色所擁有的操作許可權可以點擊上面的內建角色連結查看詳

 

在添加使用者的時候以下三點需要注意:

·  1) 一定要切換到對應的資料庫去建立使用者, 否則在進行認證的時候, 會提示找不到使用者

·  2) 一定要到對應的資料庫上去認證使用者, 否則會認證授權失敗

·  3) 不是所有人都能操作admin資料庫, 分配給使用者權限的時候,一定要謹慎

 

添加一個所有許可權的使用者

> db.createUser({"user":"root","pwd":"root","roles":["root"]})

Successfully added user: { "user" : "root", "roles" : [ "root" ] 

添加一個唯讀許可權的使用者

> db.createUser({user:"test",pwd:"test",roles:[{role:"read",db:"admin"}]})

Successfully added user: {

"user" : "test",

"roles" : [

{

"role" : "read",

"db" : "admin"

}

]

}

查看使用者能發現所有的使用者資訊。注意,只有在admin資料庫下才能查看到所有使用者的資訊

> db.system.users.find()

{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "BPOHThbxXgAF9XTuqzHirg==", "storedKey" : "/bTtbcsHQqKeD8OpNcGOgSy1tvk=", "serverKey" : "rmkh2z/FXPBc+UbEX4vMugApwlU=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }

{ "_id" : "admin.test", "user" : "test", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "8t74rwlbNhj56CDX89HuCw==", "storedKey" : "Pbu0g4IA4f9LsXfmeDm0zTXzrY4=", "serverKey" : "YItP35I5Wul1s6E2yAPsLQdVmZE=" } }, "roles" : [ { "role" : "read", "db" : "admin" } ] }

 

添加使用者後通過mongod --auth重新啟動伺服器。

這個時候如果我們不使用使用者名稱和密碼的話,訪問資料庫會出現如下錯誤:提示沒有許可權去執行命令。

> show dbs

2018-01-01T20:50:42.735+0800 E QUERY    [thread1] Error: listDatabases failed:{

"ok" : 0,

"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",

"code" : 13,

"codeName" : "Unauthorized"

} :

 

使用使用者名稱和密碼登入有兩種方式:

第一種方式:用戶端串連時,指定使用者名稱,密碼,db名稱。和mysql類似

[email protected]:/var/lib/mongodb# mongo -u "root" -p "root" --authenticationDatabase "admin"

這個時候查看資料庫就能成功訪問了

> show dbs

admin  0.000GB

local  0.000GB

maple  0.000GB

 

第二種方式:用戶端串連後再進行驗證

> use admin

switched to db admin

> db.auth("test","test")

1

返回1代表驗證成功

但是採用test使用者進行使用者查詢的時候提示如下的錯誤

> db.system.users.find()

Error: error: {

"ok" : 0,

"errmsg" : "not authorized on admin to execute command { find: \"system.users\", filter: {} }",

"code" : 13,

"codeName" : "Unauthorized"

}

原因在於我們之前建立test使用者的時候,給予的許可權只是read。如果給予userAdminAnyDatabase的許可權,則可以訪問和修改所有的使用者資訊

db.updateUser("test",{roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

 

> db.system.users.find()

{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "BPOHThbxXgAF9XTuqzHirg==", "storedKey" : "/bTtbcsHQqKeD8OpNcGOgSy1tvk=", "serverKey" : "rmkh2z/FXPBc+UbEX4vMugApwlU=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }

{ "_id" : "admin.test", "user" : "test", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "8t74rwlbNhj56CDX89HuCw==", "storedKey" : "Pbu0g4IA4f9LsXfmeDm0zTXzrY4=", "serverKey" : "YItP35I5Wul1s6E2yAPsLQdVmZE=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }

 

如果要刪除使用者的話採用dropUser就可以了

> db.dropUser("test")

true

> db.auth("root","root")

1

> db.system.users.find()

{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "BPOHThbxXgAF9XTuqzHirg==", "storedKey" : "/bTtbcsHQqKeD8OpNcGOgSy1tvk=", "serverKey" : "rmkh2z/FXPBc+UbEX4vMugApwlU=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }

 

我們再來看下對於普通資料庫的操作。首先在maple資料庫下建立一個使用者test只有read的許可權

> use maple

switched to db maple

> db.createUser({user:"test",pwd:"test",roles:[{role:"read",db:"maple"}]})

Successfully added user: {

"user" : "test",

"roles" : [

{

"role" : "read",

"db" : "maple"

}

]

}

> db.auth("test","test")

1

建立完成後推出重新登入,並在maple集合中插入文檔。提示失敗,原因是not authorized on maple to execute command.這是由於test使用者的許可權只是read,沒有寫的許可權

> use maple

switched to db maple

> db.auth("test","test")

1

> db.maple.insert({"name":"abc"})

WriteResult({

"writeError" : {

"code" : 13,

"errmsg" : "not authorized on maple to execute command { insert: \"maple\", documents: [ { _id: ObjectId(‘5a4a3bbc7e7e6dd2b17893d9‘), name: \"abc\" } ], ordered: true }"

}

})

更改使用者的許可權為readWrite。則可以成功的插入文檔

> db.updateUser("test",{roles:[{role:"readWrite",db:"maple"}]})

> show collections

fixedcollection

maple

student_infor

> db.maple.insert({"name","123"})

2018-01-01T21:49:57.536+0800 E QUERY    [thread1] SyntaxError: missing : after property id @(shell):1:23

> db.maple.insert({"name":"123"})

WriteResult({ "nInserted" : 1 })

mongodb學習之:安全和認證

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.