原文地址:https://blog.csdn.net/uncle_david/article/details/78713551

对于搭建好的mongodb副本集加分片集群,为了安全,启动安全认证,使用账号密码登录。

默认的mongodb是不设置认证的。只要ip和端口正确就能连接,这样是不安全的。mongodb官网上也说,为了能保障mongodb的安全可以做以下几个步骤:

1、使用新的端口,默认的27017端口如果一旦知道了ip就能连接上,不太安全

2、设置mongodb的网络环境,最好将mongodb部署到公司服务器内网,这样外网是访问不到的。公司内部访问使用vpn等

3、开启安全认证。认证要同时设置服务器之间的内部认证方式,同时要设置客户端连接到集群的账号密码认证方式

环境准备
最简单的集群是3*3,即三个分片和三个副本集,可以保证高可用,即使一台机器全宕机了,服务仍然能够正常访问。

mongodb版本:mongodb-linux-x86_64-rhel70-3.4.9.tgz

操作系统:centos7

三台服务器:10.12.40.82,10.12.40.83,10.12.40.86

mongodb副本集加分片集群搭建

10.12.40.82 10.12.40.83 10.12.40.86
mongos: mongos: mongos:
config server: config server: config server:
shard server1 主节点: shard server1从节点: shard server1 仲裁节点:
shard server2从节点: shard server2仲裁节点: shard server2主节点:
shard server3仲裁节点: shard server3主节点: shard server3从节点:

红色部分为各个节点的端口号。

对副本集执行访问控制需要配置两个方面:

1、副本集和共享集群的各个节点成员之间使用内部身份验证,可以使用密钥文件或x.509证书。密钥文件比较简单,本文介绍的也是使用密钥文件,官方推荐如果是测试环境可以使用密钥文件,但是正是环境,官方推荐x.509证书。原理就是,集群中每一个实例彼此连接的时候都检验彼此使用的证书的内容是否相同。只有证书相同的实例彼此才可以访问

2、使用客户端连接到mongodb集群时,开启访问授权。对于集群外部的访问。如通过可视化客户端,或者通过代码连接的时候,需要开启授权。

下面开始详细说明:

1、生成密钥文件。
    1.1在keyfile身份验证中,副本集中的每个mongod实例都使用keyfile的内容作为共享密码,只有具有正确密钥文件的mongod或者mongos实例可以连接到副本集。密钥文件的内容必须在6到1024个字符之间,并且在unix/linux系统中文件所有者必须有对文件至少有读的权限。

1.2可以用任何方式生成密钥文件例如:

openssl rand -base64  > /data/mongodb/testKeyFile.file
chmod /data/mongodb/keyfile/testKeyFile.file

第一条命令是生成密钥文件,第二条命令是使用chmod更改文件权限,为文件所有者提供读权限
2、将密钥复制到集群中的每台机器(82,83,86)的指定位置

如:scp -P22 /data/mongodb/testKeyFile.file root@10.12.40.86:/data/mongodb

2.1一定要保证密钥文件一致。文件位置随便。但是为了方便查找,建议每台机器都放到一个固定的位置。我的配置文件都放在/data/mongodb/testKeyFile.file

3、预先创建好一个管理员账号和密码然后将集群中的所有mongod和mongos全部关闭
账号可以在集群认开启认证以后添加。但是那时候添加比较谨慎。只能添加一次,如果忘记了就无法再连接到集群。建议在没开启集群认证的时候先添加好管理员用户名和密码然后再开启认证再重启

连接任意一台机器的mongos

mongo --port 

添加用户

use admin //注意一定要使用admin数据库
db.createUser(
{
user:"your account",
pwd:"your password",
roles:[{role:"root",db:"admin"}]
}
) 然后依次连接到每一台机器上执行。 killall mongod
killall mongos

然后删除每个mongod实例存储数据存储路径下面的mongod.lock(如果后面启动不报错可以不处理)
  3.1可以发现。集群多少有的节点都关闭了。没开启认证的集群如果开启认证需要集群宕机几分钟。当然也有热启动的方式,官方文档中有介绍

说明:可以先开启认证重启后再添加用户。但是只能在admin库添加一次,所以如果忘记了,或者权限分配不恰当就无法再更改,所以建议先添加用户再开启认证重启,并且集群不建议在每个单节点添加用户,并且建议单节点关闭初始添加账号的权限,详情见enableLocalhostAuthBypass)

4、使用访问控制强制重新启动复制集的每个成员**** 
    这个步骤比较重要。设置访问控制有两种方式。我选择在配置文件里面配置好。(也可以在启动命令时使用命令来指定)

4.1依次在每台机器上的mongod(注意是所有的mongod不是mongos)的配置文件中加入下面一段配置。如我在10.12.40.83上的config server,shard1,shard2,shard3都加入下面的配置文件

security:
keyFile: /data/mongodb/testKeyFile.file
authorization: enabled

4.2依次在每台机器上的mongos配置文件中加入下面一段配置。如我在10.12.40.83上的mongos配置文件中加入上面的一段配置

security:
keyFile: /data/mongodb/testKeyFile.file

解释:

mongos比mongod少了authorization:enabled的配置。原因是,副本集加分片的安全认证需要配置两方面的,副本集各个节点之间使用内部身份验证,用于内部各个mongo实例的通信,只有相同keyfile才能相互访问。所以都要开启keyFile: /data/mongodb/testKeyFile.file

