MongoDB 安全权限访问控制
麻蛋,终于貌似搞定了用户管理的问题:
1.按照http://www.yeayee.com/article-6671969-1.html后半部分,采用正确的安装姿势,可能在子进程过程中会出现错误,但是不影响配置;
2.按照下面红色流程,逐一进行配置,则可行,否则,嘿嘿嘿...,倒腾了一天,就为了设一道门,值得!
遇到类似问题搞不定的可以加群询问哦!
1.查看mongodb服务是否开启
ps -ef | grep mongod
没有开启的话你就自己开启吧
sudo service mongod start
查看服务的状态:sudo service mongod status
实在不行的话就用这种方式: sudo mongod -f /etc/mongod.conf
创建管理员角色
管理员角色必须在你添加--auth认证参数之前创建,不然之后你就没有权限可操作了。如果你之前已经有了用户,那么就删除用户吧。
use admin
db.system.users.remove({}) --> 删除所有用户
db.system.version.find() --> 查看当前的authSchema(认证模式),默认的为5是SCRAM-SHA-1模式,当然你可以改为3是MONGODB-CR模式
更改认证模式:db.system.version.remove({}) --> 删除当前认证模式。
db.system.version.insert({ "_id" : "authSchema", "currentVersion" : 3 }) --> 添加当前的认证模式为3
然后添加管理员角色吧
use admin
db.createUser({
user: "root",
pwd: "root",
roles: [ { role: "userAdminAnyDatabase", db: "admin"} ]})
重启服务登录认证
sudo pkill mongod --> 杀死服务,很方便。
sudo mongod -f /etc/mongod.conf --fork --auth --> 以认证模式启动服务
然后ps -ef | grep mongod查看服务是否启动
用户登录
mongo
use admin
show dbs; --> 出错,因为你没有权限
db.auth("root","root"); --> 登录认证
show dbs; --> ok
db.system.users.find() --> 显示用户信息,你可以看看authSchema后面事那种模式
解决启动mongod 时,出现addr already in use错误
启动mongod root@wangyuyu-Vostro-1440:/usr/bin# ./mongod
错误提示:
Sat Aug 17 09:02:02 [initandlisten] ERROR: listen(): bind() failed errno:98 Address already in use for socket: 0.0.0.0:27017
Sat Aug 17 09:02:02 [initandlisten] ERROR: addr already in use
原因是启动mongod时端口被占用。
解决办法:
使用命令 root@wangyuyu-Vostro-1440:/usr/bin# netstat -anp|more
可以看到客户端还保持着与服务器的连接
Proto Recv-Q Send-Q Local Address Foreign Address State
PID/Program name
tcp 0 0 127.0.0.1:28017 0.0.0.0:* LISTEN
953/mongod
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
1546/dnsmasq
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
653/cupsd
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN
953/mongod
tcp 1 0 192.168.5.124:56874 91.189.89.144:80 CLOSE_WAIT
1913/ubuntu-geoip-p
tcp 0 1 192.168.5.124:45890 220.181.111.24:80 FIN_WAIT1
-
tcp 0 0 192.168.5.124:44867 219.148.35.218:80 ESTABLISHED
2219/firefox
杀死953进程root@wangyuyu-Vostro-1440:/usr/bin# kill -9 953
再次察看服务器链接状态:
Proto Recv-Q Send-Q Local Address Foreign Address State
PID/Program name
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
1546/dnsmasq
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
653/cupsd
tcp 0 0 192.168.5.124:60805 61.172.207.130:80 TIME_WAIT
-
tcp 1 0 192.168.5.124:56874 91.189.89.144:80 CLOSE_WAIT
1913/ubuntu-geoip-p
tcp 0 0 192.168.5.124:54370 117.79.157.237:80 TIME_WAIT
-
OK已经成功杀掉进程。
root@wangyuyu-Vostro-1440:/usr/bin# ./mongod
Sat Aug 17 09:32:25 [initandlisten] waiting for connections on port 27017
Sat Aug 17 09:32:25 [websvr] admin web console waiting for connections on port 28017
mongoDB 3.0 访问控制改了很多,需要你老老实实的去看文档去验证,谷歌百度出来的多半就是错误的。 还需要注意这个参数authenticationMechanisms。
为了兼用2.6版本,我直接指定下面的参数:
12 | setParameter: authenticationMechanisms: MONGODB-CR |
下面看看如何创建访问控制权限
不使用 —auth 参数,启动 mongoDB
1 | mongodb-linux-i686-3.0.0/bin/mongod -f mongodb-linux-i686-3.0.0/mongodb.conf |
此时你 show dbs 会看到只有一个local数据库,那个所谓的admin是不存在的。
mongoDB 没有超级无敌用户root,只有能管理用户的用户 userAdminAnyDatabase。
添加管理用户
12345678 | use admin db.createUser( { user: "buru", pwd: "12345678", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } ) |
roles 中的 db 参数是必须的,不然会报错:Error: couldn’t add user: Missing expected field “db”。另外,有很多文章记录的是使用 db.addUser(…) 方法,这个方法是旧版的,3.0中已经不存在,详见:http://docs.mongodb.org/manual/reference/method/js-user-management。
切换到admin下,查看刚才创建的用户:
1 2 3 4 | show users 或 db.system.users.find() { "_id" : "admin.buru", "user" : "buru", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "gwVwuA/dXvxgSHavEnlyvA==", "storedKey" : "l2QEVTEujpkCuqDEKqfIWbSv4ms=", "serverKey" : "M1ofNKXg2sNCsFrBJbX4pXbSgvg=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } |
怎么关闭 mongoDB?千万不要 kill -9 pid,可以 kill -2 pid 或 db.shutdownServer()
下面使用 —auth 参 数,重新启动 mongoDB:
1234567 | mongodb-linux-i686-3.0.0/bin/mongod --auth -f mongodb-linux-i686-3.0.0/mongodb.conf mongodb-linux-i686-3.0.0/bin/mongo use admin db.auth("buru","12345678") #认证,返回1表示成功 或 mongodb-linux-i686-3.0.0/bin/mongo -u buru -p 12345678 --authenticationDatabase admin |
此时 show collections 报错
1 2 3 4 5 6 7 8 9 10 11 12 | 2015-03-17T10:15:56.011+0800 E QUERY Error: listCollections failed: { "ok" : 0, "errmsg" : "not authorized on admin to execute command { listCollections: 1.0 }", "code" : 13 } at Error (<anonymous>) at DB._getCollectionInfosCommand (src/mongo/shell/db.js:643:15) at DB.getCollectionInfos (src/mongo/shell/db.js:655:20) at DB.getCollectionNames (src/mongo/shell/db.js:666:17) at shellHelper.show (src/mongo/shell/utils.js:625:12) at shellHelper (src/mongo/shell/utils.js:524:36) at (shellhelp2):1:1 at src/mongo/shell/db.js:643 |
因为,用户buru只有用户管理的权限。
下面创建用户,用户都跟着库走,创建的用户都是
1234567891011 | use tianhe db.createUser( { user: "bao", pwd: "12345678", roles: [ { role: "readWrite", db: "tianhe" }, { role: "read", db: "tianhe2" } ] } ) |
查看刚刚创建的用户。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | show users { "_id" : "tianhe.bao", "user" : "bao", "db" : "tianhe", "roles" : [ { "role" : "readWrite", "db" : "tianhe" }, { "role" : "read", "db" : "tianhe2" } ] } |
查看整个mongoDB全部的用户:
12345 | use admin db.system.users.find() { "_id" : "admin.buru", "user" : "buru", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "gwVwuA/dXvxgSHavEnlyvA==", "storedKey" : "l2QEVTEujpkCuqDEKqfIWbSv4ms=", "serverKey" : "M1ofNKXg2sNCsFrBJbX4pXbSgvg=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } { "_id" : "tianhe.bao", "user" : "bao", "db" : "tianhe", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "//xy1V1fbqEHC1gzQqZHGQ==", "storedKey" : "ZS/o54zzl/FdcXLQJ98KdAVTfF0=", "serverKey" : "iIpNYz2Gk8KhyK3zgz6muBt0PI4=" } }, "roles" : [ { "role" : "readWrite", "db" : "tianhe" }, { "role" : "read", "db" : "tianhe2" } ] } |
创建完毕,验证一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | use buru show collections 2015-03-17T10:30:06.461+0800 E QUERY Error: listCollections failed: { "ok" : 0, "errmsg" : "not authorized on buru to execute command { listCollections: 1.0 }", "code" : 13 } at Error (<anonymous>) at DB._getCollectionInfosCommand (src/mongo/shell/db.js:643:15) at DB.getCollectionInfos (src/mongo/shell/db.js:655:20) at DB.getCollectionNames (src/mongo/shell/db.js:666:17) at shellHelper.show (src/mongo/shell/utils.js:625:12) at shellHelper (src/mongo/shell/utils.js:524:36) at (shellhelp2):1:1 at src/mongo/shell/db.js:643 |
显然没权限,先auth:
1 2 3 4 5 6 | db.auth("bao","12345678") 1 show collections news system.indexes wahaha |
参考:
Mongo Shell:http://docs.mongodb.org/v2.2/tutorial/getting-started-with-the-mongo-shell
Enable Access Control:http://docs.mongodb.org/manual/tutorial/enable-authentication
Add a User to a Database:http://docs.mongodb.org/manual/tutorial/add-user-to-database
User Methods:http://docs.mongodb.org/manual/reference/method/js-user-management
Role Methods:http://docs.mongodb.org/manual/reference/method/js-role-management
mongodb 3.0 authentication:http://ibruce.info/2015/03/03/mongodb3-auth/
原文链接:https://www.ttlsa.com/mongodb/mongodb-3-0-security-permissions-access-control/
老的文章:
一、关于权限的默认配置
在默认情况下,mongod是监听在0.0.0.0之上的,任何客户端都可以直接连接27017,且没有认证。这样做的好处是,用户可以即时上手,不用担心被一堆配置弄的心烦意乱。然而坏处也是显而易见,如果直接在公网服务器上如此搭建MongoDB,那么所有人都可以直接访问并修改数据库数据了。
默认情况下,mongod也是没有管理员账户的。因此除非你在admin数据库中使用db.addUser()命令添加了管理员帐号,且使用–auth参数启动mongod,否则在数据库中任何人都可以无需认证执行所有命令。包括delete和shutdown。
此外,mongod还会默认监听27017端口,同样是绑定所有ip。这是一个mongod自带的web监控界面。从中可以获取到数据库当前连接、log、状态、运行系统等信息。如果你开启了–rest参数,甚至可以直接通过web界面查询数据,执行mongod命令。
其实MongoDB本身有非常详细的安全配置准则,显然开发者也是想到了,然而他是将安全的任务推给用户去解决,这本身的策略就是偏向易用性的,对于安全性,则得靠边站了。
二、MongoDB用户类型
MongoDB的用户分为两种,一种是admin用户,另一种是特定数据库用户。admin用户拥有最高的权限,而特定数据库用户则只能访问特定的数据库。当MongoDB的admin库里没有任何用户的时候,也就是说整个MongoDB没有一个MongoDB用户的时候,即便–auth权限需求打开了,用户还是可以通过localhost界面进入MongoDB进行用户设置,否则的话整个MongoDB就完全没法访问了。而当这个用户创建完成之后,之后的用户登录和操作就需要授权了,不是直接登录就能使用的了。
MongoDB有一个比较奇怪的设置是,即便是一个admin用户,授权也必须在admin数据库下进行,而不能在其他数据库下进行。而授权之后admin用户就可以在任何数据库下进行任何操作了。当然数据库级别的用户在他自己的数据库下授权之后是不能到其他数据库进行操作的。举例来说:
> use test
> db.auth(“someAdminUser”, password)
操作失败,提示还没有在admin数据库下对afmin用户进行授权。
三、操作实例
启动MongoDB,在cmd命令框里进入数据库的bin目录;
1. 输入命令:show dbs,你会发现它内置有两个数据库,一个名为admin,一个名为local;本文只对admin库进行描述
2. 输入命令:use admin,你会发现该DB下包含了一个名为system.user的collection,这是用户表,用来存放超级管理员的
备注:本文使用的数据库版本是2.0.1,没有默认的admin数据库,但是在执行第二步之后自动创建了一个admin库; 当然也没有默认的system.user表,运行后面的第三步后会自动创建 system.user和system.indexes )
3. 输入命令:db.addUser("root","root"),这里我添加一个超级管理员用户,username为root,password也为root。先退出 (ctrl+c)程序,测试重启服务后再次连接MongoDB是否需要按提示输入用户名、密码进行操作。
4. 输入命令:use admin
5. 输入命令:show collections,查看该库下所有的表,你会发现,MongoDB并没有提示你输入用户名、密码,原因是,在文章最开始提到了,MongoDB默认设置为无权限访问限制,我们需要先把它设置成为需要权限访问
6.在mongodb路径的bin目录下,执行mongod --dbpath d:workdatamongodbdb --logpath d:workdatamongodblog -auth -service
7. 输入命令:use admin
8. 输入命令:show collections,提示:"$err" : "unauthorized db:admin lock type:-1 client:127.0.0.1"
显然,已经提示没有权限;用刚才设置的用户名、密码来访问集合
9. 输入命令:db.auth(“root”,”root”),输出一个结果值为1,说明这个用户匹配上了,如果用户名、密码不对,输出为0
10. 输入命令:show collections,将成功显示结果
继续操作,可以访问已经存在的数据库,但对于新建的数据库仍然没有权限;继续操作,先退出(ctrl+c)服务
11. 输入命令:mongo TestDB
12. 输入命令:show collections,提示:没有权限
13. 输入命令:db.auth(“root”, “root”),输
- 上一篇: 使用C语言计算utf-8字符串长度 和取子字符串-转
- 下一篇: python 文件转成16进制数组