基于Docker的MongoDB实现授权访问

BlakeLhotsk 8年前
   <p><img src="https://simg.open-open.com/show/1c7f94e542c967a525b327d2b1d94c8b.png"></p>    <p>基于Docker部署一个数据库实例通常比直接在服务器上安装数据库还要简单,Gevin在开发环境中经常使用基于docker的数据库服务,docker也渐渐成为Gevin在Linux上安装MongoDB的首选方式,由于MongoDB默认是不用通过认证就能直接连接的,出于安全考虑,在公网上部署MongoDB时,务必设置authentication机制,以避免类似 "黑客赎金" 问题的发生。</p>    <p>那么,基于Docker拉起的MongoDB,如何实现通过用户名密码访问指定数据库呢?方法很简单,但前提是要了解MongoDB授权访问的机制,参考资料如下:</p>    <ul>     <li><a href="/misc/goto?guid=4959740757332519220" rel="nofollow,noindex">Enable Auth</a></li>     <li><a href="/misc/goto?guid=4959740757419855396" rel="nofollow,noindex">Authentication</a></li>     <li><a href="/misc/goto?guid=4959740757511363124" rel="nofollow,noindex">Role-Based Access Control</a></li>    </ul>    <p>只要了解MongoDB授权访问机制,直接按下面步骤一步步执行就可以了。</p>    <h2>1、创建MongoDB实例</h2>    <p>为了少写几个命令,Gevin使用Docker Compose来创建MongoDB实例:</p>    <pre>  version: '2'  services:    mongo:      # restart: always      image: mongo:3.2      command: [--auth]      ports:        - "37017:27017"      volumes:        - /data/db</pre>    <p>运行如下命令:</p>    <pre>  docker-compose up -d    #----------  # Result:  #----------  # Creating mongodb_mongo_1    docker-compose ps    #----------  # Result:  #----------    #      Name                Command          State            Ports  # --------------------------------------------------------------------------  # mongodb_mongo_1   /<a href="/misc/goto?guid=4959740757588892485" rel="nofollow">entrypoint.sh</a> --auth   Up      0.0.0.0:37017->27017/tcp</pre>    <h2>2、创建用户管理员</h2>    <p>首先要进入MongoDB容器内部,连上MongoDB,并切换到 admin 数据库,这步可以通过下面命令完成:</p>    <pre>  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  #   <a href="/misc/goto?guid=4959740757670734730" rel="nofollow">http://docs.mongodb.org/</a>  # Questions? Try the support group  #   <a href="/misc/goto?guid=4959740757761388139" rel="nofollow">http://groups.google.com/group/mongodb-user</a></pre>    <p>然后创建一个user administrator:</p>    <pre>  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"          }      ]  }</pre>    <h2>3、创建访问指定数据库的用户</h2>    <p>创建了user administrator后,需要退出mongodb,并重新连接,然后用user administrator 访问admin数据库,并为目标数据库创建目标用户,其具体步骤如下:</p>    <p>(1)重新连接MongoDB数据库</p>    <p>退出容器,重新用下面命令进入容器即可:</p>    <pre>  docker exec -it mongodb_mongo_1 mongo admin    #----------  # Result:  #----------  MongoDB shell version: 3.2.12  connecting to: admin</pre>    <p>(2)授权登录admin</p>    <pre>  db.auth("mongo-admin","admin-initial-password")</pre>    <p>(3)创建访问指定数据库的用户</p>    <pre>  # 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"  #       }  #   ]  #}</pre>    <p>这一步的目标是为 octblog 这个数据库创建一个授权访问用户,首先要从 admin 数据库切换到 octblog 数据库,然后才能为 octblog 添加授权访问用户</p>    <p>注:</p>    <ul>     <li>上面所以操作均为user administrator执行的,即第二步创建的 mongo-admin</li>     <li>user administrator的作用是管理用户,MongoDB下的每个数据库,用户都被它管理,除此外,它基本没什么更多权限做其他事情</li>     <li>MongoDB没有通常意义的超级用户的概念,octblog的授权用户只能被user administrator创建,而user administrator只能登陆admin数据库,所以才会有上面(2)、(3)两步的麻烦。</li>    </ul>    <p> </p>    <p>来自:http://blog.igevin.info/posts/docker-mongo-auth/</p>    <p> </p>