1. 程式人生 > >mongodb 使用者許可權控制

mongodb 使用者許可權控制

mongo身份驗證和許可權管理

身份認證:

MongoDB安裝完成後,預設是沒有許可權驗證的,預設是不需要輸入使用者名稱密碼即可登入的,但是往往資料庫方面我們會出於安全性的考慮而設定使用者名稱密碼。
即任何客戶端都可以使用mongo IP:27017/admin命令登入mongo服務
啟用訪問控制前,請確保在 admin 資料庫中擁有 userAdmin 或 userAdminAnyDatabase 角色的使用者。
該使用者可以管理使用者和角色,例如:建立使用者,授予或撤銷使用者角色,以及建立或修改定義角色。
啟用驗證的方式:
1. /etc/mongodb.conf //將auth=true前面的註釋拿掉,然後重啟服務生效。
2.線上生產環境使用的是docker:
a. 需要在config和shard服務的啟動命令中加上“--auth”引數。
b. 需要在宿主機生成一個keyfile檔案:openssl rand -base64 755 > mongo.key,
分別放在mongos、config和shard目錄中,並修改目錄許可權:chown -R 999:999 mongos 和keyfile許可權:chmod 600 mongos/mongo.key
c. 在config和shard和mongos服務啟動命令中新增“--keyFile /data/db/mongo.key”引數。

使用者許可權:

一,掌握許可權,理解下面4條基本上就差不多

1. mongodb是沒有預設管理員賬號,所以要先新增管理員賬號,在開啟許可權認證。
2. 切換到admin資料庫,新增的賬號才是管理員賬號。
3. 使用者只能在使用者所在資料庫登入,包括管理員賬號。
4. mongo的使用者是以資料庫為單位來建立的,每個資料庫有自己的管理員。
5. 管理員可以管理所有資料庫,但是不能直接管理其他資料庫,要先在admin資料庫認證後才可以。
注:帳號是跟著庫走的,所以在指定庫裡授權,必須也在指定庫裡驗證

許可權說明

許可權說明

Icon Built-In 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)

許可權具體說明

具體說明

Icon Read:允許使用者讀取指定資料庫
readWrite:允許使用者讀寫指定資料庫
dbAdmin:允許使用者在指定資料庫中執行管理函式,如索引建立、刪除,檢視統計或訪問system.profile
userAdmin:允許使用者向system.users集合寫入,可以找指定資料庫裡建立、刪除和管理使用者
clusterAdmin:只在admin資料庫中可用,賦予使用者所有分片和複製集相關函式的管理許可權。
readAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的讀許可權
readWriteAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的讀寫許可權
userAdminAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的userAdmin許可權
dbAdminAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的dbAdmin許可權。
root:只在admin資料庫中可用。超級賬號,超級許可權

自定義許可權

 

Icon

mongo的許可權除了系統預設的幾個值,還可以自定義相應的許可權給一個Role

db.createRole({ role: “testRole”, privileges: [{ resource: { db: “”, collection: “” }, actions: [“enableSharding” ] }], roles: [“readWriteAnyDatabase”] })

db.createUser( { user: “testuser”, pwd: “123456”, roles: [ { role: “testRole”, db: “admin” } ] } )

 

分片叢集

Icon

群集使用者和分片使用者是獨立的。
通常,要為分片群集建立使用者,請連線到 mongos並新增分片群集使用者。
但是,某些維護操作需要直接連線到分片群集中的特定分片。要執行這些操作,必須直接連線到分片並作為分片本地管理使用者進行身份驗證。
分片本地使用者僅存在於特定分片中,並且只應用於特定於分片的維護和配置。您無法連線到mongos分享本地使用者。

 

建立分片使用者命令

db.getSiblingDB("admin").createUser(
{
"user" : "testadmin",
"pwd" : "12345678",
roles: [ { "role" : "clusterAdmin", "db" : "admin" },{ role: "userAdminAnyDatabase", db: "admin" } ]
}
)


增加使用者:

1.建立 admin

角色:userAdminAnyDatabase (這是一個賬號管理員的角色)
admin使用者用於管理賬號,不能進行關閉資料庫等操作,目標資料庫是admin

admin

