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: <replicaSetName> net:    bindIp: localhost,<hostname(s)|ip address(es)>

然后启动mongodb实例

比如:

mongod --config <path-to-config-file> 

  

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.创建普通用户