Mongodb 集群加keyFile认证,Mongodb用户管理(转:http://blog.youkuaiyun.com/wlzjsj/article/details/61421230)

介绍

自从远古计绳结开始,数据库的存储就注定了今天的地位和多样性,Nosql的出现更是解决了现有的关系型数据库无法解决的一些难题,对高性能,灵活度,扩展性,海量数据的问题。随之而出现的高速内存索引数据库、列式存储、图像存储等等,这篇文章主要讲的是mongodb文档型数据库,mongodb目前也在各种大中小型创业型公司大受欢迎,占据了一定的地位。文章讲解的是如何搭建一个安全认证的mongodb集群(安全认证还是很重要,各大数据库被沦陷后,怎么有效预防被勒索比特币….)

mongodb集群有三种模式,主从模式,副本集模式、sharding分片模式。主从模式官网也不再推荐上生产环境,主要是安全性太低。副本集和sharding模式目前是用的最广的方案,通常这2种方案的选择通过数据量和并发数来权衡。在GB级别的基本上副本集方案可满足,TB级别或以上采用sharding模式,解决单机容量和单机并发能力。这两种既有自己的优势也有自己的缺点,比如sharding模式分片越多,性能自然下降越多。

进入正题,讲解副本集的搭建以及配置安全认证。副本集有两种方案,一种是有仲裁节点(Arbiter

),如图1,一种是不含仲裁节点,如图2所示。

   

图1 一主一从一仲裁          

                                  

   图2 多节点副本

 

当数据节点为偶数时候需要增加仲裁节点,故障时候仲裁新的主,当数据节点为奇数时候无需仲裁节点,根据id优先级选举新的主。仲裁节点本身不存储数据,如果配置仲裁节点使用虚拟机即可。本文为了节约机器提高数据的安全度使用的是不带仲裁节点的方案:

一、     环境:

系统:Ubuntu 16.04.02 LTS

mongodb版本:https://www.mongodb.org/dr/fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.2.tgz

服务器:

Mongodb 主机

服务器端口地址

默认角色

mongodb主机 1

10.10.1.163:30010

primary

mongodb主机 2

10.10.1.109: 30010

secondary

mongodb主机 3

10.10.1.110: 30010

secondary

 

二、     安装mogodb

2.1 创建mongo用户

   略(如果root启动,可忽略本步骤,启动用户是mongo就必须集群目录授权mongo用户)

2.2 集群目录

创建mongo集群目录,最好三台配置都一样,方便维护(以下操作三台服务器均一样);

解压二进制压缩包并复制到/usr/local目录下

tar xzf mongodb-linux-x86_64-3.4.2.tgz

mv mongodb-linux-x86_64-3.4.2 mongodb-3.4.2

ln –s mongodb-3.4.2 mongodb

创建集群目录:

mkdir –p data/mongo_set/$集群名字/30010

配置集群的配置文件:

# usercenter replset master

bind_ip=10.10.1.163

#指定服务器监听的端口,默认是27017

port=30010

 

#集群名字

replSet=test_set

#以守护进程的方式运行MongoDB

fork=true

 

#一个数据库一个文件夹

directoryperdb=true

 

##启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里

journal = true

 

# 在收到客户数据,检查的有效性

objcheck=true

 

#操作日志大小限制2G

oplogSize=2000

 

#pidfile

pidfilepath=/data/mongo_set/test_set/30010/mongo_m30010.pid

 

#指定数据目录,默认是/data/db/。每个mongod进程都需要独立的目录,

#启动mongod时就会在数据目录中创建mongod.lock文件,防止其他mongod进程使用该数据目录。

dbpath=/data/mongo_set/test_set/30010

 

#指定日志输出路径,如果不指定则会在终端输出。每次启动都会覆盖原来的日志,如果不想覆盖就要用--logappend选项

logpath=/data/mongo_set/test_set/30010/mongo30010.log

 

logappend=true

#auth=true

 

#0:关闭,不收集任何数据。1:收集慢查询数据,默认是100毫秒。2:收集所有数据

profile=2

slowms=100

#.禁止HTTP状态接口

nohttpinterface=true

#.禁止REST接口-在生产环境下建议不要启用MongoDB的REST接口

rest=false

 

2.3 三台主机分别启动mongodb

Primary启动: /usr/local/mongodb/bin/mongod –f  /data/mongo_set/test_set/30010/mongodb_m30010.conf

Secondary1:   /usr/local/mongodb/bin/mongod –f  /data/mongo_set/test_set/30010/mongodb_s30010.conf

Secondary2:   /usr/local/mongodb/bin/mongod –f  /data/mongo_set/test_set/30010/mongodb_s30010.conf

三、     配置副本集

3.1 配置主primary

此时我们并没有配置任何认证账户,我们登录主库:

root@xxxx:~#mongo 10.10.1.163:30010

MongoDB server version: 3.4.2

Server has startup warnings:

2017-03-10T20:08:31.847+0800 I STORAGE  [initandlisten]

2017-03-10T20:08:31.847+0800 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine

2017-03-10T20:08:31.847+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem

2017-03-10T20:08:32.115+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.

2017-03-10T20:08:32.115+0800 I CONTROL  [initandlisten]

2017-03-10T20:08:32.116+0800 I CONTROL  [initandlisten]

2017-03-10T20:08:32.116+0800 I CONTROL  [initandlisten] ** WARNING: You are running on a NUMA machine.

2017-03-10T20:08:32.116+0800 I CONTROL  [initandlisten] **          We suggest launching mongod like this to avoid performance problems:

2017-03-10T20:08:32.116+0800 I CONTROL  [initandlisten] **              numactl --interleave=all mongod [other options]

2017-03-10T20:08:32.116+0800 I CONTROL  [initandlisten]

2017-03-10T20:08:32.116+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.

2017-03-10T20:08:32.116+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'

2017-03-10T20:08:32.116+0800 I CONTROL  [initandlisten]

2017-03-10T20:08:32.116+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.

2017-03-10T20:08:32.116+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'

2017-03-10T20:08:32.116+0800 I CONTROL  [initandlisten]

2017-03-10T20:08:32.116+0800 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 65535 processes, 655350 files. Number of processes should be at least 327675 : 0.5 times number of files.

2017-03-10T20:08:32.116+0800 I CONTROL  [initandlisten]

test_set:PRIMARY>

test_set:PRIMARY> use admin

switched to db admin

3.2 配置副本几点及权重

test_set:PRIMARY> config_test={_id : 'usercenter',members : [{_id : 0, host : '10.10.1.1.163:30010'},{_id : 1, host : '10.10.1.109:30010'},{_id : 2, host : '10.10.1.110:30010'}]}

#初始化副本集

test_set:PRIMARY> rs.initiate(config_ test);

{ "ok" : 1 }

 

3.3查看副本集群状态

test_set:PRIMARY> rs.status()

{

  "set" : "test_set",

  "date" : ISODate("2017-03-11T08:25:02.832Z"),

  "myState" : 1,

  "term" : NumberLong(5),

  "heartbeatIntervalMillis" : NumberLong(2000),

  "optimes" : {

            "lastCommittedOpTime" : {

                       "ts" : Timestamp(1489220694, 1),

                       "t" : NumberLong(5)

            },

            "appliedOpTime" : {

                       "ts" : Timestamp(1489220694, 1),

                       "t" : NumberLong(5)

            },

            "durableOpTime" : {

                       "ts" : Timestamp(1489220694, 1),

                       "t" : NumberLong(5)

            }

  },

  "members" : [

            {

                       "_id" : 0,

                       "name" : "10.10.1.163:30010",

                       "health" : 1,

                       "state" : 1,

                       "stateStr" : "PRIMARY",

                       "uptime" : 72991,

                       "optime" : {

                                 "ts" : Timestamp(1489220694, 1),

                                 "t" : NumberLong(5)

                       },

                       "optimeDate" : ISODate("2017-03-11T08:24:54Z"),

                       "electionTime" : Timestamp(1489147722, 1),

                       "electionDate" : ISODate("2017-03-10T12:08:42Z"),

                       "configVersion" : 1,

                       "self" : true

            },

            {

                       "_id" : 1,

                       "name" : "10.10.1.109:30010",

                       "health" : 1,

                       "state" : 2,

                       "stateStr" : "SECONDARY",

                       "uptime" : 72980,

                       "optime" : {

                                 "ts" : Timestamp(1489220694, 1),

                                 "t" : NumberLong(5)

                       },

                       "optimeDurable" : {

                                 "ts" : Timestamp(1489220694, 1),

                                 "t" : NumberLong(5)

                       },

                       "optimeDate" : ISODate("2017-03-11T08:24:54Z"),

                       "optimeDurableDate" : ISODate("2017-03-11T08:24:54Z"),

                       "lastHeartbeat" : ISODate("2017-03-11T08:25:02.583Z"),

                       "lastHeartbeatRecv" : ISODate("2017-03-11T08:25:01.359Z"),

                       "pingMs" : NumberLong(0),

                       "syncingTo" : "10.10.1.163:30010",

                       "configVersion" : 1

            },

            {

                       "_id" : 2,

                       "name" : "10.10.1.110:30010",

                       "health" : 1,

                       "state" : 2,

                       "stateStr" : "SECONDARY",

                       "uptime" : 72971,

                       "optime" : {

                                 "ts" : Timestamp(1489220694, 1),

                                 "t" : NumberLong(5)

                       },

                       "optimeDurable" : {

                                 "ts" : Timestamp(1489220694, 1),

                                 "t" : NumberLong(5)

                       },

                       "optimeDate" : ISODate("2017-03-11T08:24:54Z"),

                       "optimeDurableDate" : ISODate("2017-03-11T08:24:54Z"),

                       "lastHeartbeat" : ISODate("2017-03-11T08:25:02.442Z"),

                       "lastHeartbeatRecv" : ISODate("2017-03-11T08:25:01.007Z"),

                       "pingMs" : NumberLong(0),

                       "syncingTo" : "10.10.1.163:30010",

                       "configVersion" : 1

            }

  ],

  "ok" : 1

}

test_set:PRIMARY>

 

3.4 查看副本同步状态

test_set:PRIMARY>  db.printSlaveReplicationInfo();

source: 10.10.1.109:30010

  syncedTo: Sat Mar 11 2017 16:25:24 GMT+0800 (CST)

  0 secs (0 hrs) behind the primary

source: 10.10.1.110:30010

  syncedTo: Sat Mar 11 2017 16:25:24 GMT+0800 (CST)

           0 secs (0 hrs) behind the primary

一切ok,该副本集搭建完成。目前副本集架构如下所示:

 

 

四、     增加安全认证机制KeyFile

4.1 集群之间的安全认证

集群之间的复制增加keyFile认证

#生成key

openssl rand -base64 745 > /data/mongo_set/usercenter/30010/mongodb-keyfile

chmod 600 /data/mongo_set/usercenter/30010/mon-keyfile

# 该key的权限必须是600

将该key放到集群中机器的每一台上,记住必须保持一致,权限设置成600;

4.2 修改配置

在mongodb.conf启动配置文件中增加配置项

#安全认证机制

keyFile=/data/mongo_set/test_set/30010/mon-keyfile

 

4.3 主库配置用户

也可后面配置,开启keyfile认证就默认开启了auth认证了,为了保证后面可以登录,我提前创建了用户:
 

先创建管理员账户

db.createUser( 

    user:"admin",  

    pwd:"xxxxxx", 

    roles:[{role:"userAdminAnyDatabase",db:"admin"}] 

); 

db.createUser( {

 user: "root",

 pwd: "xxxxxxx",

 roles: [ { role: "root", db: "admin" } ]

 });

#认证用户

db.auth("admin","xxxxxxx")

db.auth("root","xxxxxxx")

 

4.4 重启进入

重新启动mongodb,记住重新启动时候,keyfile的指定如果没有在配置文件中配置,就必须启动时候使用参数keyfile指定,关闭顺序注意下,mongodb集群有自动切换主库功能,如果先关主库,主库就切换到其它上面去了,这里预防主库变更,从库关闭后再关闭主库。

mongo 10.10.1.163:30010/admin -u root –p

2017-03-10T20:08:32.116+0800 I CONTROL  [initandlisten]

test_set:PRIMARY> use admin

switched to db admin

重新查看从库和集群状态都是正常。

五、     创建用户和用户数据库

5.1 启动认证

开启了安全认证就可以开始对每个数据库进行安全认证了,首先给用户创建一个数据库:

test_set:PRIMARY> use user_test

switched to db user_test

mongodb创建数据库直接use即可,此时show dbs是看不到该库的,需要插入一条数据才会现实出来,这里不演示;

创建用户数据库的用户:

db.createUser(

  {

    user: “test_user",

    pwd: "xxxxxx",

    roles: [ { role: "readWrite", db: "user_test" } ]

  }

);

创建完成会显示成功,可以用db.system.users.find()查看所有用户验证用户是否存在;

5.2 验证用户登录

#client操作

mongo 10.10.1.163:30010/user_test –u user_test –p

MongoDB shell version v3.4.2

Enter password:

connecting to: mongodb://192.168.1.163:30010/user_center

MongoDB server version: 3.4.2

user_test:PRIMARY>

<think>我们遇到了一个关于apt update的错误,具体是MongoDB的仓库(http://repo.mongodb.org/apt/debian)没有Release文件,导致更新失败。 根据错误信息,仓库地址是用于Debian Buster的,但我们的系统可能是其他版本(比如trixie或bookworm),或者该仓库已经不再支持4.0版本。 解决方案: 1. 检查系统版本,确认是否与仓库匹配。 2. 移除或更新MongoDB的仓库源,使其匹配当前系统版本或使用官方推荐的通用源。 步骤: 1. 查看系统版本:`lsb_release -a` 2. 根据系统版本调整MongoDB的源。 但是,从错误信息中我们看到: 命中:1 http://mirrors.tuna.tsinghua.edu.cn/debian trixie InRelease 命中:3 http://deb.debian.org/debian bookworm InRelease 说明系统可能同时有trixie和bookworm的源,而MongoDB的源是buster(较旧的版本),这显然不匹配。 因此,我们需要: - 移除旧的MongoDB源 - 添适合当前系统的MongoDB源(如果需要的话) 由于我们不再需要MongoDB(或者需要重新安装),我们可以先移除这个无效的源。 具体操作: 1. 找到MongoDB的源列表文件: 通常位于`/etc/apt/sources.list.d/`目录下,文件名可能为`mongodb-org-4.0.list`或类似。 2. 删除该文件: ```bash sudo rm /etc/apt/sources.list.d/mongodb-org-4.0.list ``` 3. 或者,如果不想删除,可以注释掉该文件中的内容(但删除更彻底)。 4. 然后更新: ```bash sudo apt update ``` 如果问题仍然存在,可以尝试清除已缓存的索引: ```bash sudo apt clean sudo rm -rf /var/lib/apt/lists/* sudo apt update ``` 但是,注意:删除`/var/lib/apt/lists/*`会清除所有缓存的索引,需要重新下载。 另外,错误信息中还有关于Ubuntu安全源签名的警告,但这不是主要问题,可以暂时忽略。 如果之后需要重新安装MongoDB,应该使用与当前系统匹配的源。例如,对于Debian Trixie,可以查看MongoDB官方文档获取正确的源设置。 例如,MongoDB官方通常提供通用的安装说明,使用以下方式添源: ```bash # 导入GPG密钥 wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add - # 创建源列表文件(适用于Debian 12/bookworm) echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/debian bookworm/mongodb-org/7.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list ``` 但请注意,当前MongoDB可能不支持Debian Trixie(代号),因此可能需要使用bookworm的源(如果系统兼容)或者等待官方支持。 根据你的需求,如果你不再需要MongoDB,那么移除源即可。 现在,执行以下命令来修复更新错误: 步骤1:删除MongoDB的源列表文件 步骤2:更新apt 代码实现: ```bash # 删除MongoDB的源文件,这里假设文件名为mongodb-org-4.0.list,但实际可能不同,请根据实际情况调整 sudo rm /etc/apt/sources.list.d/mongodb-org-4.0.list # 或者,如果不知道具体文件名,可以列出并删除相关文件 # 例如,删除所有包含mongodb的源文件 sudo rm -f /etc/apt/sources.list.d/*mongodb*.list # 然后更新 sudo apt update ``` 如果执行`sudo apt update`后仍然有错误,可以尝试清除缓存(如上所述)。 注意:如果系统中没有其他问题,更新应该可以正常进行。 解释: - 我们删除了导致问题的MongoDB仓库源文件,因为该仓库已经不再提供对应版本的Release文件(可能因为版本过旧)。 - 这样,apt就不会再尝试从该仓库更新,从而解决了404错误。 如果将来需要安装MongoDB,请参考官方文档添适合当前Debian版本的仓库。 另外,关于警告“Policy will reject signature within a year”,这是因为Ubuntu安全源的签名即将过期(在一年内),但这不影响当前使用,可以暂时忽略。 如果问题完全解决,那么就可以继续其他操作。 如果问题没有解决,请检查其他源是否也有问题。 相关操作代码: ```bash # 列出所有源文件 ls /etc/apt/sources.list.d/ # 查看系统版本 lsb_release -a # 清除缓存(如果必要) sudo apt clean sudo rm -rf /var/lib/apt/lists/partial/* sudo apt update ``` 最后,我们执行更新命令,应该可以正常完成。 如果问题仍然存在,请检查是否有其他无效的源。 现在,我们提供完整的解决方案代码: ```bash # 删除所有mongodb相关的源文件 sudo rm -f /etc/apt/sources.list.d/*mongodb*.list # 清除apt缓存 sudo apt clean sudo apt update # 这一步可能会提示有错误,因为缓存索引可能还在,但删除列表后更新会重新获取 # 如果更新仍有错误,可以尝试删除所有索引(谨慎,因为会删除所有缓存) sudo rm -rf /var/lib/apt/lists/* sudo apt update ``` 注意:删除`/var/lib/apt/lists/*`后,下次`apt update`会重新下载所有源的索引,所以可能会慢一些。 执行上述步骤后,问题应该解决。 如果问题仍然存在,请检查`/etc/apt/sources.list`文件中是否有关于mongodb的条目,如果有,请将其注释或删除。 例如,使用编辑器打开: sudo nano /etc/apt/sources.list 然后注释掉包含`repo.mongodb.org`的行(在行首添`#`)。 保存后再次运行`sudo apt update`。 现在,问题应该得到解决。 最后,我们提出相关问题:</think>### 解决 MongoDB 源更新错误 您遇到的错误是因为 MongoDB 官方已停止对 Debian Buster (10) 的支持,导致仓库无法访问。以下是完整的解决方案: ```bash # 1. 删除无效的 MongoDB 源 sudo rm /etc/apt/sources.list.d/mongodb-org-4.0.list # 2. 更新系统软件包列表(忽略错误源) sudo apt update --allow-insecure-repositories # 3.正确的 MongoDB 源(根据您的系统版本选择) # 选项 A: 如果系统是 Debian Bookworm (12) echo "deb [arch=amd64,arm64] https://repo.mongodb.org/apt/debian bookworm/mongodb-org/7.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list # 选项 B: 如果系统是 Debian Trixie (13) echo "deb [arch=amd64,arm64] https://repo.mongodb.org/apt/debian trixie/mongodb-org/7.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list # 4. 导入 MongoDB GPG 密钥 wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add - # 5. 更新软件包列表 sudo apt update # 6. 修复依赖关系 sudo apt --fix-broken install # 7. 清理缓存 sudo apt clean sudo rm -rf /var/lib/apt/lists/* ``` ### 问题分析与解释: 1. **错误原因**: - MongoDB 已停止支持 Debian Buster (4.0 版本) - 源地址 `http://repo.mongodb.org/apt/debian buster/mongodb-org/4.0` 返回 404 - 系统检测到多个不兼容的 Debian 版本源(trixie/bookworm) 2. **解决方案要点**: - **步骤1**:删除无效的旧版 MongoDB 源文件 - **步骤3**:根据实际系统版本添正确的源 - Bookworm 对应 Debian 12 - Trixie 对应 Debian 13 - **步骤4**:必须导入新的 GPG 密钥才能验证软件包 - **步骤6**:修复因源变更导致的依赖断裂问题 3. **注意事项**: - 如果不需要 MongoDB,只需执行步骤1和2即可 - 如果系统是 Ubuntu,需要使用不同的源格式: ```bash echo "deb [arch=amd64] https://repo.mongodb.org/apt/ubuntu $(lsb_release -sc)/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list ``` ### 验证修复: ```bash # 检查源列表 grep -R "mongodb" /etc/apt/sources.list.d/ # 测试更新 sudo apt update # 检查 MongoDB 可用版本 apt-cache policy mongodb-org ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值