Icon > use admin
> db.createUser({user: "admin",pwd: "123456",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
另一種格式:
> db.createUser(
{
user: "dba",
pwd: "dba",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)


user:使用者名稱
pwd:密碼
roles:指定使用者的角色,可以用一個空陣列給新使用者設定空角色;在roles欄位,可以指定內建角色和使用者定義的角色。

2.建立root
建立完admin管理員,建立一個超級管理員 root 角色:root
root角色用於 關閉資料庫 db.shutdownServer()

root

Icon > use admin
> db.createUser({user: "root",pwd: "123456",roles: [ { role: "root", db: "admin" } ]})


3.建立使用者自己的資料庫的角色
當賬號管理員和超級管理員,可以為自己的資料庫建立使用者了
(坑)這時候一定,一定要切換到所在資料庫上去建立使用者,不然建立的使用者還是屬於admin。

putong

Icon > use position
> db.createUser({user: "position",pwd: "123456",roles: [ { role: "dbOwner", db: "position" } ]})

檢視使用者:

檢視全域性所有賬戶 :

Icon > use admin
switched to db admin
> db.auth('admin','123456') //驗證使用者,相當於登入
1
> db.system.users.find().pretty() 或者使用 > db.system.users.find()

檢視當前庫下的賬戶 :

Icon > use admins
switched to db admin
> show users

刪除使用者:

根據id刪除使用者:

Icon > db.system.users.remove({_id:"XXX.XXX"})


根據使用者名稱刪除使用者:

Icon > db.system.users.remove({user:"XXXXXX"})

修改使用者:

注:對於分片叢集,使用者的更改將在命令執行的 mongos 上即時生效。但是,對於群集中的其他mongos 例項,使用者快取可能會等待10分鐘才能重新整理。
1. 撤銷角色使用db.revokeRolesFromUser()方法撤銷角色。以下示例操作從account資料庫上刪除使用者reportsUser 的 readWrite 角色:use reporting

Icon db.revokeRolesFromUser(
"reportsUser",
[
{ role: "readWrite", db: "accounts" }
]
)


2. 授予角色使用db.grantRolesToUser()方法授予角色。 例如,以下操作授予reportsUser使用者account資料庫上的讀取角色:use reporting

Icon db.grantRolesToUser(
"reportsUser",
[
{ role: "read", db: "accounts" }
]
)

3. 更改密碼:
將使用者的使用者名稱和新密碼傳遞給db.changeUserPassword()方法。
以下操作將reporting使用者的密碼更改為:SOh3TbYhxuLiW8ypJPxmt1oOfL

Icon > db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")


=============================================================================================
登陸命令
mongo -u dba -p dba --authenticationDatabase "admin"
mongo -host 192.168.3.17 --port 27017 -u dba -p dba --authenticationDatabase "admin"
mongo 192.168.3.17:27017/admin
db.auth("dba","dba") //此為在庫內驗證登入命令

MongoDB常用命令
> show dbs #顯示資料庫列表 
> show collections #顯示當前資料庫中的集合(類似關係資料庫中的表)
> show users #顯示使用者
> use <db name> #切換當前資料庫,如果資料庫不存在則建立資料庫。 
> db.help() #顯示資料庫操作命令,裡面有很多的命令 
> db.foo.help() #顯示集合操作命令,同樣有很多的命令,foo指的是當前資料庫下,一個叫foo的集合,並非真正意義上的命令 
> db.foo.find() #對於當前資料庫中的foo集合進行資料查詢(由於沒有條件,會列出所有資料) 
> db.foo.find( { a : 1 } ) #對於當前資料庫中的foo集合進行查詢,條件是資料中有一個屬性叫a,且a的值為1

MongoDB沒有建立資料庫的命令,但有類似的命令。 如:如果你想建立一個“myTest”的資料庫,先執行use 
myTest命令,之後就做一些操作(如:db.createCollection(‘user’)),這樣就可以建立一個名叫“myTest”的資料庫。

其他命令
> db.dropDatabase() #刪除當前使用資料庫
> db.cloneDatabase("127.0.0.1") #將指定機器上的資料庫的資料克隆到當前資料庫
> db.copyDatabase("mydb", "temp", "127.0.0.1") #將本機的mydb的資料複製到temp資料庫中
> db.repairDatabase() #修復當前資料庫
> db.getName() #檢視當前使用的資料庫,也可以直接用db
> db.stats() #顯示當前db狀態
> db.version() #當前db版本
> db.getMongo() #檢視當前db的連結機器地址
> db.serverStatus() #檢視資料庫伺服器的狀態

檢視分片結果:
db.printShardingStatus()

測試:向test資料庫的user表中新增10w條資料:
use test
for(var i=0;i<100000;i++){
db.user.insert({"name":"test"+i,"age":i});
}