修改mongodb3.0副本集用户密码遇到的坑
最近公司对项目安全方面的问题很是重视,进行了多次各种安全漏洞的扫描,于是乎就扫到了mongodb弱口令的问题。
在项目部署初期,因为大家对这个都不是特别重视,大概是因为觉得反正是内网项目吧,所以mongodb数据库的用户名和密码就都是admin。
这次扫到弱口令之后,要求解决这个问题,于是任务便分到了我的头上。
遵循强口令的标准,我把admin改成了由大写字母、小写字母、数字和特殊字符共同组成的密码,但是在更改的过程中却并不像想象的那么顺利,其中遇到的问题我称之为mongodb副本集密码的一些坑。
坑在哪里呢?首先是修改密码的过程,因为是副本集的缘故,所以理论上是更改数据的时候只需要更改主库就好,然后从库就会自动同步。
于是我便想到直接更改用户信息中的密码内容,但是密码信息是保存在db.system.users中,这个数据用户似乎是无权进行更改操作的。
虽然之前就知道这个权限的问题,但是我还是想试一下,毕竟之前我没有改过副本集的密码,也不确定究竟可不可行。
而尝试的结果证明这个内容确实是无权修改,我用db.system.users.update更改时,提示权限不足:
- WriteResult({
- "writeError" : {
- "code" : 13,
- "errmsg" : "notauthorized on admin to execute command { update: \"system.users\",updates: [ { q: { user: \"admin\" }, u: { $set: { pwd:\"123456\" } }, multi: false, upsert: false } ], ordered: true}"
- }
- })
于是我便想到,不如我把之前的用户删掉,然后再重新创建,这样的话总该没有问题了吧。但实际上我这样做的时候,当我删除了admin用户之后,再来createUser时,提示我用户验证不通过。
因为我之前只创建了这一个用户,因此便只好关闭了进程,然后都以不启动用户认证的方式启动mongodb,之后再次建立用户,这样操作之后终于成功换成新的密码。
在此之后,我突然想到是不是可以在两个用户的情况下用前边不成功的方法来修改密码呢?于是我就做了二次尝试,创建了两个用户。
然后我便发现果然如猜测的那样,当我用某个用户验证时,是可以删除另外一个并再次创建的,这个时候就不会像一个用户那样在删除后重建时,提示验证问题(当然了用户角色需要正确的选择)。
鉴于上边的内容,我想也完全可以有第三种做法,因为我是不改用户名的情况下操作,而如果连用户名和密码一起改,那么也就不用如此麻烦了,可以直接创建用户便好。
那么第二个坑就是,这个密码中的特殊字符似乎有一定的限制,我在命令行操作时没有任何问题,但是当我用spring中的代码连接时,直接启动就报错,提示”&”符有问题。
之前的spring连接mongodb的代码是这样:
- <mongo:mongo-client replica-set="192.168.91.27:27017" credentials="admin:admin@admin" id="mongo">
- <mongo:client-options write-concern="SAFE" connections-per-host="100"
- threads-allowed-to-block-for-connection-multiplier="50"
- />
- </mongo:mongo-client>
第二个admin代表密码,我把这个admin改成新的带有“&”的密码(例如“aaa&123$_”)便出了如下问题:
- org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import beandefinitions from relative location [spring-mongodb305.xml]
- 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; 在实体引用中, 实体名称必须紧跟在 '&' 后面。
- atorg.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:70) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:76) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:274) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(DefaultBeanDefinitionDocumentReader.java:199) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:184) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:141) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:110) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:335) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:216) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125) ~[spring-web-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94) ~[spring-web-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129) ~[spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:540) ~[spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:454) ~[spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:381) ~[spring-web-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:293) ~[spring-web-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) [spring-web-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4994) [catalina.jar:7.0.57]
- at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5492) [catalina.jar:7.0.57]
- at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:7.0.57]
- at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575) [catalina.jar:7.0.57]
- at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) [catalina.jar:7.0.57]
- at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_79]
- at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_79]
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_79]
- at java.lang.Thread.run(Thread.java:745) [na:1.7.0_79]
- 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; 在实体引用中, 实体名称必须紧跟在 '&' 后面。
- atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:398) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:335) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:258) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- ... 28 common frames omitted
- Caused by: org.xml.sax.SAXParseException: 在实体引用中, 实体名称必须紧跟在 '&' 后面。
- at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198) ~[na:1.7.0_79]
- atcom.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177) ~[na:1.7.0_79]
- at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441) ~[na:1.7.0_79]
- atcom.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368) ~[na:1.7.0_79]
- atcom.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1436) ~[na:1.7.0_79]
- atcom.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(XMLScanner.java:885) ~[na:1.7.0_79]
- atcom.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(XMLNSDocumentScannerImpl.java:439) ~[na:1.7.0_79]
- atcom.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:255) ~[na:1.7.0_79]
- atcom.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2786) ~[na:1.7.0_79]
- atcom.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) ~[na:1.7.0_79]
- atcom.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117) ~[na:1.7.0_79]
- atcom.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) ~[na:1.7.0_79]
- at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) ~[na:1.7.0_79]
- atcom.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) ~[na:1.7.0_79]
- at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) ~[na:1.7.0_79]
- at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243) ~[na:1.7.0_79]
- atcom.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:347) ~[na:1.7.0_79]
- atorg.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:76) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadDocument(XmlBeanDefinitionReader.java:428) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- atorg.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390) ~[spring-beans-4.0.0.RELEASE.jar:4.0.0.RELEASE]
- ...31 common frames omitted
于是我只好把密码中的”&”去掉,换成其他特殊字符,重新更改了数据库中的用户密码,然后再次启动时一切便正常了。
当然了,这样改了问题是暂时解决了,项目也正常的运行起来,但是我却没有弄明白为什么要这样改,于是之后一顿百度后,我发现原来根源的问题并不是mongodb密码的问题,而是xml的问题。
在xml中&有特殊的含义,因此要么不用,要么就要使用&代替,原来如此,这个坑实际上是因为自己知识了解的不够多以及一时间考虑的问题不够,而后自己坑了自己。
这样一来也就解释了我心中的另一个疑惑,那就是为什么写在properties中的带“&”的密码就没问题,直接写在xml中就有问题。
修改mongodb3.0副本集用户密码遇到的坑的更多相关文章
- mongodb3.0副本集搭建补充~~非admin数据库的用户权限
之前有搭建mongodb3.0的副本集,不过当时直接使用的admin数据库,用户也是直接给的root. 链接:http://blog.csdn.net/tuzongxun/article/detail ...
- mongodb3.2副本集配置
网上的资料太乱了,等弄好了再看官网才发现官网写的最清晰和简洁 推荐官网的副本集配置:https://docs.mongodb.com/manual/tutorial/deploy-replica-se ...
- mongodb副本集用户权限设置
mongodb副本集用户权限设置 用户权限参考文章 一:先看看MongoDB中用户的角色说明 read : 数据库的只读权限,包括: aggregate,checkShardingIndex, ...
- gitlab修改(重置)root用户密码
gitlab修改(重置)root用户密码 1.使用root权限登录到服务器. 2.使用以下命令启动控制台: gitlab-rails console production 该命令有时候启动比较慢,需 ...
- mongodb 4.0副本集搭建
近期有同学问mongodb副本集难不难部署,我的回答是不难,很快,几分钟搞定,比mysql MHA简单的不止一点半点. 那么到底如何部署呢?请看下文. 1. 准备工作 1.1 下载软件 选择版本并下 ...
- MongoDB3.0.x版本用户授权配置(单机环境)
MongoDB数据库默认情况下是没有做权限控制的,只要能够连接所开放的端口就能进行访问,而且拥有root级别的权限:对于生产环境而言是极不安全的,所以需要建立用户,进行授权控制. 单机环境下的用户授权 ...
- mongodb3.6 副本集(三)mongodb 如何做数据备灾
前言 个人理解,副本集一个主要作用就是当Master库出现故障,其中的一个salve从库会被选举出来成为新的Master.框架图如下: 其中,选举者是不参与数据存储的,它的作用只是为了选举出新的Mas ...
- Mongodb4.0副本集构建
目前最新的mongodb4.0.2已经支持事务这个重要特性,需要使用的话必须是复制或副本集,这是第一篇先研发如何构建副本集,因为副本集是目前最低成本的高可用群集方式. 1.准备三台服务器,本次使用是的 ...
- 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 ...
随机推荐
- Minimum Path Sum [LeetCode]
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- TabControl控件的DrawItem事件怎么注册
只有DrawMode等于OwnerDrawFixed时,才会在绘制选项卡时发生DrawItem事件tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
- IT自学论坛
http://yun.baidu.com/share/home?uk=4113898546&view=share#category/type=0
- 【opencv学习笔记】SetImageROI函数设置ROI区域的作用及用法
虽然先前知道ROI区域是感兴趣区域,但是真正看到调用了OpenCV的cvSetImageROI函数时,并不知道它的作用,所以还是单独写了一段代码对这个函数进行探究. OpenCVchm文档中对cv ...
- iOS学习之应用数据存储1-属性列表、偏好设置、NSKeyedArchiver归档
iOS应用数据存储的常用方式(持久化方式) 属性列表(plist)归档(XML文件) Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core ...
- 搭建Tomcat6源代码阅读环境
目标:使用MyEclipse8.5阅读Tomcat6源码. 第一步:在MyEclipse8.5中集成SVN插件. 第二步:从地址http://svn.apache.org/repos/asf/tomc ...
- BZOJ 4034 BIT & Dfs序
调了恒久突然发现输出优化忘记带负号了.. 就是差分树状数组维护Dfs序即可. #include <iostream> #include <cstring> #include & ...
- codeforces 666A (DP)
题目链接:http://codeforces.com/problemset/problem/666/A 思路:dp[i][0]表示第a[i-1]~a[i]组成的字符串是否可行,dp[i][1]表示第a ...
- asp.net 动态添加自定义控件
前两天一直纠结asp.net动态添加控件后,后台获取不到控件的问题,查看了网上很多的回答,可能自己的理解有误或者自己所掌握的知识有限,都没有解决我遇到的问题,经过两天的研究,终于把问题解决了. 我这里 ...
- java 后台校验格式
package com.hengxin.qianee.utils; import java.net.InetAddress; public class RegexUtils { /** * 用户名是否 ...