Mongodb 用戶權限控制


身份認證:

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數據庫認證后才可以。
注:帳號是跟着庫走的,所以在指定庫里授權,必須也在指定庫里驗證

權限說明

權限說明

復制代碼
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)
復制代碼

權限具體說明

具體說明

復制代碼
Read:允許用戶讀取指定數據庫
readWrite:允許用戶讀寫指定數據庫
dbAdmin:允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile
userAdmin:允許用戶向system.users集合寫入,可以找指定數據庫里創建、刪除和管理用戶
clusterAdmin:只在admin數據庫中可用,賦予用戶所有分片和復制集相關函數的管理權限。
readAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀權限
readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限
userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限
dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限。
root:只在admin數據庫中可用。超級賬號,超級權限
復制代碼

自定義權限

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” } ] } ) 

分片集群

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

復制代碼
創建分片用戶命令

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

增加用戶:

1.創建 admin

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

復制代碼
> 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()

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

3.創建用戶自己的數據庫的角色

當賬號管理員和超級管理員,可以為自己的數據庫創建用戶了
(坑)這時候一定,一定要切換到所在數據庫上去創建用戶,不然創建的用戶還是屬於admin。

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

查看用戶:

查看全局所有賬戶 :

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

查看當前庫下的賬戶 :

> use admins
switched to db admin
> show users

刪除用戶:

根據id刪除用戶:

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

根據用戶名刪除用戶:

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

修改用戶:

注:對於分片集群,用戶的更改將在命令運行的 mongos 上即時生效。但是,對於群集中的其他mongos 實例,用戶緩存可能會等待10分鍾才能刷新。
1. 撤銷角色使用db.revokeRolesFromUser()方法撤銷角色。以下示例操作從account數據庫上刪除用戶reportsUser 的 readWrite 角色:use reporting

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

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

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

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

> 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});
}

 轉載自:

https://www.cnblogs.com/pl-boke/p/10063351.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM