mongodb分片集群数据库安全认证

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

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

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

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

所以我们需要手动去添加用户,以便可以更加安全的进行访问,在没添加用户验证之前,通过mongos进入数据库时会有如下的警告:

开启分片集群的权限验证

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

    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 > /opt/mongodb/security/KeyFile.file
chmod 600 /opt/mongodb/security/testKeyFile.file

第一条命令是生成密钥文件,第二条命令是使用chmod更改文件权限,为文件所有者提供读权限,一定要保证密钥文件一致。文件位置随便。但是为了方便查找,建议每台机器都放到一个固定的位置。我的配置文件都放在/opt/mongodb/securitytestKeyFile.file

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

账号可以在集群认开启认证以后添加。但是那时候添加比较谨慎。只能添加一次,如果忘记了就无法再连接到集群。建议在没开启集群认证的时候先添加好管理员用户名和密码然后再开启认证再重启

连接任意一台机器的mongos,建立一个拥有添加删除用户权限的账号

use admin   //注意一定要使用admin数据库
db.createUser({
 user:"bfd",
 pwd:"123456",
 roles: [ { role: "userAdminAnyDatabase",db:"admin"}]
}) 

这里就添加了一个bfd这么一个用户,他可以进行所有数据库的用户管理。在添加这个用户后,我们连接mongodb时仍然不需要进行登录,这是因为我们未在配置中开启权限验证。

然后依次连接到每一台机器上执行,之前介绍过正确关闭mongodb服务,是进入交互端,执行 db.shutdownServer()关闭服务。

killall mongod
killall mongos

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

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

#开启权限验证
security:
  keyFile: /opt/mongodb/security/keyFile.file  
  authorization: enabled

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

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

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

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

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

numactl --interleave=all mongod -f /opt/mongodb/config/configsvr.conf
numactl --interleave=all mongod -f /opt/mongodb/config/shard1.conf
numactl --interleave=all mongod -f /opt/mongodb/config/shard2.conf
numactl --interleave=all mongod -f /opt/mongodb/config/shard3.conf
numactl --interleave=all mongos-f /opt/mongodb/config/mongos.conf

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

连接mongodb集群

[bfd@bfd-yiz-1p23 /opt/mongodb]$ mongo --port 27017
MongoDB shell version v4.0.4
connecting to: mongodb://127.0.0.1:27017/
Implicit session: session { "id" : UUID("8906ec80-d7d1-4f14-ac1d-97e3ae6c94cd") }
MongoDB server version: 4.0.4
mongos> use admin
switched to db admin
mongos> 
mongos> db.auth("bfd","123456")
1

如果返回1表示连接成功

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值