MongoDB身份验证

我最近更新了Mongometer ,使其更加灵活。 发布新版本后不久,其中一位用户通过在帖子中发表评论来反馈问题。 我启动了我的机器,打开了我的IDE,发现了问题,并在半小时内将修复程序推送到了github 。 这不是快速的成功案例。 我很快就意识到,如果将来我要使用Mongometer做任何事情,我真的应该对用户如何对MongoDB中的数据库进行身份验证有更多的了解。 (我不想花一个多小时左右,因为我刚刚打开了一瓶Nyetimber Classic Cuvee –我也正在煮鸡肉派(如果需要的话可以给我盖上锅),我而不是在完成瓶子之前完成这篇文章。)在深入探讨MongoDB Security可能存在的任何文档之前,我将从一些观察开始。
因此,以典型的男人风格,让我们踢一下轮胎,然后如果需要,再踢RTFM。 启动一个mongod实例。

$ /usr/lib/mongodb/2.3.2/bin/mongod --port 27001 --fork --dbpath /data/db/2.3.2 --logpath /data/db/2.3.2/mongod.log
$ ./mongo --port 27001

创建一个管理员用户

> use admin
> db.addUser('mongouser','mongopass')
1

重新启动mongod

$ sudo kill -15 $(ps -ef | grep mongo | grep -v grep | cut -f8 -d' ')
$ /usr/lib/mongodb/2.3.2/bin/mongod --port 27001 --fork --auth --dbpath /data/db/2.3.2 --logpath /data/db/2.3.2/mongod.log
$ ./mongo --port 27001

验证给管理员

> use admin
switched to db admin
> db.aut('mongouser','mongopass')
Thu Jan 31 13:53:31.271 javascript execution failed (shell):1 TypeError: Property 'aut' of object admin is not a function
db.aut('mongouser','mongopass')
^
> db.aut('mongouser','mongopass')

哎呀 胖手指吧。 等等,我认为我发现了问题1

第1期

如果管理员用户输入的auth命令不是凭据,而不是凭据,那么实际的凭据将保留在Shell历史记录中,该历史记录将在各个会话之间持续存在。 任何其他用户都可能会来查看Shell历史记录并获取凭据。

另一方面,如果命令正确并且用户名或密码或两者都不正确,或者确实进行了身份验证尝试,则该命令不会保留在历史记录中。 (可使用与Linux框相同的方式使用mongo shell的命令历史记录-使用向上箭头)

> db.auth('mongouser','mongopass0')
{ ok: 0.0, errmsg: 'auth fails' }
0
> db.auth('mongouser0','mongopass0')
{ ok: 0.0, errmsg: 'auth fails' }
0
> db.auth('mongouser0','mongopass')
{ ok: 0.0, errmsg: 'auth fails' }
0

好。 让我们针对管理员进行身份验证并继续。

> use admin
switched to db admin
> db.auth('mongouser','mongopass')
1

哎呀 我差点错过那里。

第2期

在mongod实例重新启动之前,任何用户都可以…

> use admin
switched to db admin
> db.system.users.find()
{ '_id' : ObjectId('510a58c6de50e136190f9ed7'), 'user' : 'mongouser', 'readOnly' : false, 'pwd' : 'c49caa1cb6b287ff6b1deaeeb8f4d149' }

…获取用户名和哈希。 因此,既然我已经重新启动了mongod实例,那么任何用户都将必须针对admin进行身份验证才能查看system.users的内容。 现在,继续输入不正确的凭据,我将发起字典攻击,看看会发生什么。 噢亲爱的。 发现了另一个问题。

问题#3

没有锁定。 我写了一个快速的技巧来连接到mongod实例,切换到admin并尝试登录。使用一个相当大的词典(最后加上'mongopass'),我尝试登录了一百万次。 这仅是一次粗略的单线程尝试,大约需要17秒才能完成,但是它表明没有帐户锁定。 我有信心,如果需要的话,我可以将多线程蛮力组合在一起。 我需要对此进行进一步研究,以查看是否可以配置任何强行强制/字典式攻击警报,或者是否可以应用锁定策略。 我还没有准备好RTFM。 让我们仔细看看system.users中的密码格式。

c49caa1cb6b287ff6b1deaeeb8f4d149

在我看来,这就像MD5 。 让我们看一下可在github上浏览的代码。 哇! 我很幸运。 db.js具有以下方法:

function _hashPassword(username, password) {
return hex_md5(username + ':mongo:' + password);
}

