MongoDB的安全性

上篇文章介绍Mongo启动了,一般数据库启动,下面的操作就是登录数据库了,之前测试数据库是否正常安装的时候也登录过数据库,现在回想一下,好像连用户名和密码都没有输入,找几篇帖子来探究下Mongodb的登录:

在启动篇中,配置启动参数配置文件的时候有个参数选项 noauth=true,这个就决定了无需验证即可登录服务器,那么我想要增加验证的安全机制如何做呢?

MongoDB的安全
MongoDB目前只支持最基本的安全认证,如果我们开启了安全性检查,则只有数据库认证用户才能进行读写操作,当然我们还可以创建读写权限用户和只读权限用户,如果我们在admin的数据库中进行创建用户,那么admin中的用户就会被当作超级用户,超级用户可以读写所有的数据库,并且还可以进行特殊的管理操作,比如可以再创建其他用户关闭进程等操作。

添加用户

根据官网上的例子,我们也来创建一个超级用户,一个test库中具有读写操作的普通用户,一个test库中只有读操作的普通用户。

[[email protected] bin]$ ./mongo
MongoDB shell version: 2.0.0
connecting to: test
> use admin
switched to db admin

> db.addUser("sys","sys");
{ "n" : 0, "connectionId" : 3, "err" : null,"ok" : 1 }
{
"user" : "sys",
"readOnly" : false,
"pwd" : "f0253610217776057486b19f72577509",
"_id" : ObjectId("4e9f8e27eb203de00bb8bfcf")
}

> show dbs
admin 0.0625GB
local (empty)
my_mongodb 0.0625GB
test 0.0625GB

> use test
switched to db test

> db.addUser("test001","001");
{ "n" : 0, "connectionId" : 3, "err" : null,"ok" : 1 }
{
"user" : "test001",
"readOnly" : false,
"pwd" : "189c319d58c4d3f3e540ac7bceae5d91",
"_id" : ObjectId("4e9f9273eb203de00bb8bfd0")
}

> db.addUser("test002","002");
{ "n" : 0, "connectionId" : 3, "err" : null,"ok" : 1 }
{
"user" : "test002",
"readOnly" : false,
"pwd" : "7d236571b88bc6cd0c87567589be0e6b",
"_id" : ObjectId("4e9f927ceb203de00bb8bfd1")
}

这里sys是在admin库中创建,属于超级用户,可以对所有库进行操作,在test库中创建的test001和test002属于test库的操作人员,只能对test库进行相应操作,记得要为安全验证生效需要将启动项auth设置为true。

查看用户
所有的用户信息都存储在每个数据库的db.system.users中,可以使用find()进行查看

# 选择admin数据库

>use admin

# 查看该库下的所有collection,这一步可以忽略
# 只是为了让你看一下每个库中都会有system.users这个collection 
>show collections 
system.indexes
system.users
# 查看可以访问该库的用户,结果类似这样
# {"_id":ObjectId("4be171f8cb53000000006064","user":"sys","readOnly":false,
# "pwd":"2a8025f0885adad5a8ce0044070032b3")},
# 不用说大家都看的明白了,root就是用户名,pwd的值就是通过加密后得到的字符串了,什么算法我不知道,
# readOnly的值为false是该用户还可以执行其他操作,如果该值为true那么该用户只拥有读数据的权限 
>db.system.users.find();

{ "_id" :ObjectId("4e9f8755672f1dd46f2cb654"), "user" :"sa", "readOnly" : false, "pwd" : "75692b1d11c072c6c79332e248c4f699"}
{ "_id" :ObjectId("4e9f8c2feb203de00bb8bfce"), "user": "admin", "readOnly" : false, "pwd" : "7c67ef13bbd4cae106d959320af3f704" }
{ "_id" :ObjectId("4e9f8e27eb203de00bb8bfcf"),"user" : "sys", "readOnly" : false,"pwd" : "f0253610217776057486b19f72577509" }

其中的pwd是根据用户名和用户密码生成的散列值。

修改用户
不管是添加用户,修改用户密码,修改用户操作权限都使用addUser()来完成。删除用户可以用remove()来实现.

