最近公司对项目安全方面的问题很是重视,进行了多次各种安全漏洞的扫描,于是乎就扫到了mongodb弱口令的问题。

在项目部署初期,因为大家对这个都不是特别重视,大概是因为觉得反正是内网项目吧,所以mongodb数据库的用户名和密码就都是admin。

这次扫到弱口令之后,要求解决这个问题,于是任务便分到了我的头上。

遵循强口令的标准,我把admin改成了由大写字母、小写字母、数字和特殊字符共同组成的密码,但是在更改的过程中却并不像想象的那么顺利,其中遇到的问题我称之为mongodb副本集密码的一些坑。

坑在哪里呢?首先是修改密码的过程,因为是副本集的缘故,所以理论上是更改数据的时候只需要更改主库就好,然后从库就会自动同步。

于是我便想到直接更改用户信息中的密码内容,但是密码信息是保存在db.system.users中,这个数据用户似乎是无权进行更改操作的。

虽然之前就知道这个权限的问题,但是我还是想试一下,毕竟之前我没有改过副本集的密码,也不确定究竟可不可行。

而尝试的结果证明这个内容确实是无权修改,我用db.system.users.update更改时,提示权限不足:

  1. WriteResult({
  2. "writeError" : {
  3. "code" : 13,
  4. "errmsg" : "notauthorized on admin to execute command { update: \"system.users\",updates: [ { q: { user: \"admin\" }, u: { $set: { pwd:\"123456\" } }, multi: false, upsert: false } ], ordered: true}"
  5. }
  6. })

于是我便想到,不如我把之前的用户删掉,然后再重新创建,这样的话总该没有问题了吧。但实际上我这样做的时候,当我删除了admin用户之后,再来createUser时,提示我用户验证不通过。

因为我之前只创建了这一个用户,因此便只好关闭了进程,然后都以不启动用户认证的方式启动mongodb,之后再次建立用户,这样操作之后终于成功换成新的密码。

在此之后,我突然想到是不是可以在两个用户的情况下用前边不成功的方法来修改密码呢?于是我就做了二次尝试,创建了两个用户。

然后我便发现果然如猜测的那样,当我用某个用户验证时,是可以删除另外一个并再次创建的,这个时候就不会像一个用户那样在删除后重建时,提示验证问题(当然了用户角色需要正确的选择)。

鉴于上边的内容,我想也完全可以有第三种做法,因为我是不改用户名的情况下操作,而如果连用户名和密码一起改,那么也就不用如此麻烦了,可以直接创建用户便好。

那么第二个坑就是,这个密码中的特殊字符似乎有一定的限制,我在命令行操作时没有任何问题,但是当我用spring中的代码连接时,直接启动就报错,提示”&”符有问题。

之前的spring连接mongodb的代码是这样:

  1. <mongo:mongo-client replica-set="192.168.91.27:27017" credentials="admin:admin@admin" id="mongo">
  2. <mongo:client-options write-concern="SAFE" connections-per-host="100"
  3. threads-allowed-to-block-for-connection-multiplier="50"
  4. />
  5. </mongo:mongo-client>

