mongodb身份验证_MongoDB身份验证

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身份验证 ,位于Exceptionalexception exceptions博客上。

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

mongodb身份验证

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

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

相关文章

mysql列类型

http://hi.baidu.com/b37798969/item/429fb25f838f1d3233e0a99b MySQL支持大量的列类型&#xff0c;它可以被分为3类&#xff1a;数字类型、日期和时间类型以及字符串(字符)类型。本节首先给出可用类型的一个概述&#xff0c;并且总结每个列类型的存储需求&#xff0c;然后提供…

Java13的API_JAVA基础--JAVA API常见对象(其他API)13

一、其他API1.System类system类中的方法和成员变量都是静态的&#xff0c; 不需要创建System对象就可以直接使用。1 /*2 * 演示System的使用3 */4 public classSystemDemo {5 public static voidmain(String[] args) {67 /*8 * System类中的静态成员变量&#xff1a; out 和 er…

适用于Java开发人员的Elasticsearch:简介

本文是我们学院课程的一部分&#xff0c;该课程的标题为Java开发人员的Elasticsearch教程 。 在本课程中&#xff0c;我们提供了一系列教程&#xff0c;以便您可以开发自己的基于Elasticsearch的应用程序。 我们涵盖了从安装和操作到Java API集成和报告的广泛主题。 通过我们简…

人民邮电出版社图灵公司的两本SQL Server 2005图书诚征译者

人民邮电出版社图灵公司介绍&#xff08;来自http://www.turingbook.com/&#xff09; 北京图灵文化发展有限公司成立于2005年6月&#xff0c;由人民邮电出版社投资控股&#xff0c;以策划出版高质量的科技书籍为核心业务&#xff0c;主要出版领域包括计算机、电子电气、数学统…

java容器类继承_JAVA容器 - weslie - OSCHINA - 中文开源技术交流社区

一、 数组1、数组是保存一组对象的最有效的方式。但数组有固定的尺寸而受限(p216)2、数组与其他种类的容器之间的区别有三方面&#xff1a;效率、类型和保存基本类型的能力。在Java中&#xff0c;数组是一种效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性…

前端通信

Node中的net模块提供的前端通信 H5提供的 webSocket 【 常用于 移动端 】pc端低版本浏览器使用 socket.io 通信- 服务端&#xff1a; 总的服务器 举例&#xff1a; 腾讯的qq服务器 1个整体- 客户端&#xff1a; 单个用户使用应用 举例&#xff1a; 每个人的qq 多个client.js 客…

java定位线程阻塞_Arthas - 定位 Java 性能问题原来这么简单

目录&#xff1a;一、Arthas 介绍二、Arthas 使用场景三、Arthas怎么使用四、Arthas 定位性能问题定位Java代码导致占用CPU高的问题线程死锁前言&#xff1a;在做性能测试的过程中&#xff0c;当遇到Java性能问题&#xff0c;比如CPU飙升&#xff0c;负载突高&#xff0c;内存溢…

SVN 本地文件锁/服务端文件锁清除步骤

1.本地文件锁&#xff0c;直接cleanup&#xff0c;cleanup界面选择break locks即可 2.服务端文件锁&#xff0c;本地文件右击没有release lock或者break lock的选项时 方法1&#xff1a;右键&#xff0c;svn选择browser repo&#xff0c;找到该文件&#xff0c;右击&#xff0c…

java 对象复活_Java对象复活

java 对象复活总览 收集覆盖了finalize&#xff08;&#xff09;的对象之后&#xff0c;将其添加到终结处理队列中&#xff0c;以在调用每个对象的finalize&#xff08;&#xff09;方法之后进行清理。 如果您复活了物体&#xff0c;会发生什么&#xff1f; 何时定案&#xff…

a b和c 15 java_1011. A+B和C (15)

给定区间[-231, 231]内的3个整数A、B和C&#xff0c;请判断AB是否大于C。输入格式&#xff1a;输入第1行给出正整数T(<10)&#xff0c;是测试用例的个数。随后给出T组测试用例&#xff0c;每组占一行&#xff0c;顺序给出A、B和C。整数间以空格分隔。输出格式&#xff1a;对…

