MongoDB部署使用密钥文件进行身份验证的副本集
1.副本集架构
?
| 成员 | IP |
| 1 | 192.168.137.110 |
| 2 | 192.168.137.111 |
| 3 | 192.168.137.112 |
·副本集成员之间,使用内部身份验证的方式保证安全性
·客户端和副本之间使用基于角色的访问控制
2.创建keyfile
使用keyfile身份验证,副本集中的每个mongod实例都使用keyfile的内容作为共享密码,用于对部署中的其他成员进行身份验证。只有具有正确密钥文件的mongod实例才能加入副本集。
在其中一个节点生成,拷贝到其它节点即可。
$ openssl rand -base64 756 -out /usr/local/mongodb/mongo.keyfile $ chmod 400 /usr/local/mongodb/mongo.keyfile
3.将步骤1中生成的keyfile拷贝到其它成员
注意,要将keyfile文件的属主改成mongodb的安装用户,通常是mongod。
4.开启访问控制后启动所有成员节点
启动前,修改配置,开启访问控制:
# vi /etc/mongod.conf security: authorization: enabled keyFile: /usr/local/mongodb/mongo.keyfile replication: replSetName:net: bindIp: localhost,
然后启动mongodb实例
比如:
mongod --config
systemctl restart mongod.servicesystemctl status mongod.service
5.通过本地接口登录到其中一个节点
使用mongo本地登录。
因为还没有创建用户,只能通过本地接口登录;在创建第一个用户之后,本地接口就会被关闭。
6.初始化副本集
> config = {
_id : "rs0",
members : [
{_id:0, host:"192.168.137.110:27017"},
{_id:1, host:"192.168.137.111:27017"},
{_id:2, host:"192.168.137.112:27017"},
]
}
> rs.initiate(config) //初始化副本集
{
"ok" : 1, //返回ok:1成功,返回ok:0失败
"operationTime" : Timestamp(1611042829, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1611042829, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
rs.initiate()会触发选举,并选举出一个成员为primary。
7.创建管理用户
创建第一个用户后,本地接口就会被关闭。
第一个用户必须具有create其它用户的权限,授予userAdminAnyDatabase角色。
admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "fred",
pwd: passwordPrompt(), // or cleartext password
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
8.管理员登录验证
mongo -u "fred" -p --authenticationDatabase "admin"
或者先执行mongo,在mongoshell中执行:
db.getSiblingDB("admin").auth("fred", passwordPrompt()) // or cleartext password9.创建集群管理员
9.创建集群管理员
db.getSiblingDB("admin").createUser(
{
"user" : "ravi",
"pwd" : passwordPrompt(), // or cleartext password
roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
}
)
10.创建普通用户