使用hex_md5然后在utils.cpp中引用native_hex_md5 :

void installGlobalUtils( Scope& scope ) {
scope.injectNative( 'hex_md5' , native_hex_md5 );
scope.injectNative( 'version' , native_version );
scope.injectNative( 'sleep' , native_sleep );
installBenchmarkSystem( scope );
}static BSONObj native_hex_md5( const BSONObj& args, void* data ) {
uassert( 10261, 'hex_md5 takes a single string argument -- hex_md5(string)',
args.nFields() == 1 && args.firstElement().type() == String );
const char * s = args.firstElement().valuestrsafe();md5digest d;
md5_state_t st;
md5_init(&st);
md5_append( &st , (const md5_byte_t*)s , strlen( s ) );
md5_finish(&st, d);return BSON( '' << digestToString( d ) );
}

是时候快速回顾一下了。 万一您错过任何东西:

  1. 哈希算法为MD5 ; 我最不喜欢的哈希算法。
  2. 要散列的字符串格式为username + ':mongo:' + password ; 使用相同的“盐”不是最佳选择…
  3. 字符串:mongo:是全局的; 我不太确定为什么它会一直存在。

我认为这可能现在就足够了,否则它将变成tl; dr,并且我可能会超出自我施加的时间限制。 回想我有关MongoDB的任何讨论,相同的陈述总是出现在安全性的背景下。

  1. 默认情况下,身份验证处于关闭状态。
  2. MongoDB始终旨在部署在受信任的环境中

我不得不说,即使启用了身份验证,我们仍然遇到一些棘手的问题。 此外,我认为不存在受信任的环境 。 此时,就安全性而言,是时候进行RTFM了。 我希望找到一个定义好的路线图,以解决上述问题,或者已经可以采取一些缓解措施。 因此,在不久的将来会有一些 身份验证功能。 看来新的身份验证功能仅在MongoDB Subscriber Edition下可用,我不确定这意味着什么……我也遇到了这个已知问题 ,它构成了……的基础。

问题#4

如果用户在多个数据库中具有相同的密码,则所有数据库上的哈希将相同。 恶意用户可能利用此漏洞使用不同用户的凭据来访问第二个数据库。 [原文]让我们分解一下。

“如果用户在多个数据库中具有相同的密码,则所有数据库上的哈希将相同。”

是。 正确。 相同的用户名,相同的密码和相同的“盐”(即“:mongo:”字符串”)等于相同的哈希。 好,很酷,让我们继续前进。

“恶意用户可能利用此漏洞使用不同用户的凭据来访问第二个数据库。” [原文]

恶意用户只有当在两个数据库中都拥有非只读用户时,才能利用此漏洞。

如果他们仅具有只读访问权限,则他们将无法列出system.users集合。 在这种情况下,他们将永远不会首先看到不同数据库之间的哈希值是相同的。 如果它们不是只读的,则可以列出system.users集合,并使散列的密码脱机破解。

总结来说,如果散列在数据库之间不匹配,您将不得不进入破解领域:

  1. 用户属性将是相同的。 在具有用户的不同数据库上,不同用户的几率可能很高。
  2. pwd属性将是相同的。 不同用户创建相同密码的几率很高。
  3. “盐”是相同的,因此在这里没有实际意义。

因此,这里的问题是用户(不是只读用户)可以提取给定数据库的所有密码哈希,然后将其脱机以进行破解。 恶意用户已经具有用户名和“盐”,他们所需要寻找的只是密码。

结论

第1期

这有点令人难过。 正确输入命令后(忽略凭据是否正确),命令不会显示在历史记录中。 如果未正确输入命令,则很难知道要从命令历史记录中排除的内容。 我猜您可以追溯删除导致身份验证之前导致错误的命令(即无效命令)。 那不是解决方案……

第2期

可能存在一个论点,即在admin数据库的system.users中创建了admin用户后,应强制重新启动。

问题#3

不费吹灰之力。 我已经多次编写了密码策略(我过着什么样的生活,是吗?),帐户锁定是密码101。

问题#4

似乎为每个数据库创建一个“盐”(':mongo:')可以解决此问题。 看一下代码,看起来实现是轻而易举的事,是一次轻松快捷的胜利。 添加选项以手动设置它将会很盛大。 在幕后实施一个独特的“盐”,使用户不必考虑它,同样是宏伟的。 这样,Nyetimber完成了,发布完成了。 我并不是说这篇文章中有什么新的或聪明的地方,这只是粗略的浏览。 我没有去; 我提到的一切只是观察。 我几乎每天都安装mongo,因为它是一个很棒的产品,但是我确实喜欢拥有平衡的视野并识别房间中的任何大象。 我会对任何反馈感兴趣。

参考:来自我们的JCG合作伙伴 Jan Ettles的MongoDB身份验证 ,位于ExceptionalExceptions例外博客。

翻译自: https://www.javacodegeeks.com/2013/02/mongodb-authentication.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang ffmpeg 做网络直播

最近在公司做在线视频转码的工作&#xff0c;研究了下ffmpeg 最后直接研究了下网络直播&#xff0c;我是在我自己的mac 上面测试的&#xff0c;效果&#xff0c;还可以&#xff0c;先看看效果图吧 ffmpeg 我是通过brew安装 的&#xff0c;这步就略了 VLC这个播放器怎么安装的也…

androidstudio带pom的上传到jcenter_输送机@网带输送机@304网带输送机@304不锈钢网带输送机@输送机网带厂家定制...

输送机网带输送机食品网带输送机304网带输送机304不锈钢网带输送机输送机网带厂家定制输送机主要用于运输食品原料或成品。食品输送机根据输送带不同可分为皮带的&#xff0c;链板的&#xff0c;网带的。输送形式有&#xff1a;直行的&#xff0c;爬坡提升的&#xff0c;清洗的…

box-sizing -- 盒模型

项目开发中&#xff0c;在浏览同事的代码&#xff0c;发现他经常用一个属性--box-sizing&#xff0c;很好奇是什么&#xff0c;于是乎&#xff0c;上网查阅资料学了起来。  首先我们先复习一下盒模型的组成&#xff1a;一个div通常由 content(内容) margin padding border组成…

有温度传感器的风机控制系统C语言,毕业论文--基于单片机的工业风机控制器设计与实现.doc...

大连东软信息学院本科毕业设计(论文)论文题目论文题目&#xff1a;基于单片机的工业风机控制器设计与实现系 所&#xff1a;电子工程系专 业&#xff1a;电子信息工程(嵌入式系统工程方向)学生姓名&#xff1a;学生学号&#xff1a;指导教师&#xff1a;导师职称&#xff1a;讲…

JAXB和java.util.Map

具有讽刺意味的是&#xff0c;可能很难在JAXB&#xff08;JSR-222&#xff09;中映射java.util.Map类&#xff1f; 在这篇文章中&#xff0c;我将介绍一些使其变得更容易的项目。 Java模型 以下是我们将用于此示例的Java模型。 顾客 Customer类具有Map类型的属性。 我之所以…

转载大神的一篇文章----【如何选择开源许可证?】

原文地址&#xff1a;http://www.ruanyifeng.com/blog/2011/05/how_to_choose_free_software_licenses.html 如何为代码选择开源许可证&#xff0c;这是一个问题。 世界上的开源许可证&#xff0c;大概有上百种。很少有人搞得清楚它们的区别。即使在最流行的六种----GPL、BSD、…

教你如何用 lib-flexible 实现移动端H5页面适配

前话 好久没写教程了&#xff08;可能会误导新手的菜鸟教程(&#xffe3;▽&#xffe3;)"&#xff09;。 这是我的github&#xff0c;欢迎前端大大们和我一起学习交流 https://github.com/pwcong 最近入职公司做前端实习&#xff0c;这几个星期来学到了移动端H5页面适配…

使用GlassFish 3.1.2.2和Primefaces 3.4的JDBC领域和基于表单的身份验证

我的博客上最受欢迎的帖子之一是有关JDBC安全领域和带有Primefaces的GlassFish上基于表单的身份验证的简短教程。 在收到有关它不再适用于最新的GlassFish 3.1.2.2的评论后&#xff0c;我认为可能是时候重新访问它并提出更新的版本了。 开始了&#xff1a; 制备 就像在原始教程…

thinkcmf常用标签

1、图片地址&#xff1a;{:cmf_get_image_url($vo.icon)} 2、模板控件 模板变量调用&#xff1a;$theme_vars.title <widget name"aboutUs">{$widget.title} //控件标题 {$widget.vars.subTitle} //控件变量 subTitle {:nl2br($widget.vars.content)} //输…

esplise自定义快捷代码补全_【Eclipse】_Eclipse自动补全增强方法 常用快捷键

