MongoDB从入门到实战(十六):安全认证(分片集群)

x33g5p2x  于2021-12-25 转载在 Go  
字(2.8k)|赞(0)|评价(0)|浏览(645)

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

一:关闭集群服务器

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

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

  1. ps -ef | grep mongod
  2. #通过进程编号关闭节点
  3. kill -2 xxx

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

  1. rm -f ./data/db/*.lock /bin/mongod --repair -- dbpath=./data/db

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

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

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

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

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

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

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

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

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

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

  1. > openssl rand -base64 90 -out ./mongo.keyfile
  2. > chmod 400 ./mongo.keyfile
  3. > ll mongo.keyfile
  4. -r--------. 1 root root 122 8 14 14:23 mongo.keyfile

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

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

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

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

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

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

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

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

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

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

三: 重新启动节点

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

四:创建帐号和认证

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

  1. ./bin/mongo --port 27017
  2. mongos> use admin
  3. mongos> db.createUser({user:"myroot",pwd:"123456",roles:["root"]})
  4. mongos> db.auth("myroot","123456")
  5. // 创建一个普通账号
  6. mongos> use test
  7. mongos> db.createUser({user: "test", pwd: "123456", roles: [{ role: "readWrite", db: "test" }]})
  8. mongos> db.auth("test","123456")
  9. mongos> sh.status()

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

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

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

五:SpringDataMongoDB连接认证

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

相关文章