基於 Docker 的 MongoDB 實現受權訪問

本文首發於Gevin的博客html

原文連接:基於Docker的MongoDB實現受權訪問mongodb

未經 Gevin 受權,禁止轉載docker

基於Docker的MongoDB實現受權訪問

基於Docker部署一個數據庫實例一般比直接在服務器上安裝數據庫還要簡單,Gevin在開發環境中常常使用基於docker的數據庫服務,docker也漸漸成爲Gevin在Linux上安裝MongoDB的首選方式,因爲MongoDB默認是不用經過認證就能直接鏈接的,出於安全考慮,在公網上部署MongoDB時,務必設置authentication機制,以免相似"黑客贖金"問題的發生。shell

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

只要瞭解MongoDB受權訪問機制,直接按下面步驟一步步執行就能夠了。安全

一、建立MongoDB實例

爲了少寫幾個命令,Gevin使用Docker Compose來建立MongoDB實例:bash

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複製代碼

二、建立用戶管理員

首先要進入MongoDB容器內部,連上MongoDB,並切換到admin數據庫,這步能夠經過下面命令完成:tcp

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:post

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"
        }
    ]
}複製代碼

三、建立訪問指定數據庫的用戶

建立了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)兩步的麻煩。
相關文章
相關標籤/搜索