1. 程式人生 > >MongoDB 用戶名密碼登錄

MongoDB 用戶名密碼登錄

當前 ada 我們 密碼登錄 nsh ofo nbsp you bash

Mongodb enable authentication

MongoDB 默認直接連接,無須身份驗證,如果當前機器可以公網訪問,且不註意Mongodb 端口(默認 27017)的開放狀態,那麽Mongodb就會產生安全風險,被利用此配置漏洞,入侵數據庫。

容易遭受入侵的環境

  • 使用默認 mongod 命令啟動 Mongodb
  • 機器可以被公網訪問
  • 在公網上開放了 Mongodb 端口

安全風險

  • 數據庫隱私泄露
  • 數據庫被清空
  • 數據庫運行緩慢

解決方案

1. 禁止公網訪問 Mongodb 端口

1.1 網絡配置

由於網絡配置因人而異,需要根據自己實際環境進行配置,不作冗述。大致可以從以下方面禁止。

  • 在路由器中關閉端口轉發
  • 防火墻 iptables 禁止訪問

1.2 驗證端口能否訪問方式

在外網機器命令行中運行

telnet your.machine.open.ip 27017

2. 啟用驗證

2.1 創建用戶管理員賬戶

當前數據庫版本:Mongodb 3.4

使用 mongod 啟動數據庫
新建終端

mongod --port 27017 --dbpath /data/db1

參數默認可以不加,若有自定義參數,才要加上,下同。

另起一個終端,運行下列命令

mongo --port 27017

use admin

db.createUser(
  {
    user: "adminUser",
    pwd: "adminPass",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

管理員創建成功,現在擁有了用戶管理員
用戶名:adminUser
密碼:adminPass
然後,斷開 mongodb 連接, 關閉數據庫
兩個終端下 <C - c>

2.2 Mongodb 用戶驗證登陸

啟動帶訪問控制的 Mongodb
新建終端

mongod --auth --port 27017 --dbpath /data/db1

現在有兩種方式進行用戶身份的驗證
第一種 (類似 MySql)
客戶端連接時,指定用戶名,密碼,db名稱

mongo --port 27017 -u "adminUser" -p "adminPass" --authenticationDatabase "admin"

第二種
客戶端連接後,再進行驗證

mongo --port 27017

use admin
db.auth("adminUser", "adminPass")

// 輸出 1 表示驗證成功

2.3 創建普通用戶

過程類似創建管理員賬戶,只是 role 有所不同

use foo

db.createUser(
  {
    user: "simpleUser",
    pwd: "simplePass",
    roles: [ { role: "readWrite", db: "foo" },
             { role: "read", db: "bar" } ]
  }
)

現在我們有了一個普通用戶
用戶名:simpleUser
密碼:simplePass
權限:讀寫數據庫 foo, 只讀數據庫 bar。

註意
NOTE
WARN
use foo表示用戶在 foo 庫中創建,就一定要 foo 庫驗證身份,即用戶的信息跟隨隨數據庫。比如上述 simpleUser 雖然有 bar 庫的讀取權限,但是一定要先在 foo 庫進行身份驗證,直接訪問會提示驗證失敗。

use foo
db.auth("simpleUser", "simplePass")

use bar
show collections

還有一點需要註意,如果 admin 庫沒有任何用戶的話,即使在其他數據庫中創建了用戶,啟用身份驗證,默認的連接方式依然會有超級權限

2.4 內建角色

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

2.5 URI 形式的訪問

生產中常用 URI 形式對數據庫進行連接

mongodb://your.db.ip.address:27017/foo

添加用戶名密碼驗證

mongodb://simpleUser:[email protected]:27017/foo

參考鏈接

  • Enable Authentication
  • Build-in Roles
  • Mongodb 3.0 用戶創建
  • Mongodb Authentication

結語

在使用數據庫的過程中,一定要註意安全風險,由於 Mongodb 的默認配置,使得數據庫有入侵風險,應該予以防範。



作者:kimoCHG
鏈接:https://www.jianshu.com/p/79caa1cc49a5
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並註明出處。

MongoDB 用戶名密碼登錄