点击蓝色字关注我!

在互联网公司开发过程中,我们常常会遇到,一些一开始没考虑到的场景,等到上线或者服务运行一段时间之后,发现有些东西没做好,需要做一些优化重构啥的。
这些场景包括,某些服务密码配置过于简单(或者没配置),敏感数据没有脱敏(转移),代码没有足够测试用例,日常服务爆出漏洞需要升级修复等等。在优化过程中,我们都希望做到零宕机平滑迁移,以此把服务影响时间降到最低。
今天我说的就是这里场景的一种,mongo实现零重启添加访问控制。
写在前面
本文是在 Ubuntu:16.04, mongo 3.4版本进行
要求:您的副本集可以在现有的primary成员之后(比如宕机)选择一个新的primary。
mongo集群实现零停机添加「身份认证」,需要版本是在mongo 3.4以上版本,原因是mongo在3.4的时候加入了--transitionToAuth
参数,本文主要是通过这个参数做到零停机进行升级认证的。
我们这里以3个节点副本集为例。
创建一个用户管理员
链接到primary进行创建 userAdminAnyDatabase
权限的用户
admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "yourname1", pwd: "changeme1",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
在完成此过程后,任何管理副本集合中的用户的客户端都必须作为该用户进行身份验证,或者具有类似权限的用户。
创建集群管理员
连接到primary节点,创建一个具有clusterAdmin
角色的用户。clusterAdmin
角色授予对复制操作的访问权,例如配置副本集。
db.getSiblingDB("admin").createUser(
{ "user" : "yourname2", "pwd" : "changeme2",
roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
}
)
创建客户端应用链接的用户
创建用户允许客户端程序与副本级交互。完成这一步客户端需要通过对应帐号密码来进行链接副本级。
这里面我们需要注意使用readWrite
权限对数据进行操作,对特定的数据库(如yourdb)密码建议设置较为复杂来加强系统安全性,这里建议用1password进行生成管理。
db.getSiblingDB("yourdb").createUser(
{ "user" : "yourname_client", "pwd" : "changeme2",
roles: [ { "role" : "readWrite", "db" : "yourdb" } ]
}
)
客户端认证yourdb
可以对其进行读写。
更新客户端应用代码
这一步里面,副本级链接并没有强制要求认证,但是客户端应用程序依然可以通过认证的帐号密码俩进行链接副本级。
这里我们假设你的副本级 replia set 为 yourRepl
进行测试
mongo -u yourname_client -password changeme2 -authenticationDatabase yourdb —host yourRepl/mongo1.example.net:27017, mongo2.example.net:27017, mongo3.example.net:27017
可以链接成功,然后更新客户端代码,发布上线。
创建密钥文件
openssl rand -base64 756 > <path-to-keyfile>
<path-to-keyfile>
这里面保证上面这个keyfile,需要mongodb
(你启动mongod) 用户可以访问
通过keyfile认证方式,副本级中的每个mongod实例都会使用keyfile的内容作为密码去认证其他成员。只有正确的mongo实例拥有正确的keyfile可以加入副本级。
然后复制keyfile到每一个副本级
添加transitionToAuth,重启实例
注意:在重启之前保证配置文件中有以下配置
security:
keyFile: <path-to-keyfile>
transitionToAuth: true # 这个配置很重要replication:
replSetName: <replicaSetName>
sudo service mongod restart
rs.stepDown()
一个原则,保持primary在线
去掉transitionToAuth,重启实例
注意:在重启之前保证配置文件中有以下配置
security:
keyFile: <path-to-keyfile>
replication:
replSetName: <replicaSetName>
sudo service mongod restart
rs.stepDown()
至此所有的集群认证已经添加完毕,所有客户端也需要进行认证才能进行链接。
我们这种「边开飞机,边换引擎」方式到此就已经完成了。
分享到:
相关推荐
5. **验证集群状态**:使用`mongo` shell连接到任一节点,通过`rs.status()`命令检查复制集的状态,确认所有节点都已经加入且状态正常。 6. **测试故障转移**:手动使当前primary节点停机,观察其他节点自动选举新...
同时,还学习了如何限制数据库访问,这包括了关闭服务和配置数据库监听特定IP地址及端口。 最后一部分,我们讨论了MongoDB的高级查询功能,如聚合函数的使用。通过聚合管道操作,我们可以将文档转换并输出为定制...
MongoVUE 允许创建和管理用户,设置访问控制,确保数据安全。 7. 备份与恢复:MongoVUE 提供了备份和恢复功能,可以将整个数据库或特定集合备份到文件,当需要时进行恢复,确保数据的安全性。 8. 脚本支持:对于更...
这涉及到将secondary降级为secondary,从集群中移除,清空其数据目录,然后再将其添加回集群进行数据同步。这种方法需要有完整备份,并且会有一段数据不可用的时间。 4. **db.copyDatabase()**: 尽管`db.copy...
搭建时遇到的常见问题是,配置文件设置不当或启动顺序错误可能会导致初始化集群时出现"needtologin"的错误,此时可以利用rs.add()方法,逐一添加成员节点以完成集群的初始化。 一旦Replica Sets搭建完成,集群中的...
为了保护数据库,建议设置访问控制,启用身份验证,并为不同的用户分配合适的权限。此外,定期更新到最新稳定版本以获取安全补丁和性能优化。 在实际应用中,MongoDB可以与其他技术结合,如Node.js、Python的...
1. **分片集群**:MongoDB支持分片集群,可以水平扩展数据存储和处理能力。在4.2版本中,改进了分片策略,增加了自动平衡功能,使得数据分布更加均匀。 2. **交易支持**:MongoDB 4.2引入了多文档ACID事务,允许跨...