当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    基于Docker的MongoDB实现授权访问的方法

    栏目:win服务器问题汇总 时间:2019-11-21 09:56

    基于Docker部署一个数据库实例通常比直接在服务器上安装数据库还要简单,Gevin在开发环境中经常使用基于docker的数据库服务,docker也渐渐成为Gevin在Linux上安装MongoDB的首选方式,由于MongoDB默认是不用通过认证就能直接连接的,出于安全考虑,在公网上部署MongoDB时,务必设置authentication机制,以避免类似 "黑客赎金" 问题的发生。

    那么,基于Docker拉起的MongoDB,如何实现通过用户名密码访问指定数据库呢?方法很简单,但前提是要了解MongoDB授权访问的机制,参考资料如下:

    Enable Auth
    Authentication
    Role-Based Access Control

    只要了解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"
    #    }
    #  ]
    #}