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身份验证

mongodb身份验证_MongoDB身份验证相关推荐

  1. 使用内存数据库的.NET Core 3.0中基于身份(Identity-Based)的身份验证

    目录 介绍 背景 先决条件 创建Web应用程序的步骤 第1步 第2步 第3步 第4步 第5步 第6步 运行您的应用程序 总结 下载源9.5 MB 介绍 身份验证是根据系统或用户的身份确定或给予其个人访 ...

  2. 人证核验一体如何验证考生身份对比

    考场上一直以来考生的身份验证是一个重要环节.目前大部分仍然使用的是人工比对照片.身份证.准考证等传统方式.人工肉眼识别方式往往存在效率低,易出错等现象.在一定程度上也是出现代考.替考等作弊现象屡禁不止 ...

  3. ltunes无法验证服务器,itunes无法验证服务器身份

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 当iTunes显示"无法验证服务器身份"时,请修改一下网络的IP地址或者DNS地址就能解决问题. iTunes ...

  4. 微信企业号用户验证php,身份验证

    身份验证 身份接口包含OAuth验证接口和userid与openid互换接口 OAuth验证接口 企业应用中的URL链接(包括自定义菜单或者消息中的链接),可以通过OAuth2.0验证接口来获取成员的 ...

  5. php ses 发送邮件,使用 Amazon SES API 和 AWS SDK for PHP 版本 3 验证电子邮件身份 - 适用于 PHP 的 AWS 开发工具包...

    AWS 文档中描述的 AWS 服务或功能可能因区域而异.要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门. 本文属于机器翻译版本.若本译文内容与英语原文存在差异,则一律以英文原文为准. 使用 ...

  6. Windows身份验证和混合验证的区别

    两个验证方式的不同主要集中在信任连接和非信任连接. windows 身份验证相对于混合模式更加安全,使用本连接模式时候,sql不判断sa密码,而仅根据用户的windows权限来进行身份验证,我们称为& ...

  7. java ladp用户认证_java – LDAP:如何使用连接详细信息验证用户身份

    我无法使用LDAP对用户进行身份验证.我有以下细节: URL=ldap://10.10.10.10:389 LDAP BASE:DC=lab2,DC=ins LDAP Bind Account: CN ...

  8. OWASP A7 Identification and Authentication Failures(身份识别和身份验证错误)

    Identification and Authentication Failures(身份识别和身份验证错误) 从 2017 的第二名下降到了 2021的第7名 我在 TOP1 中提出过水平越权和垂直 ...

  9. xp系统itunes无法验证服务器的身份,itunes无法验证服务器身份

    当iTunes显示"无法验证服务器身份"时,请修改一下网络的IP地址或者DNS地址就能解决问题. iTunes是一款供Mac和PC使用的一款免费数字媒体播放应用程序,能管理和播放数 ...

最新文章

  1. Python List extend()方法
  2. 世界上最遥远的距离(泰戈尔)
  3. 及时复盘的好处_该如何复盘 先来说说复盘的好处: 复盘的好处简直太多了!就像你学习一样有一个总结的过程,复盘的最直接好处就是增强你的“股感”!在股市... - 雪球...
  4. 腾讯互娱开源分布式开发框架 Pebble
  5. linux/unix下telnet提示Escape character is '^]'的意义
  6. mysql ,show slave status详解
  7. 朱松纯:从人工智能的角度解读《赤壁赋》兼谈“心”与“理”的平衡
  8. 【操作系统】结合哲学家进餐问题分析如何预防死锁
  9. 实验三 连续系统分析
  10. RTSP安防网络摄像头/海康大华硬盘录像机/NVR网页无插件低延时播放流媒体服务器EasyNVR页面显示网络请求失败问题
  11. react 使用 useEffect 及踩坑
  12. XXL-JOB核心源码解读及时间轮原理剖析
  13. 优易U盘加密软件(U盘加密精灵)与U盘加密器对比
  14. 视频教程-零基础JS入门系列课程(2)之JS语法基础精讲-JavaScript
  15. (第十五集——第2章)MySQL数据操作
  16. 清华计算机系2018录取分数线,清华大学2018年各省录取分数线
  17. 三菱、汇川plc用485通讯板和变频器通讯,实现正转、反转、运行过程改变频率实现调速
  18. 电容器的基本介绍大全
  19. 【CAD3D】0基础绘制立体模型
  20. 如何查找自己笔记本的产品密钥

热门文章

  1. 汇编语言(二十五)之成绩分段统计
  2. DevOps通用及版本控制面试题
  3. 头条面试题:请谈谈Redis 9种数据结构以及它们的内部编码实现
  4. java爬虫之基于httpclient的简单Demo(二)
  5. Oracle入门(十四.21)之创建DML触发器:第二部分
  6. Oracle入门(五D)之如何设置show parameter显示隐含参数
  7. mybatis和spring整合时这个报错,应该这样解决!
  8. 把本地文件上传到gitee
  9. ubuntu 13.04 mysql_Ubuntu13.04 下MySQL5.6安装过程
  10. HDU1231(最大连续子序列)