mongodb副本集加分片集群安全认证使用账号密码登录

2017-12-06 08:21:28来源:CSDN作者:uncle_david人点击

分享

mongodb副本集加分片集群搭建网上资料有很多。粘贴一个写的比较好的。副本集加分片搭建

对于搭建好的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.8210.12.40.8310.12.40.86
mongos:23000mongos:23000mongos:23000
config server:23100config server:23100config server:23100
shard server1 主节点:23101shard server1从节点:23101shard server1 仲裁节点:23101
shard server2从节点:23102shard server2仲裁节点:23102shard server2主节点:23102
shard server3仲裁节点:23103shard server3主节点:23103shard server3从节点:23103


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


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

    1、副本集各个节点之间使用内部身份验证,对副本集和共享集群的成员进行身份验证。对于成员的内部身份验证,MongoDB可以使用密钥文件或x.509证书。

密钥文件比较简单,本文介绍的也是使用密钥文件,官方推荐如果是测试环境可以使用密钥文件,但是正是环境,官方推荐x.509证书。

    2、使用客户端连接到mongodb集群时,需要使用用户访问控制。


下面开始详细说明:

1、生成密钥文件。

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

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

openssl rand -base64 756 > /data/mongodb/testKeyFile.filechmod 400 /data/mongodb/keyfile/testKeyFile.file
第一条命令是生成密钥文件,第二条命令是使用chmod更改文件权限,为文件所有者提供读权限

2、将密钥复制到集群中的每台机器的指定位置

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

3、预先创建好一个管理员账号和密码然后将集群中的所有mongod和mongos全部关闭

用户可以在集群认开启认证以后添加。但是那时候添加比较谨慎。建议在没开启集群认证的时候先添加好管理员用户名和密码然后再开启认证方式

连接任意一台机器的mongos

mongo --port 23000
添加用户:

use admindb.createUser(    {        user:"your account",        pwd:"your password",        roles[{role:"root",db:"admin"}]    })

    3.1可以发现。没开启认证的集群如果开启认证需要集群宕机几分钟。当然也有热启动的方式,比较复杂可以自己研究一下。官方文档中有

    3.2关闭的方式我用的也比较暴力。依次连接每一台机器,然后执行两条命令

killall mongodkillall mongos

然后删除存储数据存储路径下面的mongod.lock(数据存储路径:搭建mongodb集群的时候在mongod的配置文件中需要指定将来数据将要存储的位置。那个位置就是数据存储路径)

4、使用访问控制强制重新启动复制集的每个成员**** 

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

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

    4.1依次在每台机器上的mongod的配置文件中加入上面一段配置。如我在10.12.40.83上的config server,shard1,shard2,shard3都加入上面的配置文件

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

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


解释:

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

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

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

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

    依次重启三台机器的mongo实例


5、连接mongodb集群

如果用mongo sell脚本连接

mongo --port 23000use admindb.auth("your account","your password")

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

如果使用mongodb连接工具。我用的是Robo3T。在连接的时候选择使用authentization

如下图



 

有任何问题随时留言,看到了会积极回复的














微信扫一扫

第七城市微信公众平台