基于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>