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」參數。mongodb

用戶權限:

一,掌握權限,理解下面4條基本上就差很少

1. mongodb是沒有默認管理員帳號,因此要先添加管理員帳號,在開啓權限認證。
2. 切換到admin數據庫,添加的帳號纔是管理員帳號。
3. 用戶只能在用戶所在數據庫登陸,包括管理員帳號。
4. mongo的用戶是以數據庫爲單位來創建的,每一個數據庫有本身的管理員。
5. 管理員能夠管理全部數據庫,可是不能直接管理其餘數據庫,要先在admin數據庫認證後才能夠。
注:賬號是跟着庫走的,因此在指定庫裏受權,必須也在指定庫裏驗證docker

權限說明數據庫

權限說明數組

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.建立 adminui

角色: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 testfor(var i=0;i<100000;i++){db.user.insert({"name":"test"+i,"age":i});}

相關文章
相關標籤/搜索