IT评测·应用市场-qidao123.com技术社区

标题: mongo副本集开启安全认证 [打印本页]

作者: 惊雷无声    时间: 2024-7-29 12:40
标题: mongo副本集开启安全认证
线上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(备份用户)
检察代码
  1. #只读
  2. db.getSiblingDB("admin").runCommand( {createUser: "onlyread",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "readAnyDatabase", db:"admin" }]} )
  3. #读写
  4. db.getSiblingDB("admin").runCommand( {createUser: "readwrite",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "readWriteAnyDatabase", db:"admin" }]} )
  5. #dbadmin
  6. db.getSiblingDB("admin").runCommand( {createUser: "dbadmin",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "dbAdminAnyDatabase", db:"admin" }]} )
  7. #useradmin
  8. db.getSiblingDB("admin").runCommand( {createUser: "grantadmin",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "userAdminAnyDatabase", db:"admin" }]} )
  9. #clusterAdmin
  10. db.getSiblingDB("admin").runCommand( {createUser: "replAdmin",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "clusterAdmin", db:"admin" }]} )
  11. #superuser
  12. db.getSiblingDB("admin").runCommand( {createUser: "rootuser",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "root", db:"admin" }]} )
  13. #clusterMonitor
  14. db.getSiblingDB("admin").runCommand( {createUser: "monitor",pwd: "XXXXXXXXXXXXXX",roles: [{ role: "clusterMonitor", db:"admin" }]} )
  15. #备份还原
  16. db.getSiblingDB("admin").createRole({ "role": "pbmAnyAction",
  17.       "privileges": [
  18.          { "resource": { "anyResource": true },
  19.            "actions": [ "anyAction" ]
  20.          }
  21.       ],
  22.       "roles": []
  23.    });
  24. db.getSiblingDB("admin").createUser({user: "pbmuser",
  25.        "pwd": "secretpwd",
  26.        "roles" : [
  27.           { "db" : "admin", "role" : "readWrite", "collection": "" },
  28.           { "db" : "admin", "role" : "backup" },
  29.           { "db" : "admin", "role" : "clusterMonitor" },
  30.           { "db" : "admin", "role" : "restore" },
  31.           { "db" : "admin", "role" : "pbmAnyAction" }
  32.        ]
  33.     });
复制代码
检察代码
  1. openssl rand -base64 756 > 文件路径
  2. chmod 400 文件路径
复制代码

在设置文件中,添加以下内容
检察代码
  1. security:
  2.     keyFile: 文件路径
  3.     clusterAuthMode: keyFile
  4.     authorization: enabled
  5.     transitionToAuth: true
复制代码
表明
keyFile指明密钥文件路径
clusterAuthMode副本集之间的认证方式为密钥文件
authorization开启认证
transitionToAuth: true 过渡状态,既接受经过身份验证的连接,也接受未经身份验证的连接
开启安全认证之后,应用程序需要修改url,加上账号,暗码,以及认证db
检察代码
  1. mongodb://账号:密码@ip1:port,ip2:port,ip3:port/admin?authSource=admin
复制代码
现在重启其他两个节点,主库在降级重启
这里就需要监控一下,没有使用认证方式连接的用户了
统计全部链接的ip
检察代码
  1. grep "connection accepted from" /data1/mongo_rs1/log/mongod.log | awk -F ':' '{print $3}' | awk '{print $NF}' | sort | uniq
复制代码
统计全部认证的ip
  1. grep "authenticated" /data1/mongo_rs1/log/mongod.log | awk -F ':' '{print $3}' | awk '{print $NF}' | sort | uniq
复制代码
对比以上两个结果,找出没有认证的ip
找出认证失败的IP
  1. grep "AuthenticationFailed"  /data1/mongo_rs1/log/mongod.log| grep -v "requestId" | awk -F ':' '{print $3}' | awk '{print $NF}' | sort | uniq
复制代码
持续监控一段时间,直到没有出现未认证的ip,在取消过渡状态
删除设置文件transitionToAuth: true,并滚动重启

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4