一&#xff0c;Eclipse自动补全增强方法在Eclipse中&#xff0c;从Window -> preferences -> Java -> Editor -> Content assist -> Auto-Activation下&#xff0c;我们可以在"."号后面加入我们需要自动提示的首字幕&#xff0c;比如"abc"&…

ubuntu下docker安装,配置python运行环境

参考自: 1.最详细ubuntu安装docker教程 2.使用docker搭建python环境 首先假设已经安装了docker&#xff0c;卸载原来的docker 在命令行中运行&#xff1a; sudo apt-get updatesudo apt-get remove docker docker-engine docker.io containerd runc 安装docker依赖 apt-get…

android前置拍照镜像代码,从Android的前置摄像头拍摄的镜像翻转视频

我有一个能够拍摄图像和录制视频的摄像头应用程序。但是&#xff0c;当从设备前置摄像头捕捉图像或录制视频时&#xff0c;结果会翻转&#xff0c;就像您在看镜子一样。我想再次翻转&#xff0c;所以看起来很正常。我设法与图像要做到这一点&#xff0c;通过使用Matrix翻转Bitm…

python 打造一个sql注入脚本 (一)

0x00前言&#xff1a; 昨天刚刚看完小迪老师的sql注入篇的第一章 所以有了新的笔记。 0x01笔记&#xff1a; sql注入原理&#xff1a; 网站数据传输中&#xff0c;接受变量传递的值未进行过滤&#xff0c;导致直接带入数据库查询执行的操作。 sql注入对渗透的作用&#xff1a; …

文档声明和HTML样式表

文档声明 不是注释也不是元素&#xff0c;总是在HTML的第一行 书写格式&#xff1a;<!DOCTYPE HTML> 是用于通知浏览器目前文档正使用哪一个HTML版本&#xff08;相关属性 lang&#xff09; 若不写文档声明&#xff0c;浏览器渲染页面时会进入怪异模式 HTML元素又叫根元素…

JSF –渴望的CDI bean

每个人都知道JSF 2中热切的托管bean。 ManagedBean具有eager属性。 如果eager true并且范围是application&#xff0c;那么必须在应用程序启动时而不是在第一次引用该bean时创建此bean。 当您要在应用程序启动期间加载应用程序范围的数据&#xff08;例如&#xff0c;菜单的某些…

mybatis添加方法可以传map吗_Mybatis中传递多个参数的4种方法总结

前言现在大多项目都是使用Mybatis了&#xff0c;但也有些公司使用Hibernate。使用Mybatis最大的特性就是sql需要自己写&#xff0c;而写sql就需要传递多个参数。面对各种复杂的业务场景&#xff0c;传递参数也是一种学问。下面给大家总结了以下几种多参数传递的方法。方法1&…

java面向对象(五)之多态

多态 面向对象编程有三大特性&#xff1a;封装、继承、多态。 封装隐藏了类的内部实现机制&#xff0c;可以在不影响使用的情况下改变类的内部结构&#xff0c;同时也保护了数据。对外界而已它的内部细节是隐藏的&#xff0c;暴露给外界的只是它的访问方法。 继承是为了重用父类…

android最新知识点总结,学习android之 知识点总结

开发andorid程序必备&#xff1a;Eclipse 3.5以上版本SDK类似于java中的jdk。Adt 是开发Eclipe上的一个插件。组件使用&#xff1a;TestView:为文本设置超链接,需设置该属性andorid:autoLink”all”&#xff0c; 具体如下&#xff1a;android:id"id/myTxtView01"andr…

如何给VirtualBox虚拟机的ubuntu LVM分区扩容

我在VirtualBox安装的ubuntu里安装Cloud Foundry时遇到错误信息&#xff0c;磁盘空间不够了&#xff1a; 使用这三个命令做了清理之后&#xff0c;结果依然不够理想&#xff1a; (1) sudo apt-get autoclean&#xff08;已卸载软件的安装包&#xff09; (2) sudo apt-get clean…

您好GroovyFX

GroovyFX汇集了我最喜欢的两件事&#xff1a; Groovy和JavaFX 。 GroovyFX项目主页面将GroovyFX描述为“ [为JavaFX 2.0提供Groovy绑定”。 该页面上进一步描述了GroovyFX&#xff1a; GroovyFX是一个API&#xff0c;它使在Groovy中使用JavaFX变得更加简单和自然。 GroovyFX专…