MongoDB 缺省是没有设置鉴权的,业界大部分使用 MongoDB 的项目也没有设置访问权限。这就意味着只要知道 MongoDB 服务器的端口,任何能访问到这台服务器的人都可以查询和操作 MongoDB 数据库的内容。在一些项目当中,这种使用方式会被看成是一种安全漏洞
一、开启认证的方式
可以通过设置用户名、密码来连接mongodb
运行mongodb时,添加--auth参数,即可开启认证
./mongod --dbpath=./mongodb/data --port=27017 --auth
二、创建mongodb用户
开启认证后,连接mongodb时,就需要提供用户名和密码。
mongodb的用户分两种,一种是管理员,一种是普通用户。
管理员管理普通用户、普通用户管理数据库数据,所以我们要先创建管理员
(1)创建管理员必须要在admin数据库下创建,首先关闭认证,即用一下命令运行mongodb
./mongod --dbpath=./mongodb/data --port=27017(2)创建管理员
db必须为admin
db.createUser({user:'admin',pwd:'123456',roles:[{role:'readWriteAnyDatabase',db:'admin'}]})
readAnyDatabase:在admin数据库下建立,可以读取所有数据库的信息
readWriteAnyDatabase:在admin数据库下建立,可以读写所有数据库的信息
userAdminAnyDatabase:在admin数据库下建立,可以管理所有数据库的用户
dbAdminAnyDatabase:在admin数据库下建立,可以管理所有数据库的信息(类似于所有数据库的dbAdmin账户)
这里我们用readWriteAnyDatabase
(3)创建普通用户
db为要操作的数据库
db.createUser({user:'dev',pwd:'123456',roles:[{role:'dbOwner',db:'is'}]})
三、开启认证运行
(1)修改mongodb的authSchema版本为3
开启认证运行mongodb时,发现报错
MONGODB-CR credentials missing in the user document网上查询资料后发现,是因为admin数据库里面system.version文档里面的authSchema版本为5,应该修改成3就可以。
先关闭认证,把authSchema的版本修改为3
var schema = db.system.version.findOne({“_id” : “authSchema”})
schema.currentVersion = 3
db.system.version.save(schema)
(2)重新创建管理员用户和普通用户
如果你现在开启认证,仍然会提示AuthenticationFailed MONGODB-CR credentials missing in the user document 原因是原来创建的用户已经使用了SCRAM-SHA-1认证方式
故先删除管理员和普通用户,再重新创建。操作之前,mongodb必须以无需认证的方式运行
use admin
db.dropUser("admin")
db.createUser({user:'admin',pwd:'123456',roles:[{role:'readWriteAnyDatabase',db:'admin'}]})
use is
db.dropUser("dev")
db.createUser({user:'dev',pwd:'123456',roles:[{role:'dbOwner',db:'is'}]})
(3)开启认证运行mongodb
如果要操作is数据库,则需要用普通用户登录,虽然管理员用户admin角色是可以操作其他数据库。但是java程序中用admin用户没办法正常操作is数据库,
只能用普通用户dev去操作数据库
四、开机启动
编译文件
vim /etc/rc.local
添加以下指令
/usr/application/mongodb/mongodb-linux-x86_64-rhel70-3.4.7/bin/mongod --dbpath=/usr/application/mongodb/data/ --port=27017 --auth --logpath=/usr/application/mongodb/logs --logappend -fork