开发者学堂课程【MongoDB精讲课程(下):副本集安全认证】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/727/detail/12994
副本集安全认证
集群认证和单机是一样的,一样的是都需要通过用户名和密码登录。
其实副本集的环境和分片集群是一样的,他都属于一种集群的安全。例如app去登陆访问副本集的时候,如果开启了安全认证是需要用户名和密码,和单机是一样的,之后才可以对副本集进行操作。这是外部的访问和单实例是一样的,因为副本集不是单个的 myrs 服务了,有多个 myrs 服务,这个服务之间的互相访问,就是他们之间的这个互相访问,其实还是需要通过一些这个安全机制,他的这个安全机制通过的是认证的这个 key 文件。
[rcctabobohost~]#openssrand -base64 90-out./mongo.keyfile
[rcctobobohost-]#chmod 400/mongo.keyfile
[rcctubobohost~]11 mongo.keyfile
-r-------.1 root root 122 8
月 14 14:23mongokeyfile
Key 文件访问之后,主节点存在一个 key 文件,副本节点存在一个 key 文件,仲裁者也存在 key 文件,他们之间的 key 文件要保持一致的,他们之间的通信都是通过去验证 key 文件是否一致,一致之后才会产生连接。除了创建普通用户还要生成一个 key 文件,跟单机一样,要先生成一个普通用户和管理员用户,刚开始还是需要通过用户名和密码来连接他的,连接之前把他的单机符给删掉。
[root@instance-2ki2pjry ~]# ps -ef i grep mongo
root 12500 1 0 11:26 ? 00:00:05 /usr/1ocal/mongodb/bin/mongod -f /mongodb/single/mongod.conf
root 12834 10114 0 11:48 pts/0 00:00:00 grep --color=auto mongo
[root@instance-2ki2pjry ~]# kill -2 12500
[root@instance-2ki2pjry ~]# ps -ef i grep mongo
root 12837 10114 0 11:49 pts/0 00:00:00 grep--color=auto mongo
[root@instance-2ki2pjry ~]#
恢复到一个完整的初始化环境,之后把他的副本集启动起来
//客户端登录服务,注意,这里通过 7oca7host 登录,如果需更远程登录,必须先登录认证才行。
mongo --port 27017
//告知副本集说本机要下线
rs.stepdown()
//#切换到 admin 库
use admin //关闭服务
db.shutdownserver()
分别启动副本集节点:
/usr/1cca1/mongodb/bin/mongod -f/mcngcdb/replica_sets/myrs_27017/rongod.conf
/usr/1cca1/mongodb/bin/mongod-f/mongcdb/repica_sets/myrs_27018/ongod.conf
/usr/1cca1/mongodb/bin/mongod-f/mongcdb/repica_sets/myrs_27019/rongod.conf
之后直接登录普通用户,登录主节点
[rootRinstance-2k12p;ry~]#/uar/Local/mngodb/bin/mongo-port 27017
进入主节点之后和单实例环境是一样的,先创建一个管理员账户
创建超管用户:myroot,密码:123456
myrs:FRIMARY> use admin
switched to dbadmin
myrs:FRIMARY>db.createUserCfuser:"myrcot"pwd:"123456",ro7es: ("roct"]})
successfully added user: { "user" : "myroot"."roles": [ "root" ] }
创建 key 文件
[rcot@bobohost~]#openssrand -base64 90-out/mongo.keyfile
[rcot@bobohost~]chmod 400/mongo.keyfile
[rcotebobohost~]11mongo.keyfile
-r--------. 1 root root 122 8
月 14 14:23 mongokeyfile
当前生成的 keyfile 的读写比较多,其他用户也可以读,如果想要提高安全权限,可以调成400,400就是对当前用户可读。这步进不进行都可以。
Key 生成后就需要把每个文件copy到每个节点下面
这里将该文件分别拷贝到多个目录中;[roct@bobohost~]#cpmongo.keyfile/mongodb/replica_sets/myrs_27017
[reatabobohost~1#cpmongokevfile/monoodbireplicasets/mvrs 27018
[rootabobohost~]#cpmongo.keyfile/mongodb/replica_sets/myrs_27019
修改配置文件指定 keyfile
分别编辑几个服务的 mongod.con 文件,添加相关内容
/mongodb/replica_sets/mrs_27017/mongod.conf
security:
#KeyFi1e 鉴权文件
keyFile:/mongodb/repica_sets/myrs_27017/mongo.keyfle
#开启认证方式运行
authorization:enablea
/mongodb/replica_set/myrs 27018/mongod.conf
security:
#KeyFile 鉴权文件
keyFile:imongodb/repicasets/myrs_27018/niongo.keyfile
#开启认证方式运行
authorization: enabled
修改副本集文件27017、27018、27019
Wq保存,接下来和单实例一样,需要把刚刚的服务删掉。重启之后产生认证效果,启动的时候注意一定要是 successfully,如果不是就是之前追加的配置文件有问题。
在主节点上添加普通账号
#先用管理员账号登录
#切换到 adnin 库
use admin
#管理员账号认证
db. auth("myroot","123456")
#切换到要认证的库 use articledb
#添加普通用户
db.createUser(fuser:"bobo",pwd:"123456",ro1es:["readwrite"]})
登录的时候登录主节点就可以了,因为创建账户主节点和副本节点之间会同步的。登录状态显示是1表示登录成功。
myrsiPRiMARY> show dbs
myrs:PriMarY> use admin switched to db admin
myrs:PRIMARY> db.auth("myroot","123456")
myrs:PRIMARY> show dbs
admin 0.000GB
articledb 0.000GB
config 0.000GB
local 0.000GB
myrs:PRIMARY>
到现在为止只创建了一个超管用户,用在业务上还是需要用普通账户。
#先用管理员账号登录
#切换到 admin 库 use admin
#管理员账号认证
db.auth("myroot","123456")
#切换到要认证的库 use articledb
#添加普通用户
db.createuser({user: "bobo",pwd:"123456",roles: ["readwrite"]})
副本集除了keyfile需要指定一下,其他的操作基本上和单实例是一致的。创建普通用户就需要指定的库,如果不想在后边写库名,想要使用简便的方式的话,就先要把他切换到 articledb,之后再来创建账户
myrs:PRIMARY> use articledb
switched to db articledb
myrs:PRIMARY> db.createUser({user: "bobo", pwd:"123456",roles: ["readWrite"]})
Successfully added user: { "user”: "bobo","roles” : [ "readWrite" ] )
myrs:PRIMARY>
创建之后就具备了读写权限了,接下来连接副本集
spring:
#款据源配置
data:
mongedb:
#副本集有认让的情况下,字符串连接
uri:
ronaodb://bobo:123456018076.159126:2701718071127019/art cledb?connect-replicaSet&sTaveok-true&replicaSet-myrs
同样,用户名或者密码错误,是不可以连接的。
副本集和单机的区别在于多出来的 keyfile 文件,keyfile 文件需要自己配置,配置之后内部的通信就是相对安全的了,他们之间会通过 keyfile 建立安全连接,推到分片集群也是一样的,之间通过用户名和密码来连接就可以了。