基于Docker的MongoDB實現授權訪問

BlakeLhotsk 7年前發布 | 35K 次閱讀 MongoDB Docker

基于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)兩步的麻煩。

 

來自:http://blog.igevin.info/posts/docker-mongo-auth/

 

 本文由用戶 BlakeLhotsk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!