然而对于所有的mongod,才是真正的保存数据的分片。mongos只做路由,不保存数据。所以所有的mongod开启访问数据的授权authorization:enabled。这样用户只有账号密码正确才能访问到数据

4.3重启每个mongo示例。因为我的认证配置在了配置文件里面,所以启动命令不需要再加认证的参数 (例如--auth等)

mongod -f /data/mongodb/config/configs.config
mongod -f /data/mongodb/config/shard1.config
mongod -f /data/mongodb/config/shard2.config
mongod -f /data/mongodb/config/shard3.config
mongos -f /data/mongodb/config/mongos.config

依次重启三台机器的mongod和mongos实例

5、连接mongodb集群
如果用mongo sell脚本连接

mongo --port
use admin
db.auth("your account","your password")

如果返回1表示连接成功,然后你就可以访问自己的数据库啦~!如use testDB

mongodb分片集群开启安全认证的更多相关文章

  1. MongoDB 分片集群实战

    背景 在如今的互联网环境下,海量数据已随处可见并且还在不断增长,对于如何存储处理海量数据,比较常见的方法有两种: 垂直扩展:通过增加单台服务器的配置,例如使用更强悍的 CPU.更大的内存.更大容量的磁 ...

  2. mongodb分片集群

    第一章 1.mongodb 分片集群解释和目的 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 第二章 1. ...

  3. 网易云MongoDB分片集群(Sharding)服务已上线

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. MongoDB sharding cluster(分片集群)是MongoDB提供的数据在线水平扩展方案,包括 ...

  4. CentOS7+Docker+MangoDB下部署简单的MongoDB分片集群

    简单的在Docker上快速部署MongoDB分片集群 前言 文中使用的环境如下 OS:CentOS Linux release 7.5.1804 (Core) Docker:Docker versio ...

  5. Windows 搭建MongoDB分片集群(二)

    在本篇博客中我们主要讲描述分片集群的搭建过程.配置分片集群主要有两个步骤,第一启动所有需要的mongod和mongos进程.第二步就是启动一个mongos与集群通信.下面我们一步步来描述集群的搭建过程 ...

  6. MongoDB分片集群原理、搭建及测试详解

    随着技术的发展,目前数据库系统对于海量数据的存储和高效访问海量数据要求越来越高,MongoDB分片机制就是为了解决海量数据的存储和高效海量数据访问而生. MongoDB分片集群由mongos路由进程( ...

  7. TiDB和MongoDB分片集群架构比较

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 最近阅读了TiDB源码的说明文档,跟MongoDB的分片集群做了下简单对比. 首先展示TiDB的整体架构 M ...

  8. 搭建MongoDB分片集群

    在部门服务器搭建MongoDB分片集群,记录整个操作过程,朋友们也可以参考. 计划如下: 用5台机器搭建,IP分别为:192.168.58.5.192.168.58.6.192.168.58.8.19 ...

  9. Windows 搭建MongoDB分片集群(一)

    一.角色说明 要构建一个MongoDB分片集群,需要三个角色: shard server  即存储实际数据得分片,每个shard 可以是一个Mongod实例,也可以是一组mongod实例构成得Repl ...

随机推荐

  1. 在CentOS VPS上源代码安装高版本号git

    背景:个别软件在国内下载非常慢,在vps下载就非常快. 可是下载好后的文件通过scp弄出来的时候又非常慢,所以想通过在vps里安装git,通过gitlab或oschina来进行中转.但遗憾的是,上传到 ...

  2. Swift基本常识点

    import Foundation // 单行注释 // 多行注释(支持嵌套,OC是不支持的) // 常量let,初始化之后就不可改变. // 常量的具体类型可以自动识别,等号后面是什么类型,它就是什 ...

  3. JQuery调用WCF服务,部署在iis

    Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable ...

  4. JSONObject.toBean() data转换

    //toBean方法不识别date属性  要把VO的DATE该成UTIL包下的DATE 然后加上下面的代码.不然会报错JSONUtils.getMorpherRegistry().registerMo ...

  5. B2002 [Hnoi2010]Bounce 弹飞绵羊 分块

    原来做过,看大家都做这道题都热情高涨,沈爷爷debug这道题4天,作为告诉他这个题的人,我还有点不好意思...我自己也就做了一个小时. 其实这个题思路还好,就是维护每个点的出块次数和跳出块的位置,然后 ...

  6. JS判断浏览器类型和详细区分IE各版本浏览器

    今天用到JS判断浏览器类型,于是就系统整理了一下,便于后期使用. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

  7. 关于函数提升在if语句中的表现

    函数声明创建的函数在现代浏览器,在if语句中函数的声明不会提升,但是在老的IE版本中,if语句中的函数声明会提升 函数表达式在不同浏览器中函数声明都不会被提升,解决了不同浏览器的兼容性问题 关于函数提 ...

  8. MSSQL服务器 电脑改名后配置

    原服务器名改为新的名字后,系统配置更新 select * from sys.sysserversexec sp_dropserver 'WIN-JVU5CSOLEPL'exec sp_addserve ...

  9. 数据连接类 这里采用mysql

    数据库通用操作类,自己参照几个通用类改写的,用起来还是蛮不错....  这里用的mysql 要是其他数据库自行更改下就好 public class MySqlHelper { public stati ...

  10. Emmet(Zen Coding)语法规则简介

    ———Emmet(Zen Coding)语法规则简介——— [Zen Coding可谓快速开发HTML和CSS的利器,主要采用仿css类选择器方式编写代码,以下是该利器的基本语法规则和代码示例] 基础 ...