MongoDB許可權,mongodb使用權限設定
MongoDB啟動預設是不設定許可權的,這一點和mysql,oracle有本質的區別。
當啟動的時候增加參數 --auth才會啟動許可權,mongoDB最大的特點是面向資料庫的許可權,除了超級管理員,其他使用者的許可權都是與資料庫一一對應的。
問題1:如何增加使用者:
使用db.addUser('name','password')語句建立使用者。
MongoDB使用者也分為普通使用者和超級管理使用者,普通使用者對應的是當前表的許可權,超級管理使用者對應的許可權是整個Mongodb的許可權。普通使用者只能在屬於自己的資料表空間進行操作,不能建立其他資料庫以及查詢其他資料的資料,如果需要建立資料庫只能使用超級管理員登入。
建立使用者方式
a.在不設定許可權的登入模式建立使用者,在admin庫下建立的使用者是超級管理員,在其他庫建立的使用者只有當前庫的許可權,沒有其他庫的許可權。
b.登入的普通使用者可以在當前庫下建立使用者,登入的超級使用者可以在任何庫下建立任何使用者。
問題2:如何登入
使用db.auth('name'password')可以登入當前的資料庫。
mongoDB預設串連登入的資料庫是test,如果登入test庫下的使用者,只能查看Test庫下的資料。如果登入庫User下的使用者,只能查看User下的資料。
當需要查看所有庫的資料,以及使用show dbs這類全域的資料需要使用超級管理員,如何登入超級管理員呢?
超級管理員也有預設的資料庫,這個資料庫是admin,切換資料庫到admin,然後使用db.auth登入超級管理員,登入好之後,就可以進入任意庫CRUD以及使用show dbs操作了。
當你登入了A庫,在登入B庫,這個時候相當於你擁有了A庫和B庫兩個庫的許可權,你可以自由的在這兩個庫下進行CRUD操作,如果你的資料庫有A,B,C這個時候你登入了A,B,C三個資料庫,你就可以在這三個資料庫下自由的操作,有點類似超級管理員的操作。
在admin庫下有一張users表,通過db.system.users.find();尋找所有的使用者,可以看到超級管理員roles是root,其他的使用者role是dbowner表示只有當前資料庫下的許可權。
總結:mongodb的資料許可權是和資料庫綁定的,這個也是可以理解的因為nosql資料庫無法使用join等聯集查詢,一個庫對應自己的使用者,當需要查詢全域的資料時,需要使用超級管理員,超級管理員也有自己的資料庫那個庫就是admin,也就是說在admin庫下建立的使用者都是超級管理員,具體所有庫的CRUD許可權。
mongodb 集合的存取權限
用keyFile。詳見docs.mongodb.org/...curity
怎建立一個含有使用者名稱與密碼的mongodb的資料庫
太小氣了,還是給你簡單說一說吧,下邊是我之前研究mongodb時候做的筆記中的一點部分。
mongoDB預設使用者認證是關閉的。
修改 /etc/mongod.conf 檔案。mongoDB預設情況下任何用戶端都可以串連27017連接埠,且沒有認證,預設情況下沒有系統管理員帳戶。通過修改這個設定檔可以更改為登陸時進行許可權認證。
mongoDB中如果想要給某個資料庫建立一個使用者,需要首先進入該資料庫,然後使用addUser命令。在這裡也可以將使用者佈建為唯讀(db.addUser("jack","jack",true),第三個參數表示是否時“唯讀使用者”)。
要使用超級管理員,需要先串連admin資料庫並登陸系統管理員帳戶,然後串連其他資料庫就可以行使管理員權限。
使用者資訊儲存及認證過程
類似MySQL將系統使用者資訊儲存在mysql.user表。MongoDB也將系統使用者的username、pwd儲存在admin.system.users集合中。其中pwd = md5(username + “:mongo:” + real_password)。這本身並沒有什麼問題。username和:mongo:相當於對原密碼加了一個salt值,即使攻擊者擷取了資料庫中儲存的md5 hash,也沒法簡單的從彩虹表中查出原始密碼。
許可權管理常用命令
1. #進入資料庫admin
use admin
2. #增加或修改使用者密碼
db.addUser('name','pwd')
3. #查看使用者列表
db.system.users.find()
4. #使用者認證
db.auth('name','pwd')
這一個返回1就認證成功了,只有認證成功才能對資料庫進行操作
5. #刪除使用者
db.removeUser('name')
6. #查看所有使用者
show users
7. #查看所有資料庫
show dbs
8. #查看所有的collection
show collections
9. #查看各collection的狀態
db.printCollectionStats()
10. #查看主從複製狀態
db.printReplicationInfo()