第二个admin代表密码,我把这个admin改成新的带有“&”的密码(例如“aaa&123$_”)便出了如下问题:

  1. org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import beandefinitions from relative location [spring-mongodb305.xml]
  2. Offending resource: class pathresource [spring.xml]; nested exception is org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 15 in XML document from class path resource[spring-mongodb305.xml] is invalid; nested exception is org.xml.sax.SAXParseException;lineNumber: 15; columnNumber: 102; 在实体引用中, 实体名称必须紧跟在 '&' 后面。
  3. atorg.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:70) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  4. at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  5. at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:76) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  6. atorg.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:274) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  7. at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(DefaultBeanDefinitionDocumentReader.java:199) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  8. atorg.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:184) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  9. atorg.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:141) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  10. atorg.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:110) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  11. at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  12. atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  13. atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:335) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  14. at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  15. atorg.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  16. atorg.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:216) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  17. at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  18. atorg.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125) ~[spring-web-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  19. atorg.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94) ~[spring-web-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  20. at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129) ~[spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  21. atorg.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:540) ~[spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  22. atorg.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:454) ~[spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  23. atorg.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:381) ~[spring-web-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  24. atorg.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:293) ~[spring-web-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  25. atorg.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) [spring-web-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  26. at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4994) [catalina.jar:7.0.57]
  27. at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5492) [catalina.jar:7.0.57]
  28. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:7.0.57]
  29. at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575) [catalina.jar:7.0.57]
  30. at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) [catalina.jar:7.0.57]
  31. at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_79]
  32. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_79]
  33. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_79]
  34. at java.lang.Thread.run(Thread.java:745) [na:1.7.0_79]
  35. Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 15 in XML document from class path resource[spring-mongodb305.xml] is invalid; nested exception isorg.xml.sax.SAXParseException; lineNumber: 15; columnNumber: 102; 在实体引用中, 实体名称必须紧跟在 '&' 后面。
  36. atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:398) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  37. atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:335) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  38. atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  39. atorg.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:258) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  40. ... 28 common frames omitted
  41. Caused by: org.xml.sax.SAXParseException: 在实体引用中, 实体名称必须紧跟在 '&' 后面。
  42. at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198) ~[na:1.7.0_79]
  43. atcom.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177) ~[na:1.7.0_79]
  44. at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441) ~[na:1.7.0_79]
  45. atcom.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368) ~[na:1.7.0_79]
  46. atcom.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1436) ~[na:1.7.0_79]
  47. atcom.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(XMLScanner.java:885) ~[na:1.7.0_79]
  48. atcom.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(XMLNSDocumentScannerImpl.java:439) ~[na:1.7.0_79]
  49. atcom.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:255) ~[na:1.7.0_79]
  50. atcom.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2786) ~[na:1.7.0_79]
  51. atcom.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) ~[na:1.7.0_79]
  52. atcom.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117) ~[na:1.7.0_79]
  53. atcom.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) ~[na:1.7.0_79]
  54. at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) ~[na:1.7.0_79]
  55. atcom.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) ~[na:1.7.0_79]
  56. at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) ~[na:1.7.0_79]
  57. at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243) ~[na:1.7.0_79]
  58. atcom.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:347) ~[na:1.7.0_79]
  59. atorg.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:76) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  60. atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadDocument(XmlBeanDefinitionReader.java:428) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  61. atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
  62. ...31 common frames omitted

于是我只好把密码中的”&”去掉,换成其他特殊字符,重新更改了数据库中的用户密码,然后再次启动时一切便正常了。

当然了,这样改了问题是暂时解决了,项目也正常的运行起来,但是我却没有弄明白为什么要这样改,于是之后一顿百度后,我发现原来根源的问题并不是mongodb密码的问题,而是xml的问题。

在xml中&有特殊的含义,因此要么不用,要么就要使用&amp代替,原来如此,这个坑实际上是因为自己知识了解的不够多以及一时间考虑的问题不够,而后自己坑了自己。

这样一来也就解释了我心中的另一个疑惑,那就是为什么写在properties中的带“&”的密码就没问题,直接写在xml中就有问题。