# 命令和添加用户一样,把用户‘sys’的密码改为‘123456‘ 
>db.addUser(‘sys‘,‘123456‘) })
>db.system.users.find() 
删除用户
>db.system.users.remove({‘user‘:‘sys‘});

启用 验证 (设置--auth=true)

此时登录再直接查询信息的时候,可以看到要求验证用户名和密码的情况:
[[email protected] bin]$ ./mongo
MongoDB shell version: 2.0.0
connecting to: test
> show collections
Thu Oct 20 12:37:52 uncaught exception: error: {
"$err" : "unauthorized db:testlock type:-1 client:127.0.0.1",
"code" : 10057
}

[[email protected] bin]$ ./mongo
MongoDB shell version: 2.0.0
connecting to: test
> db.auth("test001","test001")
1
> show collections
foo
system.indexes
system.users
test

____________________________________________________________________________________________________________

根据官方文档开启 mongod 服务时不添加任何参数时,可以对数据库任意操作,而且可以远程访问数据库,所以推荐只是在开发是才这样不设置任何参数。
而提高 mongodb 数据库安全有几个方面:

1.绑定 内网IP 地址设置 <--推荐用内网IP,减少外网访问。

2.更改默认端口。

3.用户认证绑定 IP 地址.

4. 使用IPSEC策略,限制访问端口和IP。

1.)只有本地才可以访问:

mongod--bind_ip 127.0.0.1

2.)在设置其它的端口:

mongod --bind_ip 127.0.0.1--port28888

3.)添加用户认证:

添加用户认证必须在启动 mongod 服务时添加--auth参数:

mongod --bind_ip 127.0.0.1 --port28888--auth

4.)使用IPSEC策略,限制访问端口和IP。

#!/bin/bash

#for abcd Corporation:

#drop control ports ,some ports for history problem
/sbin/iptables -A INPUT -p tcp --dport28888-j DROP
/sbin/iptables -A INPUT -p tcp -s 1.22.10.21/32 --dport28888-j ACCEPT

注意所有用户的认证信息都保存在每一个数据库的 system.users 集合中。例如:在数据库 projectx 中(就是 use projectx 后)projectx.system.users 会保存所有用户的信息(这里的用户是数据库用户)。

在最初始的时候 mongodb 都默认有一个 admin 数据库(刚开始是空的),而 admin.system.users 中将会保存比在其它数据库中设置的用户权限跟大的用户信息。

注意:当 admin.system.users 中没有添加任一一个用户(即为空)时,即使 mongod 启动时添加了 --auth 参数,即使,在除 admin 数据库中添加了用户,此时不进行任何认证依然可以使用任何操作,直到知道你在 admin.system.users 中添加了一个用户。
如下分别创建两个用户:

在 projectx 中创建用户名为 user1 密码为 1resu 的用户,如下:

$ ./mongo>use projectx>db.addUser("user1","1resu");

在 admin 中创建用户名为 root 密码为 toor 的用户,如下:

$ ./mongo
>use admin
>db.addUser("root","toor");
>db.auth("root","toor");
1

^^^^ 如果认证成功会显示 1
^^^^ 用以下命令可以查看所有当前选择的数据库的用户信息

Centos5.5-64bit-IP=80:/tools/mongodb/mongodb1.8/bin#./mongo localhost:3306

MongoDB shell version: 1.8.0

connecting to: localhost:3306/test

> use admin;

switched to db admin

> db.system.users.find();

error: {

"$err" : "unauthorized db:admin lock type:-1 client:127.0.0.1",

"code" : 10057

}

> db.auth("kadmin", "kadmin");

1

> db.system.users.find();

{ "_id" : ObjectId("4d8d8ab69c6467b52026ae57"), "user" : "kadmin", "readOnly" : false, "pwd" : "2be6a622a0d0f69ac838db1fd0f2ece" }

> use hai;

switched to db hai

> db.system.users.find();

{ "_id" : ObjectId("4d8d8a7a9c6467b52026ae56"), "user" : "hairoot", "readOnly" : false, "pwd" : "3c5db163d5b5825573259bf0c7af84fb" }

>

>db.system.users.find();
{"_id": ObjectId("4d761dfc23e14f10be8563c5"),"user":"root","readOnly":false,"pwd":"6a921fa21bbcd22989efecbcb2340d17"}

