標籤:
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安全認證