修改mongodb3.0副本集用户密码遇到的坑的更多相关文章

  1. mongodb3.0副本集搭建补充~~非admin数据库的用户权限

    之前有搭建mongodb3.0的副本集,不过当时直接使用的admin数据库,用户也是直接给的root. 链接:http://blog.csdn.net/tuzongxun/article/detail ...

  2. mongodb3.2副本集配置

    网上的资料太乱了,等弄好了再看官网才发现官网写的最清晰和简洁 推荐官网的副本集配置:https://docs.mongodb.com/manual/tutorial/deploy-replica-se ...

  3. mongodb副本集用户权限设置

     mongodb副本集用户权限设置  用户权限参考文章 一:先看看MongoDB中用户的角色说明 read :   数据库的只读权限,包括: aggregate,checkShardingIndex, ...

  4. gitlab修改(重置)root用户密码

    gitlab修改(重置)root用户密码 1.使用root权限登录到服务器. 2.使用以下命令启动控制台:  gitlab-rails console production 该命令有时候启动比较慢,需 ...

  5. mongodb 4.0副本集搭建

    近期有同学问mongodb副本集难不难部署,我的回答是不难,很快,几分钟搞定,比mysql MHA简单的不止一点半点. 那么到底如何部署呢?请看下文. 1.  准备工作 1.1 下载软件 选择版本并下 ...

  6. MongoDB3.0.x版本用户授权配置(单机环境)

    MongoDB数据库默认情况下是没有做权限控制的,只要能够连接所开放的端口就能进行访问,而且拥有root级别的权限:对于生产环境而言是极不安全的,所以需要建立用户,进行授权控制. 单机环境下的用户授权 ...

  7. mongodb3.6 副本集(三)mongodb 如何做数据备灾

    前言 个人理解,副本集一个主要作用就是当Master库出现故障,其中的一个salve从库会被选举出来成为新的Master.框架图如下: 其中,选举者是不参与数据存储的,它的作用只是为了选举出新的Mas ...

  8. Mongodb4.0副本集构建

    目前最新的mongodb4.0.2已经支持事务这个重要特性,需要使用的话必须是复制或副本集,这是第一篇先研发如何构建副本集,因为副本集是目前最低成本的高可用群集方式. 1.准备三台服务器,本次使用是的 ...

  9. Mac端解决(含修改8.0.13版的密码):Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

    1. 安装mysql但是从来没启动过,今天一启动就报错: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2 ...

随机推荐

  1. JVM实用参数——新生代垃圾回收

    JVM实用参数目录 JVM实用参数——新生代垃圾回收 概述 第1部分  新生代垃圾回收介绍 第2部分 参数介绍 参考 第1部分  新生代垃圾回收介绍 本部分,我们将关注堆(heap) 中一个主要区域, ...

  2. Java:多线程<四> Lock、停止线程、守护线程、join、优先级&yield

    Java1.5以后,Condition将Object监视器方法(wait, notify, notifyAll)分解成截然不同的对象,以便通过这些对象与任意Lock实现组合使用为每个对像提供多个等待s ...

  3. 【C语言学习】-06 函数

    函数分类.函数声明和定义.函数调用,形参实参.函数嵌套调用

  4. java中判断一个字符串是否“都为数字”和“是否包含数字”和“截取数字”

    在javascript中有一个方法isDigit()使用来判断一个字符串是否都是数字,在java的字符串处理方法中没有这样的方法,觉得常常需要用到,于是上网搜了一下,整理出了两个用正则表达式匹配的判断 ...

  5. 在Eclipse上建立hadoop2.2.0/hadoop2.4.0源代码阅读环境

    1.安装依赖的包: yum install gcc-c++ g++ autoconf automake libtool cmake zlib1g-dev pkg-config libssl-dev 2 ...

  6. sql整型字段模糊查询

    select count(*) cnt from vhuiy where CAST(id as text) like'%12%'--id为int类型 更详细的链接:http://www.studyof ...

  7. 使用python-openCV对摄像头捕捉的镜头进行二值化并打上文字

    用CaptureFromCAM函数对图像进行提取: capture = cv.CaptureFromCAM(0) 读取直接的视频文件只需将语句改变为: capture = cv.VideoCaptur ...

  8. android基础(二)Broadcast Receiver知识

    1.广播的注册 (1)动态广播注册: 优点:可以灵活控制广播的注册与撤销 缺点:必须在程序启动时才能接收广播 IntentFilter :当Intent在组建之间传递时,组件想告诉android系统自 ...

  9. Linux的yum源的配置

    yum实际上是管理的rpm软件包 只要连接网络就可以使用在线的yum源,不用配置本地yum源 网络yum源/etc/yum.repos.d/fedora.repo(Fedora)[fedora]nam ...

  10. GCD线程间通信

    从子线程回到主线程 dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{     // 执 ...