$ ./mongo
>use projectx
switched to db dbtest
>db.aaaa.insert({aa:"xx"});
unauthorized

^^^^ 一旦在 admin 数据库中添加了用户,
^^^^ 那么对数据库的操作必须进行认证,否则提示 unauthorized

>db.auth("user1","1resu");
1
>db.aaaa.insert({aa:"xx"});
>db.aaaa.find();
{"_id": ObjectId("4d7628638e6ce2eb56b45a41"),"aa":"xx"}

^^^^ 进行用户认证后就可以插入数据了

>use projecty
switched to db projecty
>db.zzz.insert({aa:"xx"});
unauthorized

^^^^ 由于用户 user1 只作用于 projectx
^^^^ 并没有对 projecty 的操作权限
^^^^ 而我们却可以用 admin 库中的用户认证后进行创建,如下

>use admin
>db.auth("root","toor");
1
>use projecty
switched to db projecty
>db.zzz.insert({aa:"xx"});
>db.zzz.find();
{"_id": ObjectId("4d7628638e6ce2eb56b45a41"),"aa":"xx"}

^^^^ 用 admin 库中的用户认证后就可以创建另一个数据库了
^^^^ 所以说明 admin 数据库中的权限很大,如果没有指定 readonly 的话
^^^^ 它可以进行任何操作,很危险

>use projectx
>db.addUser("user2","2resu",true);
{
"user":"user2",
"readOnly":true,
"pwd":"471e31e021a3656044ef3487ea90e0cf"
}

^^^^ 当一 user2 用户认证时,user2 只能对 projectx 进行只读操作。

------------------------------------

1.指定服务端口
mongod --port 27017

2.限定IP(只允许特定IP访问)
mongod --bind_ip 127.0.0.1

3.用户验证模式(db层)
mongod --auth #启动时加上--auth参数

#use mydb
#db.auth(‘username‘,‘password‘)

注1:
全局数据库权限:在admin库里添加用户
> use admin
switched to db admin
> db.addUser(‘username‘,‘password‘)
{
"user" : "username",
"readOnly" : false,
"pwd" : "aa5469a39788b6c3988537cd409887a1"
}

特定某个数据库权限:
> use mydb
switched to db mydb
> db.addUser(‘username‘,‘password‘)
{
"user" : "username",
"readOnly" : false,
"pwd" : "aa5469a39788b6c3988537cd409887a1"
}

注2:
添加只读权限的用户
> db.addUser(‘username‘,‘password‘,true)
{
"user" : "username",
"readOnly" : true,
"pwd" : "aa5469a39788b6c3988537cd409887a1"
}

  • 更多的安全考虑

    刚说了MongoDB的安全认证其实还是简陋的,所以我们还是有其他很多的安全考虑。
    1.比如说MongoDB传输协议是不加密的,如果需要加密的话,我们可以考虑使用ssh隧道或是他们的技术来对客户端和服务端之间的通讯进行加密。
    2.将MongoDB部署在只有客户端服务器才能访问到的环境,比如内网,vpn网络中,可以使用 bind_ip = 本机或内网 。
    3.如果确实需要将MongoDB暴露在外部环境可以考虑使用IPTABLES等技术进行访问限制

MongoDB的安全性

时间: 2024-10-07 05:29:53

MongoDB的安全性的相关文章

MongoDB安全及身份认证

前面的话 本文将详细介绍MongoDB安全相关的内容 概述 MongoDB安全主要包括以下4个方面 1.物理隔离 系统不论设计的多么完善,在实施过程中,总会存在一些漏洞.如果能够把不安全的使用方与MongoDB数据库做物理上的隔离,即通过任何手段都不能连接到数据库,这是最安全的防护.但,通常这是不现实的.一些重要的数据可能会保存下来,放置到物理隔离的机房中 2.网络隔离 许多公司的开发机处于内网环境中.即使数据库存在漏洞,外部环境也没有机会利用,因为根本无法访问内网 3.防火墙隔离 可以利用防火

MONGODB全面总结

