1. 程式人生 > >MongoDB加auth權限

MongoDB加auth權限

mongodb 色相 而且 article ocs 成了 .net 不知道 pre

吹個牛B,自己的MongoDB裸奔了快半年,從未遭受黑客攻擊。也不知道是自己運氣好,還是黑客對我的乞丐版服務器看不上眼。不過既然知道了數據庫裸奔的危險性,就要給它上把鎖。然而上鎖對我這種刻意回避數據庫知識的人來說,也實在不是一件容易的事。

在學習上鎖的過程中,看了好些文章。為了防止大家看我這篇沒懂後還有的看,先給出參考文檔:

  • https://www.cnblogs.com/chunlei36/p/6506048.html
  • https://blog.csdn.net/u012900400/article/details/79207822
  • https://blog.csdn.net/wangmao01/article/details/80805643

裸奔有多危險

一句話,沒有密碼的數據庫,而且又沒有改27017這個MongoDB默認端口號,別人一個命令就可以連上去:


mongo 192.168.0.5:27017

這篇文章也給出了關於MongoDB安全性的詳細說明

當然你可能說,他怎麽知道我用的什麽數據庫,然後猜到我的端口。我在這裏只能說,我們要相信黑客的技術??。

mongoDB修改默認端口號

在設置權限之前,我們要首先改掉默認端口號,這是防止被攻擊的第一步。

修改默認端口號可分為兩步,第一步,關掉MongoDB;第二步,用新的端口號啟動MongoDB

關閉MongoDB

關閉MongoDB也有兩種方式,第一是借助mongo shell,使用db.shutdownServer()

,第二是直接殺進程。

shutdownServer的使用方法如下:

# 進入mongo shell
mongo

# 顯示現有的數據庫
show dbs

# 進入admin數據庫
use admin

# 關閉數據庫
db.shutdownServer()

當然,我更喜歡另外一種簡單粗暴的方式:kill

# mac
lsof -i :27017

# centOS
netstat -pan | grep 27017

# 查到pid後,kill
kill 36954

重啟MongoDB

重啟MongoDB也有兩種方式:命令行參數啟動 和 加載配置文件啟動。兩者的唯一區別就是後面的方法將配置參數放到了一個配置文件之中。兩種方法中,我們要做的都是改掉默認端口號,先來看第一種方式:

# 這個命令可以查看mongod可以接受哪些參數
mongod --help

# -p 可以用來設置port端口號

mongod --fork --logpath 你的log存放路徑 --dbpath  你的數據庫存放路徑 -p 12345 

這裏講一下 --fork 的意思,如果不帶這個參數,MongoDB的日誌會在前臺運行,日誌會直接打印到shell裏面。帶上這個參數則會將MongoDB轉到後臺運行,同時將運行日誌寫到logpath裏面,而不是直接打印到命令行。

設置密碼

接下來,講到設置密碼的關鍵環節了,沒有密碼,只改變端口,就好像把門從朝東改成了朝南,卻還是沒有上鎖。所以再加上密碼這一步才算安全。在設置MongoDB的密碼前,我們要知道以下幾點:

  1. 每個數據庫之間的密碼是獨立的。
  2. 數據庫權限是分角色的。

這裏不講每個角色(role)有哪些權限,更多角色相關的內容可以參考官方文檔build-in roles。下面設置密碼的步驟主要參考MongoDB官方文檔:https://docs.mongodb.com/manual/tutorial/enable-authentication/

第一步:開啟MongoDB服務

mongod --port 23456 --dbpath /data/db1

第二步:進入MongoDB shell,類似於node.js的node命令

mongo --port 23456

第三步:進入admin數據庫,以 userAdminAnyDatabase 的角色創建admin賬號,這個賬號創建後,可以為任何數據庫創建用戶

use admin #進入admin數據庫

# 創建admin賬號
db.createUser(
  {
    user: "myUserAdmin", #用戶名
    pwd: "abc123", #密碼
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

創建完成後推出mongo shell。

第四步:加入授權重啟MongoDB,方法上面介紹過了,但是要加上授權參數--auth

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

第五步:使用--auth啟動後,登錄mongo shell就需要輸入密碼了,可以將賬號密碼放在一條命令中,也可以先進入shell,再輸入賬號密碼鑒權,分別對應如下兩條語句:



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

或者先登錄再使用auth授權

# 先進入mongo shell
mongo --port 23456

# 使用auth函數輸入admin數據庫的賬號密碼

use admin
db.auth("myUserAdmin", "abc123" )

第六步:你登錄 admin 數據庫後,就可以為別的業務數據庫創建賬號密碼了,比如為 test 和 reporting數據庫創建賬號密碼:

use test # 進入test數據庫
db.createUser(
  {
    user: "myTester",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "test" },
             { role: "read", db: "reporting" } ]
  }
)

第七步:推出shell後,現在可以用新創建的賬號密碼登錄test數據庫了:

# 直接登錄
mongo --port 23456 -u "myTester" -p "xyz123" --authenticationDatabase "test"

# 連接後登錄

mongo --port 23456

use test
db.auth("myTester", "xyz123" )

如果你用moogoose登錄,那你的url應該改成如下格式:

mongodb://myTester:[email protected]:23456/test

本文完

MongoDB加auth權限