Mongodb 開啟用戶名密碼訪問控制


一、Mongodb命令

理解 admin 數據庫

安裝 MongoDB 時,會自動創建 admin 數據庫,這是一個特殊數據庫,提供了普通數據庫沒有的功能。

有些用戶角色賦予用戶操作多個數據庫的權限,而這些角色只能在 admin 數據庫中創建,要創建有權操作所有數據庫的超級用戶,必須將該用戶加入到 admin 數據庫中。檢查憑證時,MongoDB 將在指定數據庫和 admin 數據庫中檢查用戶賬戶。

內建的角色

數據庫用戶角色:read、readWrite;
數據庫管理角色:dbAdmin、dbOwner、userAdmin;
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
備份恢復角色:backup、restore;
所有數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超級用戶角色:root #這里還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)

內部角色:__system

角色說明:

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

主要命令

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() #查看數據庫服務器的狀態

二、配置訪問控制

1、介紹

MongoDB安裝完成后,數據庫 admin 中沒有任何用戶賬戶。在數據庫 admin 中沒有任何賬戶時,MongoDB 向從本地主機發起的連接提供全面的數據庫管理權限。因此配置 MongoDB 新實例時,首先需要創建用戶管理員賬戶數據庫管理員賬戶。用戶管理員賬戶可在 admin 和其他數據庫中創建用戶賬戶。您還需要創建一個數據庫管理員賬戶,將其作為管理數據庫、集群、復制和 MongoDB 其他方面的超級用戶。

用戶管理員賬戶和數據庫管理員賬戶都是在數據庫 admn 中創建的。在 MongoDB 服務器中啟用身份驗證后,要以用戶管理員或數據庫管理員的身份連接到服務器,必須向 admin 數據庫驗證身份,您還需在每個數據庫中創建用戶賬戶,讓這些用戶能夠訪問該數據庫。

2、創建用戶管理員賬戶

  • 配置訪問控制的第一步是創建用戶管理員賬戶。用戶管理員應只有創建用戶賬戶的權限,而不能管理數據庫或執行其他管理任務。這確保數據庫管理和用戶賬戶管理之間有清晰的界限。

  • 在 admin 數據庫中,添加一個用戶並賦予userAdminAnyDatabase角色,userAdminAnyDatabase只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限。

例如,下面是在 admin 數據庫中創建一個名為myUserAdmin用戶。

[root@mbasic ~]# mongo MongoDB shell version: 3.2.6 connecting to: test > use admin switched to db admin > db.createUser( ... { ... user: "myUserAdmin", ... pwd: "abc123", ... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] ... } ... ) Successfully added user: { "user" : "myUserAdmin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } > 

用戶管理員應只有創建用戶賬戶的權限,而不能管理數據庫或執行其他管理任務。
要創建某個庫的管理用戶,必須在 admin 進行認證,給哪個庫創建用戶就先切換到哪個庫下面。

4、開啟權限驗證

  • 編輯配置文件/etc/mongod.conf,修改內容如下:

    security: authorization: enabled
  • 重啟mongodb服務

    systemctl restart mongod
  • 現在,客戶端連接到服務器時必須提供用戶名和密碼。另外,從 MongoDB shell 訪問 MongoDB 服務器時,如果要添加用戶賬戶,必須執行下面的命令向數據庫 admin 驗證身份:
    > use admin switched to db admin > db.auth("myUserAdmin","abc123") 1 >

    也可以在啟動 MongoDB shell 時使用選項-u-p向數據庫 admin 驗證身份:

    mongo -u "myUserAdmin" -p "abc123" --authenticationDatabase admin

5、創建數據庫管理員賬戶

要創建數據庫管理員,可在 MongoDB shell 中切換到數據庫 admin,再使用方法createUser添加角色為readWriteAnyDatabasedbAdminAnyDatabaseclusterAdmin的用戶。這讓這名用戶能夠訪問系統中的所有數據庫、創建新的數據庫以及管理 MongoDB 集群和副本集。

  • 創建一個名為 dbadmin 的數據庫管理員:
    > use admin
    switched to db admin
    > db.createUser(
    ... { ... user: "dbadmin", ... pwd: "abc123", ... roles: [ "readWriteAnyDatabase", "dbAdminAnyDatabase","clusterAdmin" ] ... } ... ) Successfully added user: { "user" : "dbadmin", "roles" : [ "readWriteAnyDatabase", "dbAdminAnyDatabase", "clusterAdmin" ] }