关于Mongodb的全面总结,学习mongodb的人,可以从这里开始! 分类:            MongoDB2013-06-08 09:5610213人阅读评论(0)收藏举报 目录(?)[+] BSON 效率 传输性 性能 写入协议 数据文件 名字空间和盘区 内存映射存储引擎 其他 MongoDB的架构 MongoDB的特点 MongoDB的功能 MongoDB的局限性与不足 适用范围 MongoDB的不适用范围 要点 MongoDB分布式复制 MongoDB语法与现有关系型数据库SQL

MongoDB核心贡献者:不是MongoDB不行,而是你不懂!

近期MongoDB在Hack News上是频繁中枪.许多人更是声称恨上了MongoDB,David mytton就在他的博客中揭露了MongoDB许多现存问题.然而恨的人有之偏爱的也同样很多,作为回击:Russell Smith带来了多年工作经验的总结.Russell Smith曾担任Ops和大型网站缩放顾问并且帮助过Guardian.Experian等多家公司,MongoDB London User Group的联合创始人.作为MongoDB Master(MongoDB官方认可的MongoD

MongoDB 应用二三事

最近,随着"大数据时代"的到来,NoSQL数据库作为数据库行业的后起之秀,在短短的几年之间,得到了迅猛的发展,而如今还大有取代RDBMS之势.在众多的NoSQL数据库中,名气最大的莫过于MongoDB了.MongoDB于2009年2月推出第一个版本,至今的5年多时间,其已经发展成为在DB Engine影响力排行世界第5位的数据库. MongoDB具有以下几个特点: 1)  非结构化的数据结构,保证了适应多种多样的数据类型和形式,无需预先设计数据结构和表模式. 2)  水平扩张,理论上是

MongoDB 进阶-关联查询

[苏州需要工作的加我QQ,内推介绍费平分] MongoDB 进阶 1.数据库命令 a.命令的工作原理 drop命令,在shell中删除一个集合,执行db.refactor.drop().其实这个函数实际运行的是drop命令, 可以用runCommand来达到一样的效果: db.runCommand({"drop":"refactor"}) {         "nIndexesWas" : 1,         "msg" :

mongoDB权威指南学习笔记

//mongoDB第1-3章节添加,修改,修改器的笔记: //备注:和MySQL查询一样,时刻想着优化查询数据的时间和性能 //db.help() //数据库帮助信息 //db.blog.help() //集合帮助信息 //db.c.find().help() //返回find()方法的子方法信息 //清空集合数据 //db.blog.remove() //插入信息 //db.blog.insert({'title' : 'bbbbb', 'content' : 'bfbfbf', 'hits'

MongoDB创建视图(十四)

国庆放大假,随手翻了一下娃的英语词汇题,看到了idea.opinion.view和thought四个选项,忽然就想到了MongoDB的新特性Read-Only View,所以就顺便推广一下. 记得MongoDB World上宣布MongoDB下一个版本3.4会带来很多为之眼前一亮的新特性,其中第一个就是View,所以国庆长假期间,我们就先睹为快吧! 出世 View这个词对专业人士来说不是很陌生,翻译一下就是"视图".在MongoDB之前的版本里面,如果要构造一个集合的子集,个人理解应该

MongoDB---前世今生

MongoDB的官方文档基本是how to do的介绍,而关于how it worked却少之又少,本人也刚买了<MongoDB TheDefinitive Guide>的影印版,还没来得及看,本文原作者将其书中一些关于MongoDB内部现实方面的一些知识介绍如下,值得一看. 今天下载了<MongoDB The Definitive Guide>电子版,浏览了里面的内容,还是挺丰富的.是官网文档实际应用方面的一个补充.和官方文档类似,介绍MongoDB的内部原理是少之又少,只有在附

提升 MongoDB 安全性的10个方法

MongoDB提供了一系列组件来提升数据的安全性.数据安全在MongoDB中是最重要的--因此它利用这些组件来减少曝光面.下面是10个可以用来改善你个人或云中MongoDB服务器安全的小提示. 1. 启用auth - 即使在可信赖网络中部署MongoDB服务器时启用auth也是项好的安全实践.当你的网络受攻击时它能够提供"深层防御".编辑配置文件来启用auth 1 auth = true 2.不要把生产环境的数据库暴露在Internet上-限制对数据库的物理访问是安全性的非常重要的一个