首页 > 其他分享 >mongo副本集开启安全认证

mongo副本集开启安全认证

时间:2024-07-29 11:31:34浏览次数:15  
标签:getSiblingDB 副本 mongo roles admin db 认证 role

线上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,并滚动重启

标签:getSiblingDB,副本,mongo,roles,admin,db,认证,role
From: https://www.cnblogs.com/shen-ren-qiang/p/18329707

相关文章

  • 基于 SASL/SCRAM 让 Kafka 实现动态授权认证
    一、说明在大数据处理和分析中ApacheKafka已经成为了一个核心组件。然而在生产环境中部署Kafka时,安全性是一个必须要考虑的重要因素。SASL(简单认证与安全层)和SCRAM(基于密码的认证机制的盐化挑战响应认证机制)提供了一种方法来增强Kafka集群的安全性。本文将从零开始部署......
  • OAuth2 + Gateway统一认证一步步实现(公司项目能直接使用),密码模式&授权码模式
    文章目录认证的具体实现环境的搭建基础版授权服务搭建引入依赖创建数据表yml配置配置SpringSecurity定义认证授权的配置类授权服务器存储客户端信息修改授权服务配置,支持密码模式基础版授权服务测试授权码模式测试密码模式测试**测试校验token接口**整合JWT使用jwt基......
  • springsecurity通过策略模式设置统一认证接口
     还是回到这张图:我们想不止使用数据库查找的方法去实现认证,而是使用一个统一的认证方法,首先需要修改DaoAuthenticationProvider内实现功能7的方法protectedvoidadditionalAuthenticationChecks(UserDetailsuserDetails,UsernamePasswordAuthenticationTokenauthenticatio......
  • lxml.etree 元素在副本上删除命名空间
    我正在使用lxml.etree库将XML文件拼接在一起,并且命名空间在写入时被删除。Input.xml<?xmlversion="1.0"encoding="UTF-8"?><haul><uuid>abc</uuid><portxmlns="hello"xmlns:a="hello">......
  • mongodb使用总结
    mongodb项目地址晓智科技晓智科技晓智文档晓智文档源码地址源码地址文档源码文档源码Linux下安装mongodb在/etc/yum.repos.d/下创建mongodb-org-4.2.repotouchmongodb-org-4.2.repovim写入下面文件[mngodb-org]name=MongoDBRepositorybaseurl=http://mi......
  • 微服务集成springsecurity实现认证
    module:auth1.添加依赖:spring-cloud-starter-security与spring-cloud-starter-oauth22.配置WebSecurityConfig:注入AuthenticationManager覆写configure3.配置tokenConfig4.授权服务器配置:AuthorizationServerextendsAuthorizationServerConfigurerAdapter配置客户端详细任务,......
  • 使用 pymongo 在 mongodb 中按 ObjectId 搜索文档
    我需要使用pymongo通过python搜索ObjectId,但总是收到错误。importpymongofrompymongoimportMongoClientfrompymongoimportObjectIdgate=collection.find({'_id':ObjectId(modem["dis_imei"])})有什么想法如何搜索吗?在提供的代码片段中,似乎在尝试使......
  • 【github】使用KeepassXC 解决github Enable two-factor authentication (2FA) 第二因
    下载https://github.com/keepassxreboot/keepassxc/releases/download/2.7.9/KeePassXC-2.7.9-Win64.msi代理地址https://dgithub.xyz/keepassxreboot/keepassxc/releases/download/2.7.9/KeePassXC-2.7.9-Win64.msi由于该软件不允许截图,以下操作参考官网创建数据库 Kee......
  • 【日常运维】mongodb学习之安装部署--使用
     本站以分享各种运维经验和运维所需要的技能为主《python零基础入门》:python零基础入门学习《python运维脚本》: python运维脚本实践《shell》:shell学习《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战《k8》暂未更新《docker学习》暂未更新《ceph学习......
  • MongoDB教程(一)
    首先写一下为什么要开这一个系列:本人在使用MongoDB开发应用的时候遇见了不少问题,但国内的相关文章都比较古老,所以我想连载翻译2024年Packt出版社出版的MasteringMongoDB这本书。第一章  MongoDB简介(第一部分)MongoDB作为最受欢迎的文档数据库,是一种非关系型的NoSQL键值存储系......