數據庫管理員能夠訪問系統中的所有數據庫、創建新的數據庫以及管理 MongoDB 集群和副本集。
如果要求管理其他數據庫,首先要去 admin 庫里面去認證。

四、創建普通用戶

一旦經過認證的用戶管理員,可以使用db.createUser()去創建額外的用戶。
你可以分配mongodb內置的角色或用戶自定義的角色給用戶。

這個 myUserAdmin 用戶僅僅只有特權去管理用戶和角色,如果你試圖執行其他任何操作,例如在 test 數據庫中的foo集合中去讀數據,mongodb將返回錯誤。

你創建用戶的數據庫(這里就是test數據庫)是該用戶認證數據庫。盡管用戶認證是這個數據庫,用戶依然可以有其他數據庫的角色。即用戶認證數據庫不限制用戶權限。

  • 創建一個角色為readWrite的用戶 test1 來管理數據庫test
[root@mbasic ~]# mongo MongoDB shell version: 3.2.6 connecting to: test > use admin switched to db admin > db.auth('myUserAdmin','abc123') 1 > use test switched to db test > db.createUser( ... { ... user:"test1", ... pwd: "test1", ... roles: [{ role: "readWrite", db: "test"}] ... } ... ) Successfully added user: { "user" : "test1", "roles" : [ { "role" : "readWrite", "db" : "test" } ] } >

驗證

[root@mbasic ~]# mongo
MongoDB shell version: 3.2.6
connecting to: test
> use test switched to db test > db.auth('test1','test1') 1 >
  • 創建一個dmp用戶,對dmp數據庫只讀權限。
    > use admin switched to db admin > db.auth('myUserAdmin','abc123') 1 > use dmp switched to db dmp >db.createUser( { user:"dmp1", pwd: "dmp1pass", roles: [{ role: "read", db: "dmp"}] } )

五、Mongodb 使用

1、導入 csv 數據

我們創建了一個數據庫 dmp,並且創建一個有讀寫權限的用戶 dmp,密碼dmp,我們導入一個從其他數據庫導出來的 csv 格式的數據。

[root@mbasic ~]# mongoimport -udmp -p dmp --db dmp --collection dmp_merge_basic --type csv --headerline --ignoreBlanks --file dmp.csv 2018-09-20T15:23:38.024+0800 connected to: localhost 2018-09-20T15:23:39.441+0800 imported 15347 documents

 

默認啟動 MongoDB 服務時沒有任何參數,可以對數據庫任意操 作,而且可以遠程訪問數據庫,所以推薦開發階段可以不設置任何參數,但對於生產環境還是要仔細考慮一下安全方面的因素,下面就介紹了Mongodb開啟用戶訪問控制的相關資料。

 

============================================================分割線==============================================================================

前言

Mongodb 數據庫默認情況下是沒有訪問控制的,整個數據庫對外是開發的,只要能連上數據庫,則可以進行任何操作,這會對數據帶來很大的風險。當然,我們可以啟用mongodb的訪問控制,只讓通過認證的用戶才能對數據庫進行角色范圍內的操作。

啟用訪問控制可以通過在啟動 mongodb 時指定 --auth 參數來設置,另外還涉及到創建用戶 db.createUser 操作以及一些角色的定義,我們先來看這部分內容。

db.createUser() 用法

db.createUser({
 user: "$USERNAME",
 pwd: "$PASSWROD",
 roles: [
 { role: "$ROLE_NAME", db: "$DBNAME"}
 ]
})

參數說明:

  • user 是用戶名
  • pwd 是密碼
  • role 來指定用戶的角色
  • db 來指定所屬的數據庫
  • roles 是用戶所有角色的集合

Mongodb 預定義角色

Mongodb 中預定義了一些角色,把這些角色賦予給適當的用戶上,用戶就只能進行角色范圍內的操作。

1、數據庫用戶角色 (所有數據庫都有)

  • read 用戶可以讀取當前數據庫的數據
  • readWrite 用戶可以讀寫當前數據庫的數據

