2018年06月08日 10:22:47 Liu-YanLin 阅读数:16801mongodb
原文转载地址:https://blog.csdn.net/singgel/article/details/79407774数据库
MongoDB 默认直接链接,无须身份验证,若是当前机器能够公网访问,且不注意Mongodb 端口(默认 27017)的开放状态,那么Mongodb就会产生安全风险,被利用此配置漏洞,入侵数据库。安全
因为网络配置因人而异,须要根据本身实际环境进行配置,不做冗述。大体能够从如下方面禁止。网络
在外网机器命令行中运行函数
spatelnet your.machine.open.ip 27017
当前数据库版本:Mongodb 3.4.net
使用 mongod 启动数据库
新建终端命令行
mongod --port 27017 --dbpath /data/db1
参数默承认以不加,如有自定义参数,才要加上,下同。code
另起一个终端,运行下列命令blog
mongo --port 27017
use admin
db.createUser(
{
user: "adminUser",
pwd: "adminPass",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
管理员建立成功,如今拥有了用户管理员
用户名:lyl
密码:123456
而后,断开 mongodb 链接, 关闭数据库
两个终端下 <C - c>
启动带访问控制的 Mongodb
新建终端
mongod --auth --port 27017 --dbpath /data/db1
如今有两种方式进行用户身份的验证
第一种 (相似 MySql)
客户端链接时,指定用户名,密码,db名称
mongo --port 27017 -u "lyl" -p "123456" --authenticationDatabase "admin"
第二种
客户端链接后,再进行验证
mongo --port 27017
use admin
db.auth("adminUser", "adminPass")
// 输出 1 表示验证成功
过程相似建立管理员帐户,只是 role 有所不一样
use foo
db.createUser(
{
user: "simpleUser",
pwd: "simplePass",
roles: [ { role: "readWrite", db: "foo" },
{ role: "read", db: "bar" } ]
}
)
如今咱们有了一个普通用户
用户名:simpleUser
密码:simplePass
权限:读写数据库 foo, 只读数据库 bar。
注意
NOTE
WARN
use foo
表示用户在 foo 库中建立,就必定要 foo 库验证身份,即用户的信息跟随随数据库。好比上述 simpleUser 虽然有 bar 库的读取权限,可是必定要先在 foo 库进行身份验证,直接访问会提示验证失败。
use foo
db.auth("simpleUser", "simplePass")
use bar
show collections
还有一点须要注意,若是 admin 库没有任何用户的话,即便在其余数据库中建立了用户,启用身份验证,默认的链接方式依然会有超级权限
生产中经常使用 URI 形式对数据库进行链接
mongodb://your.db.ip.address:27017/foo
添加用户名密码验证
mongodb://simpleUser:simplePass@your.db.ip.address:27017/foo
mongodb://simpleUser:simplePass@your.db.ip.address:27017/foo