16、MongoDB实战:安全认证(分片集群)

分片集群环境下的安全认证和副本集环境下基本上一样。但分片集群的服务器环境和架构较为复杂,建议在搭建分片集群的时候,直接加入安全认证和服务器间的鉴权,如果之前有数据,可先将之前的数据备份出来,再还原回去。

一:关闭集群服务器

1.1 快速关闭方法(快速,简单,数据可能会出错)

依次杀死mongos路由、配置副本集服务,分片副本集服务,从次节点开始。直到所有成员都离线。副本集杀的时候,建议先杀仲裁者,再杀副本节点,最后是主节点,以避免潜在的回滚。杀完要检查一下,避免有的没有杀掉。

ps -ef | grep mongod

#通过进程编号关闭节点 
kill -2 xxx

如果一旦是因为数据损坏,则需要进行如下操作:

rm -f ./data/db/*.lock 

/bin/mongod --repair -- dbpath=./data/db

1.2 标准的关闭方法(数据不容易出错,但麻烦)

关闭分片服务器副本集中的服务,建议依次关闭仲裁节点、副本节点、主节点。主要的操作步骤参考如下:

//客户端登录服务,注意,这里通过localhost登录,如果需要远程登录,必须先登录认证才行。 
mongo --port 27018 
//告知副本集说本机要下线 
rs.stepDown() 
//#切换到admin库 
use admin 
//关闭服务 
db.shutdownServer()

关闭配置服务器副本集的服务,建议依次关闭副本节点、主节点。主要的操作步骤参考如下:

//客户端登录服务,注意,这里通过localhost登录,如果需要远程登录,必须先登录认证才行。 
mongo --port 27019
//告知副本集说本机要下线 
rs.stepDown() 
//#切换到admin库 
use admin 
//关闭服务 
db.shutdownServer()

关闭路由服务器的服务,建议依次关闭两个路由节点。主要的操作步骤参考如下:

//客户端登录服务,注意,这里通过localhost登录,如果需要远程登录,必须先登录认证才行。 
mongo --port 27017
//告知副本集说本机要下线 
rs.stepDown() 
//#切换到admin库 
use admin 
//关闭服务 
db.shutdownServer()

二:创建副本集认证的key文件

2.1 第一步:生成一个key文件到当前文件夹中

可以使用任何方法生成密钥文件。例如,以下操作使用openssl生成密码文件,然后使用chmod来更改文件权限,仅为文件所有者提供读取权限。所有副本集节点都必须要用同一份keyfile,一般是在一台机器上生成,然后拷贝到其他机器上,且必须有读的权限,否则将来会报错: permissions on mongo.keyfile are too open。一定要保证密钥文件一致,文件位置随便。但是为了方便查找,建议每台机器都放到一个固定的位置,都放到和配置文件一起的目录中。

> openssl rand -base64 90 -out ./mongo.keyfile

> chmod 400 ./mongo.keyfile
> ll mongo.keyfile 
-r--------. 1 root root 122 8月 14 14:23 mongo.keyfile

2.2 第二步:拷贝mongo.keyfile到每台服务器上

将mongo.keyfile 拷贝到每一台mongodb服务器中,这里拷贝到config目录下。

// 这里只演示一次拷贝,实际要拷贝到每台服务器中
cp mongo.keyfile ./config/

2.3 为每个主节点副本集的所有服务器添加安全认证

修改每个主节点的mongod.conf文件,添加安全认证。

security: 
	#KeyFile鉴权文件 
	keyFile: xxx/mongo.keyfile 
	#开启认证方式运行 
	authorization: enabled

2.4 为每个路由服务器配置鉴权文件

修改客户端的mongos.conf文件添加鉴权文件(这里修改mongodb-mongos-27017、mongodb-mongos-27117两台服务器),注意不需要开启认证。

security: 
	#KeyFile鉴权文件 
	keyFile: xxx/mongo.keyfile 

mongos比mongod少了authorization:enabled的配置。原因是,副本集加分片的安全认证需要配置两方面的,副本集各个节点之间使用内部身份验证,用于内部各个mongo实例的通信,只有相同keyfile才能相互访问。所以都要开启 keyFile: xxx/mongo.keyfile 。然而对于所有的mongod,才是真正的保存数据的分片。mongos只做路由,不保存数据。所以所有的mongod开启访问数据的授权authorization:enabled。这样用户只有账号密码正确才能访问到数据。

三: 重新启动节点

必须依次启动配置节点、分片节点、路由节点。

四:创建帐号和认证

通过localhost登录任意一个mongos路由客户端。

./bin/mongo --port 27017
mongos> use admin

mongos> db.createUser({
   
     user:"myroot",pwd:"123456",roles:["root"]})
mongos> db.auth("myroot","123456")

// 创建一个普通账号
mongos> use test
mongos> db.createUser({
   
     user: "test", pwd: "123456", roles: [{
   
      role: "readWrite", db: "test" }]})
mongos> db.auth("test","123456")

mongos> sh.status()

通过mongos添加的账号信息,只会保存到配置节点的服务中,具体的数据节点不保存账号信息,因此,分片中的账号信息不涉及到同步问题。

退出重新使用普通账号登录,使用普通账号访问数据,如果可以表示搭建成功。

./bin/mongo --port 27017
mongos> use test
mongos> db.auth("test","123456")
mongos> show collections

五:SpringDataMongoDB连接认证

spring: 
	#数据源配置 
	data: 
		mongodb: # 分片集群有认证的情况下,字符串连接 
			uri: mongodb://test:123456@127.0.0.1:27017,127.0.0.1:27117/test

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: