线上mongo是四节点的副本集,其中一个节点是延迟并且隐藏不参与选举。由于业务的需要,现在需要开启mongo的安全认证。根据官网的介绍( https://www.mongodb.com/zh-cn/docs/manual/tutorial/enforce-keyfile-access-control-in-existing-replica-set-without-downtime/),可以采取不停机(transitionToAuth: true)的方式,将副本集更新为密钥文件身份验证,并且连接到副本集的客户端也需要认证。
1.基于角色的访问控制
MongoDB 采用基于角色的访问控制 (RBAC) 来管理对 MongoDB 系统的访问。向用户授予一个或多个角色,而这些角色决定了该用户对数据库资源和操作的访问权限。在分配的角色之外,该用户无权访问系统。
因此需要先创建角色,不同的角色对应不同的权限。其次在创建用户,将用户分配不同的角色。需要注意的是,在创建用户时需要指定Authentication Database,这个db就是此用户的身份验证数据库,不同的用户访问不同的db,也可以统一指定一个db用于认证,比如admin。
2.开启安全认证
- 用户权限
账号分配遵循最小权限原则,分别是read(只读),readWrite(读写),dbAdmin(日常运维管理),userAdmin(管理用户权限),clusterAdmin(副本集管理),clusterMonitor(监控),backup(备份用户)
查看代码
#只读
db.getSiblingDB("admin").runCommand( {createUser: "onlyread",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "readAnyDatabase", db:"admin" }]} )
#读写
db.getSiblingDB("admin").runCommand( {createUser: "readwrite",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "readWriteAnyDatabase", db:"admin" }]} )
#dbadmin
db.getSiblingDB("admin").runCommand( {createUser: "dbadmin",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "dbAdminAnyDatabase", db:"admin" }]} )
#useradmin
db.getSiblingDB("admin").runCommand( {createUser: "grantadmin",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "userAdminAnyDatabase", db:"admin" }]} )
#clusterAdmin
db.getSiblingDB("admin").runCommand( {createUser: "replAdmin",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "clusterAdmin", db:"admin" }]} )
#superuser
db.getSiblingDB("admin").runCommand( {createUser: "rootuser",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "root", db:"admin" }]} )
#clusterMonitor
db.getSiblingDB("admin").runCommand( {createUser: "monitor",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "clusterMonitor", db:"admin" }]} )
#备份还原
db.getSiblingDB("admin").createRole({ "role": "pbmAnyAction",
"privileges": [
{ "resource": { "anyResource": true },
"actions": [ "anyAction" ]
}
],
"roles": []
});
db.getSiblingDB("admin").createUser({user: "pbmuser",
"pwd": "secretpwd",
"roles" : [
{ "db" : "admin", "role" : "readWrite", "collection": "" },
{ "db" : "admin", "role" : "backup" },
{ "db" : "admin", "role" : "clusterMonitor" },
{ "db" : "admin", "role" : "restore" },
{ "db" : "admin", "role" : "pbmAnyAction" }
]
});
- 创建密钥文件
查看代码
openssl rand -base64 756 > 文件路径
chmod 400 文件路径
- 拷贝密钥文件至所有节点
- 配置文件
在配置文件中,添加以下内容
查看代码
security:
keyFile: 文件路径
clusterAuthMode: keyFile
authorization: enabled
transitionToAuth: true
解释
keyFile指明密钥文件路径
clusterAuthMode副本集之间的认证方式为密钥文件
authorization开启认证
transitionToAuth: true 过渡状态,既接受经过身份验证的连接,也接受未经身份验证的连接
- 应用程序连接
开启安全认证之后,应用程序需要修改url,加上账号,密码,以及认证db
查看代码
mongodb://账号:密码@ip1:port,ip2:port,ip3:port/admin?authSource=admin
- 滚动重启
现在重启其他两个节点,主库在降级重启
- 监控用户
这里就需要监控一下,没有使用认证方式连接的用户了
统计所有链接的ip
查看代码
grep "connection accepted from" /data1/mongo_rs1/log/mongod.log | awk -F ':' '{print $3}' | awk '{print $NF}' | sort | uniq
统计所有认证的ip
grep "authenticated" /data1/mongo_rs1/log/mongod.log | awk -F ':' '{print $3}' | awk '{print $NF}' | sort | uniq
对比以上两个结果,找出没有认证的ip
找出认证失败的IP
grep "AuthenticationFailed" /data1/mongo_rs1/log/mongod.log| grep -v "requestId" | awk -F ':' '{print $3}' | awk '{print $NF}' | sort | uniq
- 取消过渡状态
持续监控一段时间,直到没有出现未认证的ip,在取消过渡状态
删除配置文件transitionToAuth: true,并滚动重启
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容