Mongodb安全認證

來源:互聯網
上載者:User

標籤:

Mongodb安全認證在單一實例和複本集兩種情況下不太一樣,單一實例相對簡單,只要在啟動時加上 --auth參數即可,但複本集則需要keyfile。

 

一、單一實例

1.啟動服務(先不要加auth參數)

2.登陸後切換到admin庫並添加管理員帳號

  2.1  建立系統管理員使用者

預設條件下,超級管理員只能用於帳號管理,不能進行其他資料庫操作,可以通過自己給自己授權實現。生產環境中的管理員,如果某個帳號包含了角色userAdminAnyDatabase或者userAdmin,就應該僅僅用於帳號和角色管理,不應該再授予別的角色了。

(1)我們首先就要建立一個超級管理員,然後再用超級管理員建立其他帳號:

   use admin

   db.addUser( { user: "superman", pwd: "talent", roles: [ "userAdminAnyDatabase" ] } )

(2)為帳號啟用admin資料庫認證,這樣他就可以操作admin資料庫了。
   db.auth("root", "123456")  //為帳號授權
   db.system.users.find(); //查看當前已有的使用者資訊

 

(3)使用用剛才的超級帳號登入資料庫(admin)mongo localhost:27017admin -u superman -p superman

現在,我們就可以為其他資料庫添加使用者了:

比如test庫

use test

db.addUser("text","text")

授予這個使用者的許可權:(必須要,否則無法進行讀寫操作)

db.auth("text","text")

(4)現在可以用新使用者登入並且操作test資料庫了

 

3.關閉本地例外登入方式

一旦擁有了超級管理員,就可以考慮關閉本地例外方式登入了

方法如下:

重啟資料庫,啟動時候加上--setParameter enableLocalhostAuthBypass=0即可,這樣登入的話就必須要用賬戶認證了

4.刪除使用者

刪除使用者要針對某個資料庫進行刪除

> use test

switched to db test

> db.removeUser("superman11111")

5.修改使用者密碼

普通使用者只能修改自己的密碼,userAdmin角色帳號可以修改其他使用者密碼

例如:

mongo 192.168.69.54:40000/admin -u superman -p superman

use test

db.changeUserPassword("test","111")

二、複本集認證

複本集總體思路是使用者名稱、密碼和keyfile檔案,keyfile需要各個複本集服務啟動時載入而且要是同一檔案,然後在操作庫是需要使用者名稱、密碼

KeyFile檔案必須滿足條件:

(1)至少6個字元,小於1024位元組

(2)認證時候不考慮檔案中空白字元

(3)串連到複本集的成員和mongos進成的keyfile檔案內容必須一樣

(4)必須是base64編碼,但是不能有等號

(5)檔案許可權必須是x00,也就是說,不能分配任何許可權給group成員和other成員

註:win下可以通過記事本檔案,輸入任意內容,刪除尾碼名後使用,是否可行還在實驗

 

以複本集sh0為例:(以下為linux系統操作,win系統出了建立keyfile檔案不一樣 其他相同)

1.產生keyFile檔案:

在54上執行:

[[email protected] ~]# openssl rand -base64 100 > /mongodb/scheme2/keyfile0 --檔案內容采base64編碼,一共100個字元

2.修改檔案許可權:

[[email protected] ~]# chmod 600 /mongodb/scheme2/keyfile0

把產生的檔案拷貝到複本集剩餘各台機器上,存放的目錄可以不一樣,注意許可權。

3.三台機器啟動時指定--keyFile選項

numactl --interleave=all  mongod  --replSet sh0 --port 10000 \

--dbpath=/mongodb/scheme2/sh0/data --logpath=/mongodb/scheme2/sh0/logs/sh0.log \

--logappend --fork --directoryperdb --bind_ip=127.0.0.1,192.168.69.54 --nohttpinterface \

--keyFile=/mongodb/scheme2/keyfile0

這樣,沒有這個檔案的機器就無法加入複本集,Sh1和sh2複本集的操作類似。

開啟了keyFile,隱含就開啟了auth,這個時候串連複本集就需要進行認證了,否則只能通過本地例外方式操作資料庫。

在複本集中添加使用者需要在服務未加--keyFile參數啟動的情況加按照單一實例方法添加(訪問任意一個副本器操作,其他複本集會自動同步),賬戶添加、授權成功後重新加入keyFile啟動服務,即可完成並使用。

 

三 複本集+分區環境下的認證

 

結合上面的兩種環境的認證方式,可以實現複本集+分區環境中安全認證,需要注意以下幾點

 

