mongodb分片集群开启安全认证
原文地址: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:23000 | mongos:23000 | mongos:23000 |
config server:23100 | config server:23100 | config server:23100 |
shard server1 主节点:23101 | shard server1从节点:23101 | shard server1 仲裁节点:23101 |
shard server2从节点:23102 | shard server2仲裁节点:23102 | shard server2主节点:23102 |
shard server3仲裁节点:23103 | shard server3主节点:23103 | shard server3从节点:23103 |
红色部分为各个节点的端口号。
对副本集执行访问控制需要配置两个方面:
1、副本集和共享集群的各个节点成员之间使用内部身份验证,可以使用密钥文件或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.file chmod 400 /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 23000
添加用户
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 23000 use admin db.auth("your account","your password")
如果返回1表示连接成功,然后你就可以访问自己的数据库啦~!如use testDB