MongoDB 25. 用keyfile部署Replica Set
之前记录过搭建ReplcatSet 搭建基础Replica Set,今天记录下用keyFile搭建RS.
keyfile
介绍keyfile
开始之前先介绍下keyfile。 keyfile白话说就是一个记事本,存放这一串字符,就可以当做秘钥。 keyfile是用于mongodb集群内部成员认证用的,不是一个圈子的你别硬挤,防止别人蹭进来。keyfile是一种适用于开发、测试环境的内部认证方式,更高级的还有x509。
重要:keyfile主要是用于集群内部认证用,唯一的要求是6-1024长度内容,集群内部成员该文件值必须一样才可以。
生成keyfile
keyfile mongodb官方文档上生成方式是。 openssl rand是一种linux提供的密码生成工具,20好像指的是生成的密码字节数,但有时候又会超过20字节。 chmod 400是更改文件权限为400.
openssl rand -base64 20 > keyfile
chmod 400 keyfile
keyfile权限问题
假如mongodb在生产环境启动,启动用户为mongodb,keyfile权限需要设置为400(600也行),其他组用户无法查看该文件,也就能保证一致性了。所以说只要keyfile没有组或者全局权限即可。
如果设置权限过大,mongod复本集直接启动失败。复本集内keyfile内容不对,也会初始化失败。
2021-11-24T22:37:18.878+0800 I ACCESS [main] permissions on /opt/mongodb/mongodb3.6.23/keyfile are too open
搭建Replica Set
配置文件信息mongodb.conf如下。区别增加了security.keyFile
。
storage:
dbPath: /opt/mongodb/mongodb3.6.23/data
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /opt/mongodb/mongodb3.6.23/log/mongod.log
net:
port: 27017
bindIp: 127.0.0.1,192.168.19.5
replication:
replSetName: helloworld
processManagement:
fork: true
security:
keyFile: /opt/mongodb/mongodb3.6.23/keyfile
分别启动mongod实例,并且连接到admin库执行初始化集群命令。
use admin
rs.initiate(
{
_id : "helloworld",
members: [
{ _id : 0, host : "192.168.19.4:27017" },
{ _id : 1, host : "192.168.19.5:27017" },
{ _id : 2, host : "192.168.19.6:27017" }
]
}
)
集群初始化成功后可以通过rs.status()
查看集群状态。
这个时候集群建立好了,但是没有权限去执行操作,也就是没有RBAC授权。包括查看表都没有权限。
我们可以创建一个用户(这里是使用了localhost exception特性才能够创建成功第一个用户):
之后进行一系列操作都是没有问题,包括继续创建更细粒度角色的用户。
我们登录副本,发现刚才的用户名、密码也同步过来。(副本集从节点上没有创建用户,但是system.user表数据同步过来了,所以不用创建用户也能认证)。
到这儿,Replica set搭建就完成了,有了用户有了访问控制。
使用到的命令有:
初始化集群、创建用户命令
rs.initiate(
{
_id : "helloworld",
members: [
{ _id : 0, host : "192.168.19.4:27017" },
{ _id : 1, host : "192.168.19.5:27017" },
{ _id : 2, host : "192.168.19.6:27017" }
]
}
)
db.createUser(
{
user: "jack",
pwd: "jack007",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
db.createUser(
{
user: "root",
pwd: "root007",
roles: [ "root" ]
}
)
security.authorization和 keyfile区别
这两个属性到底是什么关系,我做了个实验去探究。
security.authorization=enabled and keyfile不配置
Replica set中配置了 security.authorization后,mongod实例可以启动,但是集群一直初始化失败。
原因解释:就是说集群之间认证失败了,这也就要求我们必须使用keyfile或者x509来保障我们集群的安全性。
我尝试通过db.createUser(),发现Replica set上也是无法添加用户的,因为不是主节点,集群初始化失败所以不存在master节点。所以在不更改配置的情况下是无法创建用户、初始化复本集的。
这条路我得出的结论是:仅仅配置这两个属性的情况,不能只配置authorization而不配置keyfile;
security.authorization不配置 and keyfile不配置
这两者都不配置完全没事儿,等于白说,就是一个裸露的Replica set。
security.authorization不配置 and keyfile配置
security.authorization配置 and keyfile配置
这两种就和上面搭建Replica set的效果一模一样的。
结论
官网看到这样一句话:我翻译过来应该是 keyfile包含了authorization属性。所以我理解只需要配置keyfile属性就不要配置authorization了。