1.在分區叢集環境中,複本集內成員之間需要用keyFile認證,mongos與設定管理員,複本集之間也要keyFile認證,叢集所有mongod和mongos執行個體使用內容相同的keyFile檔案。

2.進行初始化,修改複本集時,都從本地例外登入進行操作

3.由於啟用了認證,需要建立一個管理員帳號,才能從遠程登入。建立系統管理員帳戶,利用管理員賬戶從遠程登入後,需要建立一個可以操作某個資料庫的使用者,用戶端就用這個使用者訪問資料庫。

4.分區叢集中的管理員帳號需要具備設定管理員中admin和config資料庫的讀寫權限,才能進行分區相關操作

5.叢集中每個分區有自己的admin資料庫,儲存了叢集的各自的認證和存取權限。如果需要單獨遠程登入分區,可以按照3.2的辦法建立使用者

相關操作如下:

1.啟動叢集中的設定管理員,路由進程和複本集,每個進程都要指定KeyFile檔案,而且每個進程的keyfile內容相同,詳細操作見3.2。

2.初始化複本集。

3. 串連mongos,為叢集建立管理員帳號和普通帳號,步驟如下;

(1)建立管理員帳號

管理員需要具備對叢集中設定管理員的讀寫權限,這些許可權包括:

建立新的普通管理員,用於用戶端串連叢集中的資料庫;

分區相關許可權,例如查看分區狀態,啟用分區,設定片鍵等操縱。

首先用本地例外方式登入,建立管理員帳號:

[[email protected] ~]# mongo --port 30000

mongos> use admin

db.addUser( { user: "superman",

 pwd: "superman",

 roles: [ "clusterAdmin","userAdminAnyDatabase","dbAdminAnyDatabase","readWriteAnyDatabase" ] } )


 

mongos> db.auth("superman","superman")


 

mongos> use config

switched to db config

mongos> db.addUser( { user: "superman",

  pwd: "superman",

  roles: [ "clusterAdmin","userAdminAnyDatabase","dbAdminAnyDatabase","readWriteAnyDatabase" ] } )

mongos> db.auth("superman","superman")


(2)用上面建立的管理員帳號登入mongos進程,對資料庫(比如test)啟用分區,設定集合片鍵。

 

(3)用管理員賬戶登入,建立新賬戶,讓他可以讀寫資料庫test

[[email protected] ~]# mongo localhost:30000/admin -u superman -p superman

mongos> use test

switched to db test

mongos> db.addUser("test","test")

{

        "user" : "test",

        "readOnly" : false,

        "pwd" : "a6de521abefc2fed4f5876855a3484f5",

        "_id" : ObjectId("51fb5d4ecaa5917203f37f63")

}

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

1

(4)用新帳號test登入,操作資料庫test

[[email protected] ~]# mongo localhost:30000/test -u test -p test            

MongoDB shell version: 2.4.4

connecting to: localhost:30000/test

> for( var i = 1; i < 100000; i++ ) db.test.insert( { x:i, C_ID:i } );

說明:為分區叢集啟用認證後,本地例外方式登入由於只具備admin資料庫讀寫權限,無法進行分區操作。對本例來講,添加分區,查看分區狀態等操作都需要用superman帳號登入才行。執行資料庫test操作用test帳號,這個帳號就是提供給用戶端的帳號。

 

四 java操作中使用者驗證登陸

對於認證啟動的服務,在java中操作在原有基礎上增加一部db驗證即可

DB db = mongo.getDB("dbname");

boolean auth = db.authenticate("name","password".toCharArray());

驗證成功則返回true 否則返回false

註:db驗證只能一次,如果成功後就不能繼續驗證,否則會報重複驗證異常

然就就可按需求進行相關操作

 

部分參考 http://www.91linux.com/html/article/database/MongoDB/2013/0923/22679.html

相關參考 http://www.linuxidc.com/Linux/2012-06/63588.htm

http://www.dotblogs.com.tw/newmonkey48/archive/2012/12/05/85431.aspx

http://www.cnblogs.com/-clq/archive/2012/03/02/2376972.html

http://blog.csdn.net/lzy_1515/article/details/7027474

http://www.blogjava.net/anchor110/articles/385978.html

 

http://www.oschina.net/code/snippet_35115_2888

http://blog.sina.com.cn/s/blog_8413c1e201019l4e.html

http://www.linuxidc.com/Linux/2013-07/86926.htm

http://www.cnblogs.com/zcy_soft/archive/2011/04/09/2010578.html

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.