1. 程式人生 > >3. Mongodb 設定授權訪問

3. Mongodb 設定授權訪問

基於Docker部署一個數據庫例項通常比直接在伺服器上安裝資料庫還要簡單,Gevin在開發環境中經常使用基於docker的資料庫服務,docker也漸漸成為Gevin在Linux上安裝MongoDB的首選方式,由於MongoDB預設是不用通過認證就能直接連線的,出於安全考慮,在公網上部署MongoDB時,務必設定authentication機制,以避免類似 “黑客贖金” 問題的發生。

那麼,基於Docker拉起的MongoDB,如何實現通過使用者名稱密碼訪問指定資料庫呢?方法很簡單,但前提是要了解MongoDB授權訪問的機制,參考資料如下:

只要瞭解MongoDB授權訪問機制,直接按下面步驟一步步執行就可以了。

1、建立MongoDB例項

為了少寫幾個命令,Gevin使用Docker Compose來建立MongoDB例項:

version: '2'
services:
  mongo:
    # restart: always
    image: mongo:3.2
    command: [--auth]
    ports:
      - "37017:27017"
    volumes:
      - /data/db

執行如下命令:

docker-compose up -d

#----------
# Result:
#----------
# Creating mongodb_mongo_1

docker-compose ps

#----------
# Result:
#----------

#      Name                Command          State            Ports
# --------------------------------------------------------------------------
# mongodb_mongo_1   /entrypoint.sh --auth   Up      0.0.0.0:37017->27017/tcp

2、建立使用者管理員

首先要進入MongoDB容器內部,連上MongoDB,並切換到 admin 資料庫,這步可以通過下面命令完成:

docker exec -it mongodb_mongo_1 mongo admin

#----------
# Result:
#----------
# MongoDB shell version: 3.2.12
# connecting to: admin
# Welcome to the MongoDB shell.
# For interactive help, type "help".
# For more comprehensive documentation, see
#   http://docs.mongodb.org/
# Questions? Try the support group
#   http://groups.google.com/group/mongodb-user

然後建立一個user administrator:

db.createUser({ 
    user: 'mongo-admin', 
    pwd: 'admin-initial-password', 
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });

#----------
# Result:
#----------
Successfully added user: {
    "user" : "mongo-admin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

3、建立訪問指定資料庫的使用者

建立了user administrator後,需要退出mongodb,並重新連線,然後用user administrator 訪問admin資料庫,併為目標資料庫建立目標使用者,其具體步驟如下:

(1)重新連線MongoDB資料庫

退出容器,重新用下面命令進入容器即可:

docker exec -it mongodb_mongo_1 mongo admin

#----------
# Result:
#----------
MongoDB shell version: 3.2.12
connecting to: admin

(2)授權登入admin

db.auth("mongo-admin","admin-initial-password")

(3)建立訪問指定資料庫的使用者

# Step1: switch to the specified database:
use octblog

# Step2: create a user
db.createUser(
  {
    user: "gevin",
    pwd: "gevin",
    roles: [ { role: "readWrite", db: "octblog" },
             { role: "readWrite", db: "octblog-log" } ]
  }
)

#----------
# Result:
#----------
#Successfully added user: {
#   "user" : "gevin",
#   "roles" : [
#       {
#           "role" : "readWrite",
#           "db" : "octblog"
#       },
#       {
#           "role" : "readWrite",
#           "db" : "octblog-log"
#       }
#   ]
#}

這一步的目標是為 octblog 這個資料庫建立一個授權訪問使用者,首先要從 admin 資料庫切換到 octblog 資料庫,然後才能為 octblog 新增授權訪問使用者

注:

  • 上面所以操作均為user administrator執行的,即第二步建立的 mongo-admin
  • user administrator的作用是管理使用者,MongoDB下的每個資料庫,使用者都被它管理,除此外,它基本沒什麼更多許可權做其他事情
  • MongoDB沒有通常意義的超級使用者的概念,octblog的授權使用者只能被user administrator建立,而user administrator只能登陸admin資料庫,所以才會有上面(2)、(3)兩步的麻煩。

驗證授權登入

Command:mongo ip:port/db_name -u {user} -p {password}
Example:docker exec -it {containerId} mongo localhost:27017/db_name -u user -p password