修改mongodb3.0副本集用户密码遇到的坑

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

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

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

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

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

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

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

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

[javascript] view plain copy

  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的代码是这样:

[html] view plain copy

  1. <mongo:mongo-client replica-set="192.168.91.27:27017" credentials="admin:[email protected]" 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$_”)便出了如下问题:

[java] view plain copy

  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中就有问题。

时间: 2024-12-17 07:59:24

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

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

之前有搭建mongodb3.0的副本集,不过当时直接使用的admin数据库,用户也是直接给的root. 链接:http://blog.csdn.net/tuzongxun/article/details/51723259 最近想要把数据移到非admin数据库上,便重新以非admin库创建用户,过程大致和之前的一样,但创建用户的时候还是遇到了一些问题,主要是在用户角色和权限上. 我搭建过程中参考了下边的用户权限相关的博客: http://blog.csdn.net/tuzongxun/articl

mongodb3.2副本集配置

网上的资料太乱了,等弄好了再看官网才发现官网写的最清晰和简洁 推荐官网的副本集配置:https://docs.mongodb.com/manual/tutorial/deploy-replica-set/ 引述大神一段总结:http://blog.csdn.net/huwei2003/article/details/40453223 从概念上说一下MongoDB副本集和主从复制的区别.其实副本集(Replica Set)是主从复制的高级形式.高级在哪里呢?主动复制实现了数据备份+读扩展,但是ma

mongodb3.X 副本集(集群)添加用户名认证

折腾好几天这个,由于工作问题,时间也比较散,今天终于抽空将其记录下来了,并且本地测试通过了得好了,废话不多说,下面就开始了, 首先需要搭建mongodb的副本集,再次,我的环境如下: centos 6.5 mongodb 3.2.11 mongdb下载地址:https://www.mongodb.com/download-center?jmp=nav#community 在此我们需要配置三个mong单节点,然后将其结合组成副本集, 安装路径/usr/local/mongd 三个mongdb分别占

Docker搭建MongoDB 4.0副本集

环境: 系统版本:CentOS 7.5 内核:4.18.7-1.el7.elrepo.x86_64 Docker-ce: 18.06 MongoDB: 4.0.3 宿主机IP:192.168.1.1 MongoDB1端口:30001 MongoDB2端口:30002 MongoDB3端口:30003 一.安装docker.docker-compose wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker

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

MongoDB数据库默认情况下是没有做权限控制的,只要能够连接所开放的端口就能进行访问,而且拥有root级别的权限:对于生产环境而言是极不安全的,所以需要建立用户,进行授权控制. 单机环境下的用户授权模块配置: MongoDB的社区版本中有两个模块可以控制用户的访问: --auth: 在mongod启动项中加入--auth,mongodb启动后,就可以完成授权模块的启用): PS:虽然auth模块启用后本机还能否登陆到数据库,但是不具备增删改查的权限了,所以启动auth模块之前就应该创建一个超级

MongoDB 3.0副本集搭建

环境配置 MongoDB安装 下载yum源配置 wget https://repo.mongodb.org/yum/redhat/mongodb-org-3.0.repo  mv mongodb-org-3.0.repo  /etc/yum.repos.d/ 安装mongodb yum -y install mongodb-org 修改mongodb配置文件 # 修改监听地址为0.0.0.0 net:   port: 27017   bindIp: 0.0.0.0 # 修改副本集配置 repli

mongodb3.6 副本集(三)假期第一天——第二篇文章 mongodb 如何做数据备灾

前言 个人理解,副本集一个主要作用就是当Master库出现故障,其中的一个salve从库会被选举出来成为新的Master.框架图如下: 其中,选举者是不参与数据存储的,它的作用只是为了选举出新的Master.当原Master恢复后,他也只会以从库salve身份加入到副本集中. 当然,我们也可以在恢复启动它的时候手动配置priority参数,让他成为Master. Demo 下面通过具体的例子说明. 首先在mongo目录下建立3个(一个作为master,一个作为从库,一个作为选举者,在实际项目中,

Mongodb4.0副本集构建

目前最新的mongodb4.0.2已经支持事务这个重要特性,需要使用的话必须是复制或副本集,这是第一篇先研发如何构建副本集,因为副本集是目前最低成本的高可用群集方式. 1.准备三台服务器,本次使用是的ubuntu16.04.分别在三台服务器执行如下安装指定,参考官方安装连接:https://docs.mongodb.com/master/tutorial/install-mongodb-on-ubuntu/?_ga=2.66639470.1117419885.1536141422-1139377

linux系统下修改mysql 数据库的root用户密码和开启远程用户

首先进入终端 1.输入以下命令显示mysql进程号 ps -A |grep -i mysql 2.输入以下命令kill掉上面显示的进程 kill -9 进程号1 进程号2 3.输入以下命令进入mysql安全模式 mysqld_safe --skip-grant-tables & 4.输入以下命令修改密码,注意末尾的分号必须有,每输入一行就回车 use mysql; update user set password = PASSWORD('你的密码') where user = 'root'; e