一、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
添加角色為readWriteAnyDatabase
、dbAdminAnyDatabase
和clusterAdmin
的用戶。這讓這名用戶能夠訪問系統中的所有數據庫、創建新的數據庫以及管理 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、數據庫管理角色(所有數據庫都有)
- dbAdmin 管理員用戶但不能對用戶和角色管理授權
- dbOwner 數據庫所有者可進行任何管理任務
- userAdmin 可以管理當前數據的用戶和角色
3、集群管理角色(admin數據庫可用)
- clusterAdmin 集群所有管理權限,是 clusterManager , clusterMonitor, hostManager 合集
- clusterManager 集群管理和監控
- clusterMonitor 集群監控,只讀的
- hostManager 監控和管理服務器
4、備份和恢復角色(admin數據庫可用)
- backup
- restore
5、所有數據庫角色(admin數據庫可用)
- readAnyDatabase 讀取所有數據庫
- readWriteAnyDatabase 讀寫所有數據庫
- userAdminAnyDatabase 所有數據庫的 userAdmin 權限
- dbAdminAnyDatabase 所有數據庫的 dbAdmin 權限
6、超級角色(admin數據庫可用)
- root 超級用戶
7、內部角色
- __system 所有操作權限
更多預定於角色的信息請參看:https://docs.mongodb.com/manual/core/security-built-in-roles/
啟用訪問控制的步驟
1, 啟動 mongodb 實例,關閉 訪問控制
不帶 --auth
2, 連接上 mongodb 實例
3,創建用戶管理員
在 admin 數據庫中添加一個 具有 userAdminAnyDatabase 角色的用戶作為用戶管理用戶。下面的例子中創建了 admin 為用戶管理員。
退出連接
4,重啟數據庫啟用訪問控制
命令行啟動,只需要添加 --auth 參數
5,使用管理用戶連接,有兩種方法
1,使用命令行 ./mongo -u "$USERNAME" -p "$PASSWROD" --authenticationDatabase "admin" 2,使用 db.auth()
我們使用第二種
1 表示認證成功
6, 為某個數據庫創建獨立用戶
以下為 test 數據庫 創建具有讀寫權限的用戶 test
admin 用戶由於只有 userAdminAnyDatabase 權限,所以沒有 test 數據的讀寫權限,所以,為了讀寫 test 數據庫,我們需要創建一個用戶。先看一下直接用 admin 會報什么錯誤
我們直接使用 show collections , 則報錯:not authorized on test to execute command ,意思是沒有權限。
然后我們使用 db.auth(“test”, “test”)
, 再執行命令 則沒有報錯
試着寫入一條數據,也是正常的。