【MongoDB】MongoDB部署使用密钥文件进行身份验证的副本集
2022-05-16 14:20 abce 阅读(1163) 评论(0) 编辑 收藏 举报1.副本集架构
成员 | IP |
1 | 192.168.137.110 |
2 | 192.168.137.111 |
3 | 192.168.137.112 |
·副本集成员之间,使用内部身份验证的方式保证安全性
·客户端和副本之间使用基于角色的访问控制
2.创建keyfile
使用keyfile身份验证,副本集中的每个mongod实例都使用keyfile的内容作为共享密码,用于对部署中的其他成员进行身份验证。只有具有正确密钥文件的mongod实例才能加入副本集。
在其中一个节点生成,拷贝到其它节点即可。
1 2 | $ openssl rand -base64 756 - out /usr/ local /mongodb/mongo.keyfile $ chmod 400 /usr/ local /mongodb/mongo.keyfile |
3.将步骤1中生成的keyfile拷贝到其它成员
注意,要将keyfile文件的属主改成mongodb的安装用户,通常是mongod。
4.开启访问控制后启动所有成员节点
启动前,修改配置,开启访问控制:
1 2 3 4 5 6 7 8 9 | # vi /etc/mongod.conf security: authorization : enabled keyFile: /usr/ local /mongodb/mongo.keyfile replication: replSetName: <replicaSetName> net: bindIp: localhost,<hostname(s)|ip address(es)> |
然后启动mongodb实例
比如:
1 | mongod --config <path-to-config-file> |
1 | systemctl restart mongod.servicesystemctl status mongod.service |
5.通过本地接口登录到其中一个节点
使用mongo本地登录。
因为还没有创建用户,只能通过本地接口登录;在创建第一个用户之后,本地接口就会被关闭。
6.初始化副本集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | > config = { _id : "rs0" , members : [ {_id:0, host: "192.168.137.110:27017" }, {_id:1, host: "192.168.137.111:27017" }, {_id:2, host: "192.168.137.112:27017" }, ] } > rs.initiate(config) //初始化副本集 { "ok" : 1, //返回ok:1成功,返回ok:0失败 "operationTime" : Timestamp (1611042829, 1), "$clusterTime" : { "clusterTime" : Timestamp (1611042829, 1), "signature" : { "hash" : BinData(0, "AAAAAAAAAAAAAAAAAAAAAAAAAAA=" ), "keyId" : NumberLong(0) } } } |
rs.initiate()会触发选举,并选举出一个成员为primary。
7.创建管理用户
在刚安装完毕的时候,MongoDB都默认有一个admin数据库,此时admin数据库是空的,没有记录权限相关的信息。
当集合admin.system.users中一个用户都没有时,即使mongod启动时添加了—auth参数,如果没有在admin数据库中添加用户,此时不进行任何认证还是可以做任何操作(不管是否是以—auth参数启动),直到在admin.system.users中添加了一个用户。
加固的核心是只有在admin.system.users中添加用户之后,mongodb的认证,授权服务才能生效。
创建第一个用户后,本地接口就会被关闭。
第一个用户必须具有create其它用户的权限,授予userAdminAnyDatabase角色。
1 2 3 4 5 6 7 8 | admin = db.getSiblingDB( "admin" ) admin.createUser( { user : "fred" , pwd: passwordPrompt(), // or cleartext password roles: [ { role: "userAdminAnyDatabase" , db: "admin" } ] } ) |
或者
1 2 3 | #创建超级管理员账号 use admin db.createUser({ user : "admin" ,pwd: "pwd123" ,roles:[ "root" ]}) |
8.管理员登录验证
1 | mongo -u "fred" -p --authenticationDatabase "admin" |
或者先执行mongo,在mongoshell中执行:
1 | db.getSiblingDB( "admin" ).auth( "fred" , passwordPrompt()) // or cleartext password |
9.创建集群管理员
1 2 3 4 5 6 7 | db.getSiblingDB( "admin" ).createUser( { "user" : "ravi" , "pwd" : passwordPrompt(), // or cleartext password roles: [ { "role" : "clusterAdmin" , "db" : "admin" } ] } ) |
10.创建普通用户和数据库
1 2 3 | use mydb db.createUser({ user : "dbuser" , pwd: "pwd123" , roles: [{ role: "dbOwner" , db: "mydb" }]}) db.auth( 'dbuser' , 'pwd123' ) |
11.数据测试
1 2 3 4 5 6 7 | cd /tmp curl -LO https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json mongoimport --db test --collection restaurants --file /tmp/primer-dataset.json mongo db.restaurants.find().limit( 1 ).pretty() db.restaurants. drop () exit |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2020-05-16 pgaudit安装过程遇到的一些问题