标签:
今天主要说下我为了给mongodb数据库添加authorization,大家应该知道,mongo默认是无auth运行的。这可能是方便小伙伴学习命令吧。
由于之前发布的一个项目,在亚马逊的云上,处于内部应用,也没有给数据库添加auth,没有想到,被AWS的监控发现了,提示需要安全措施,不能无auth运行,因为这样子会被外部网络查询攻击。所以今天要将那个应用重新修改一下mongo客户端程序的应用方式。程序是python写的,改起来还是比较方便,不像java还要再编译打包发布,python程序,现场修改即可应用!
这里,说说python调用mongodb的需要auth的API过程,常见的有两种方式:
方式1:
1 db_conf = config.mongo 2 db = MongoClient(host=db_conf["ip_addr"], port=db_conf["port"])[db_conf["db_name"]] 3 db.authenticate(db_conf["user_name"], db_conf["password"]) #当不需要auth的时候,这行代码可以不需要
方式2:
uri = "mongodb://"+conf[‘mongodb_username‘]+":"+conf[‘mongodb_password‘]+"@"+conf[‘mongodb_host‘]+":"+str(conf[‘mongodb_port‘])+"/"+conf[‘mongodb_db_name‘] db = pymongo.MongoClient(uri)[conf[‘mongodb_db_name‘]]
看上去是不是很简单,按照API的需要填写参数即可。
我的应用发布在两个云主机上,不幸的是,两个主机上的mongodb版本不一样,悲惨的我,之前不知道有这等大的不同,关于auth的屁大点的事情。一个是2.4.1,一个是2.6.6. 他们之间的差别主要是认证用户信息存放的位置和管理机制不同。我的应用程序的数据库名字是BlastdDB。
2.4.1的认证用户信息是存放在对应的database里面的system.users表里面,而admin表里面是没有内容的,悲惨的是,仅仅在BlastdDB里面添加用户是不行的,因为这个时候,你会发现,即使mongod这个server程序启动时带上--auth,你再用mongo去访问,他还是照样什么都可以操作,什么都可以看。。。撕逼的设计啊。。。
1 root@ec2-54-248-13-173:/opt/mongodb/bin# ./mongo #这个是admin表为空的情况下,但是mongod启动是带上了--auth操作,BlastdDB此时也有添加认证用户 2 MongoDB shell version: 2.4.1 3 connecting to: test 4 > show collections 5 system.indexes 6 test 7 > use BlastdDB 8 switched to db BlastdDB 9 > show collections 10 system.indexes 11 system.users 12 target_service 13 user 14 worker
下面再看看,我将admin数据库中添加一个认证用户,并操作一下其他的数据库,看看日志,就清楚了:
1 > use admin 2 switched to db admin 3 > db.addUser("admin", "admin") 4 { 5 "user" : "admin", 6 "readOnly" : false, 7 "pwd" : "7c67ef13bbd4cae106d959320af3f704", 8 "_id" : ObjectId("569da568a93f15901119708a") 9 } 10 > 11 > use BlastdDB 12 switched to db BlastdDB 13 > show collections 14 Tue Jan 19 02:54:50.239 JavaScript execution failed: error: { 15 "$err" : "not authorized for query on BlastdDB.system.namespaces", 16 "code" : 16550 17 } at src/mongo/shell/query.js:L128 18 > use test 19 switched to db test 20 > show collections 21 Tue Jan 19 02:55:07.620 JavaScript execution failed: error: { 22 "$err" : "not authorized for query on test.system.namespaces", 23 "code" : 16550 24 } at src/mongo/shell/query.js:L128 25 > use BlastdDB 26 switched to db BlastdDB 27 > show collections 28 Tue Jan 19 02:57:48.129 JavaScript execution failed: error: { 29 "$err" : "not authorized for query on BlastdDB.system.namespaces", 30 "code" : 16550 31 } at src/mongo/shell/query.js:L128 32 > db.auth("xxxx", "yyyy") 33 1 34 > show collections 35 system.indexes 36 system.users 37 target_service 38 user 39 worker
但是,对于2.6.6这个版本,就不同了,对于我的数据库BlastdDB添加认证用户信息,其实,这些信息不在BlastdDB的system.users表中,而是在admin的system.users表中,所以,当启动mongod的时候,若带上--auth,则,登录BlastdDB,会要求正确的用户名和密码信息,否则报错。和2.4.1的区别,主要是少了一步必须给admin数据库添加认证用户(对于2.4.1,这个认证用户信息不必和应用数据库的认证信息相同,只要有一个就可以)。另外,就是认证用户信息的存放位置不同,对于2.6.6是集中存放在admin当中了。当然,admin中也可以创建认证用户,这个用户可以查看所有的数据库的信息了,属于超级用户。下面看看我的操作日志,反映一下两个版本的差别:
1 root@ec2-xxx-xxx-xxx-xxx:/usr/local/mongodb-linux-x86_64-2.6.6/bin# ./mongo #这个是去访问已经带有--auth选项的mongod服务程序 2 MongoDB shell version: 2.6.6 3 connecting to: test 4 > use admin 5 switched to db admin 6 > show collections 7 2016-01-19T03:22:51.958+0000 error: { 8 "$err" : "not authorized for query on admin.system.namespaces", 9 "code" : 13 10 } at src/mongo/shell/query.js:131 11 > show dbs 12 2016-01-19T03:22:58.754+0000 listDatabases failed:{ 13 "ok" : 0, 14 "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }", 15 "code" : 13 16 } at src/mongo/shell/mongo.js:47 17 > use BlastdDB 18 switched to db BlastdDB 19 > db.auth("xxxx", "yyyy") 20 1 21 > show collections 22 cloud_provider 23 counters 24 system.indexes 25 user
下面这个日志,可以反映出另外一些信息,比如创建认证用户的输出在两个版本中是不同的,最重要的是看collection中的数据结构的不同,可以反映出认证用户的管理方式的变化,这个变化可以说明新的版本管理理念要比旧版本先进:
2.4.1:
1 >use admin 2 > db.auth("admin","admin") 3 1 4 > show collections 5 system.indexes 6 system.users 7 > db.system.users.find() 8 { "_id" : ObjectId("569da568a93f15901119708a"), "user" : "admin", "readOnly" : false, "pwd" : "7c67ef13bbd4cae106d959320af3f704"
2.6.6:
1 MongoDB shell version: 2.6.6 2 connecting to: test 3 > use admin 4 switched to db admin 5 > show collections 6 system.indexes 7 system.users 8 system.version 9 > db.system.users.find() 10 { "_id" : "BlastdDB.scrc", "user" : "scrc", "db" : "BlastdDB", "credentials" : { "MONGODB-CR" : "53ba09afcf99336d2af2a5d020e5d51e" }, "roles" : [ { "role" : "dbOwner", "db" : "BlastdDB" } ] } 11 > use admin 12 switched to db admin 13 > db.addUser("admin", "admin") 14 WARNING: The ‘addUser‘ shell helper is DEPRECATED. Please use ‘createUser‘ instead 15 Successfully added user: { "user" : "admin", "roles" : [ "root" ] } 16 > db.system.users.find() 17 { "_id" : "BlastdDB.scrc", "user" : "scrc", "db" : "BlastdDB", "credentials" : { "MONGODB-CR" : "53ba09afcf99336d2af2a5d020e5d51e" }, "roles" : [ { "role" : "dbOwner", "db" : "BlastdDB" } ] } 18 { "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "MONGODB-CR" : "7c67ef13bbd4cae106d959320af3f704" }, "roles" : [ { "role" : "root", "db" : "admin" } ] } 19 >
这些变化,方便用户关注,后续应用中遇到了,可以作为借鉴,不要因为版本的差异导致迷途而浪费了时间。
标签:
原文地址:http://www.cnblogs.com/shihuc/p/5141849.html