深入浅出《设计模式》之工厂模式(C++)

前言 模式介绍 在之前简单工厂模式中&#xff0c;我们介绍了简单工厂模式的缺陷是违背了开放-封闭原则。如果在面馆中添加了烤海参&#xff0c;那将会修改waiter工厂类。违背了类内封闭原则。 还以面馆为例&#xff0c;现在两种面&#xff0c;用一个服务员来卖就可以&#xff0…

当心Spring缓慢的事务回调

TL; DR 如果您的应用程序无法获得新的数据库连接&#xff0c;则重新启动ActiveMQ代理可能会有所帮助。 有兴趣吗 性能问题 几个月前&#xff0c;我们经历了生产中断。 大家都很熟悉&#xff0c;许多请求都失败了&#xff1a; java.sql.SQLTransientConnectionException: Hika…

jmeter学习笔记(八-1)

Jmeter中有较多需要参数化测试的地方&#xff1a; 1.从一个用户登录的接口获取登录后的token值&#xff0c;取值后用于后续接口调用 2.获取用户浏览后的cookies信息&#xff0c;需要用到HTTP Cookie 管理器来为同一线程组提供通用的cookies信息 Jmeter中通过${}形式来取参数值 …

python 对象转dict_如何将python dict对象转换为java等效对象?

总是有jython。这里有一点来自this article&#xff0c;它提供了python/java的良好并排视图The Jython analogues to Javascollection classes are much moretightly integrated into the corelanguage, allowing for more concisedescriptions and useful functionality.For e…

NOIP模拟测试5「星际旅行·砍树·超级树」

星际旅行 0分 瞬间爆炸。 考试的时候觉得这个题怎么这么难&#xff0c; 打个dp&#xff0c;可以被儿子贡献&#xff0c;可以被父亲贡献&#xff0c;还有自环&#xff0c;叶子节点连边可以贡献&#xff0c;非叶子也可以贡献&#xff0c;自环可以跑一回&#xff0c;自环可以跑两回…

学java选i5还是i7_选笔记本电脑,到底CPU是要选i5还是i7

又到了一年毕业季&#xff0c;准备上大学的学生们肯定是摩拳擦掌&#xff0c;准备入手一台新的笔记本电脑。而我们在选购笔记本电脑的时候&#xff0c;经常会遇到不同的配置&#xff0c;比如说同一台笔记本电脑会有i5以及i7两个处理器可供选择&#xff0c;而价格往往相差一两千…

apache apollo_Apache Apollo REST API

apache apolloApache Apollo是新一代&#xff0c;高性能&#xff0c;多协议的消息传递代理&#xff0c;它是从头开始构建的&#xff0c;可以替代ActiveMQ5.x。 我过去曾在博客上发表过文章 &#xff08;第一部分已经与第二部分一起发布了&#xff09;。 Apollo的无阻塞异步体系…

Node 之 模块加载原理与加载方式

Node.js中的模块可以分为原生模块和文件模块&#xff0c;通过Node.js中可以通过require方法导入模块、exports方法导出模块。 1、require导入模块 对于原生模块&#xff08;比如说&#xff1a;http&#xff09;&#xff0c;只需要使用require&#xff08;‘http’&#xff09;导…

php excel 下拉菜单,使用 PHPExcel 遇到的一个问题:下拉列表的数据来源过长时,显示了别的正常的下拉列表的数据来源...

遇到的问题&#xff1a;我们还是先来看手册是怎么说的&#xff1a;It is important to remember that any string participating in an Excel formula is allowed to be maximum 255 characters (not bytes).当下拉列表的数据来源过长(more than 255 characters)时&#xff0c;…

有效的Java –创建和销毁对象

创建和销毁对象&#xff08;第2章&#xff09; 这是Joshua Blochs的《 有效的Java》第2章的简短摘要。我仅包括与自己相关的项目。 静态工厂&#xff08;项目1&#xff09; 静态工厂与构造函数的一些优点&#xff1a; 工厂方法的名称为构造函数添加了描述 他们可以返回预先构…