2、數據庫管理角色(所有數據庫都有)

  1. dbAdmin 管理員用戶但不能對用戶和角色管理授權
  2. dbOwner 數據庫所有者可進行任何管理任務
  3. userAdmin 可以管理當前數據的用戶和角色

3、集群管理角色(admin數據庫可用)

  1. clusterAdmin 集群所有管理權限,是 clusterManager , clusterMonitor, hostManager 合集
  2. clusterManager 集群管理和監控
  3. clusterMonitor 集群監控,只讀的
  4. hostManager 監控和管理服務器

4、備份和恢復角色(admin數據庫可用)

  1. backup
  2. restore

5、所有數據庫角色(admin數據庫可用)

  1. readAnyDatabase 讀取所有數據庫
  2. readWriteAnyDatabase 讀寫所有數據庫
  3. userAdminAnyDatabase 所有數據庫的 userAdmin 權限
  4. dbAdminAnyDatabase 所有數據庫的 dbAdmin 權限

6、超級角色(admin數據庫可用)

  1. root 超級用戶

7、內部角色

  • __system 所有操作權限

更多預定於角色的信息請參看:https://docs.mongodb.com/manual/core/security-built-in-roles/

啟用訪問控制的步驟

1, 啟動 mongodb 實例,關閉 訪問控制

不帶 --auth

./mongod -f /usr/supplywater/dataBase/mongodb/master.conf

2, 連接上 mongodb 實例

./mongo --port 27017

3,創建用戶管理員

在 admin 數據庫中添加一個 具有 userAdminAnyDatabase 角色的用戶作為用戶管理用戶。下面的例子中創建了 admin 為用戶管理員。

> use admin
switched to db admin
> db.createUser({
... user: "admin",
... pwd: "admin",
... roles: [
... { role: "userAdminAnyDatabase", db: "admin"}
... ]
... })
Successfully added user: {
 "user" : "admin",
 "roles" : [
  {
   "role" : "userAdminAnyDatabase",
   "db" : "admin"
  }
 ]
}
>

退出連接

4,重啟數據庫啟用訪問控制

命令行啟動,只需要添加 --auth 參數

./mongo --auth --port 27017

5,使用管理用戶連接,有兩種方法

1,使用命令行 ./mongo -u "$USERNAME" -p "$PASSWROD" --authenticationDatabase "admin"
2,使用 db.auth()

我們使用第二種

> 
> use admin
switched to db admin
> db.auth("admin", "admin")
1
>

1 表示認證成功

6, 為某個數據庫創建獨立用戶

以下為 test 數據庫 創建具有讀寫權限的用戶 test

admin 用戶由於只有 userAdminAnyDatabase 權限,所以沒有 test 數據的讀寫權限,所以,為了讀寫 test 數據庫,我們需要創建一個用戶。先看一下直接用 admin 會報什么錯誤

> use test
> show collections
2017-01-13T13:49:17.691+0800 E QUERY [thread1] Error: listCollections failed: {
"ok" : 0,
"errmsg" : "not authorized on test to execute command { listCollections: 1.0, filter: {} }",
"code" : 13
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:773:1
DB.prototype.getCollectionInfos@src/mongo/shell/db.js:785:19
DB.prototype.getCollectionNames@src/mongo/shell/db.js:796:16
shellHelper.show@src/mongo/shell/utils.js:754:9
shellHelper@src/mongo/shell/utils.js:651:15
@(shellhelp2):1:1

我們直接使用 show collections , 則報錯:not authorized on test to execute command ,意思是沒有權限。

> use test
switched to db test
> db.createUser({
... user: "test",
... pwd: "test",
... roles: [
... { role: "readWrite", db: "test"}
... ]
... })
Successfully added user: {
 "user" : "test",
 "roles" : [
  {
   "role" : "readWrite",
   "db" : "test"
  }
 ]
}
>

然后我們使用 db.auth(“test”, “test”) , 再執行命令 則沒有報錯

> db.auth("test", "test")
1
> 
> show collections

試着寫入一條數據,也是正常的。

> db.t.insert({name:"buzheng"});
WriteResult({ "nInserted" : 1 })
> db.t.find();
{ "_id" : ObjectId("58786c84bf5dd606ddfe1144"), "name" : "buzheng" }

查看所有用戶: db.system.users.find().pretty()


免責聲明!

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



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