一、概述
看到站内很多等保测评的文章,但是没看到关于MongoDB的,正好最近在整理MongoDB的测评指导书,就把相关内容写成文章做个记录。因为测评工作中接触的大部分是三级系统,以下内容皆以等保三级标准讲述。
二、安装小记
MongoDB从发行版本分为社区版和企业版,从部署方式可分为单机、主从、副本集(Replica Set)和分片(Sharding)四种模式,其中主从模式已经不建议使用。本次安装因环境受限,仅安装单机模式,操作系统为CentOS 7.8.2003,数据库版本为3.6.19 Enterprise。
使用vim /etc/yum.repos.d/mongodb-enterprise.repo创建yum源,文件内容如下图,使用yum install -y mongodb-enterprise完成安装。
三、MongoDB介绍
3.1 MongoDB配置文件
通过yum安装完成后,配置文件默认位于/etc/mongod.conf,文件内容使用YAML格式,配置参数前需空两格,如下图所示。默认启用的配置为系统日志、存储、进程管理和网络,身份鉴别功能配置参数位于security下,需管理员手动开启并配置。其他如传输加密、数据加密、安全审计等功能均在此配置。
关于bindIp,发现有部分人对它产生了误解,这里简单说明一下,bindIp是对服务器上指定的ip接口进行监听,如下图所示参数为127.0.0.1,那么MongoDB仅对本机提供服务,网段内的其他服务器无法连接该MongoDB;假设这个参数为192.168.172.134,那么网段内的其他服务器均可连接该MongoDB,而本机无法直接,需通过host参数指定192,168.172.134才可连接MongoDB。
3.2 MongoDB启动
MongoDB有三种启动方式,1)通过命令systemctl start mongod.serivce启动,该方式将身份鉴别配置写入配置文件,启动时直接调用配置文件中启用的配置。如下图所示,无报错则启动成功;
2)通过命令mongod -f /etc/mongod.conf启动,该方式将身份鉴别配置写入任意位置的配置文件,启动时指定配置文件调用已启用的配置。如下图所示,提示进程启动成功;
3)通过命令mongod -dbpath=/var/lib/mongo -port=27107启动,该方式在启动时直接指定端口、数据库文件路径等参数。如下图所示,无报错则启动成功。
使用该方法需注意MongoDB为前台方式启动,关闭终端会导致MongoDB进程关闭,无法提供服务。启动时添加fork和logpath参数则可以保持在后台运行,如下图所示,提示进程启动成功。
建议通过mongod.conf配置文件来启动MongoDB服务。
3.3 MongoDB登录
MongoDB一般通过mongo shell或者第三方管理工具连接(如navicat),通过mongo shell连接可直接在操作系统命令行输入mongo登录数据库,如下图所示为未开启身份鉴别功能的界面:
如果在配置文件中修改了端口号,还需指定port参数才可连接,如果bindIp不为127.0.0.1或0.0.0.0,则还需要指定ip才能连接成功。
开启身份鉴别功能后无警告信息,操作前必须使用db.auth()进行登录。
通过第三方工具连接前需先在配置文件中绑定与外部连接的ip,如主机的本地ip为192.168.172.134,则在配置文件中bindIp处添加此ip,如下图所示:
填写服务器ip后添加即可连接。
3.4 MongoDB账户及角色
在MongoDB刚安装完成时,默认未启用身份鉴别功能且未不存在默认账户,仅存在默认的数据库角色,需管理员登录数据库创建管理员账户后再开启身份鉴别功能。在MongoDB中创建账户时除账户、口令外,还需指定角色及可访问的数据库,创建账户时的roles中包括role和db两个参数,可指定多个role和db,role为分配给账户的角色,通过角色来实现权限的控制,db为指定可以访问的数据库,该账户创建成功后仅可访问指定的数据库。如下表列出的为MongoDB中默认的角色。
分类 | 角色 | 简介 |
数据库用户角色 | read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 | |
数据库管理角色 | dbAdmin | 指定数据库的管理员 |
dbOwner | 代表数据库所有者,拥有最高该数据库最高权限。比如新建索引等 | |
userAdmin | 允许用户向system.users写入,可以找指定数据库里创建、删除和管理用户 | |
集群管理角色 | clusterAdmin | / |
clusterManager | / | |
clusterMonitor | / | |
hostManager | / | |
备份恢复角色 | backup | 备份功能账户 |
restore | 还原功能账号 | |
管理所有数据库角色 | readAnyDatabase | 赋予用户所有数据库的读权限 |
readWriteAnyDatabase | 赋予用户所有数据库的读写权限 | |
userAdminAnyDatabase | 赋予用户所有数据库的userAdmin权限 | |
dbAdminAnyDatabase | 赋予用户所有数据库的dbAdmin权限 | |
超级用户角色 | root | 提供对readWriteAnyDatabase,dbAdminAnyDatabase,userAdminAnyDatabase,clusterAdmin,恢复和备用组合的操作和所有资源的访问。 |
内部角色 | __system | 提供对数据库中的任何 object 采取任何操作的权限。**除了在特殊情况下,不要将此角色分配给代表 applications 或人工管理员的用户 objects。 |
通过mongo命令连接后,使用use admin切换至admin数据库,通过如下命令创建管理员账户:
db.createUser( { user: "dba", pwd: "dba", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] })
如下图所示,账号创建成功。
接下来可到配置文件中开启身份鉴别功能。
3.5 MongoDB关闭
如需管理MongoDB服务,可通过以下几种方式实现。
使用systemctl start mongod.service启动后,可使用systemctl stop mongod.service关闭MongoDB。
使用mondog启动后可在mongo shell中使用db.shutdownServer()关闭MongoDB。
除上述两种方法外,还可通过kill -9 加上mongo服务的pid强制关闭mongo进程。
四、测评项a
a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换。
4.1 应核查用户在登录时是否采用了身份鉴别措施;
1)使用命令grep authorization -A2 -B2 /etc/mongod.conf检查配置文件mongod.conf中是否开启authorization,使用grep enableLocalhostAuthBypass -A2 -B2 /etc/mongod.conf查看是否存在本地用户绕过身份验证。适用于第三方管理工具远程连接、systemctl start mongod.service和mongod -f /etc/mongod.conf的启动方式。
推荐返回值为:authorization为enabled,enableLocalhostAuthBypass为false。
或查看数据库管理员登录过程,验证是否添加-auth参数。适用于未指定配置文件直接添加参数的启动方式,如mongod -dbpath=/var/lib/mongo -auth。
推荐值为:启动参数中包含-auth。
2)验证数据库管理员登录过程,是否采用db.auth()进行身份鉴别。适用于使用mongo shell连接。
推荐值为:使用db.auth()进行身份验证。
使用第三方连接工具远程连接时,可查看数据库连接信息是否开启验证,如下图以navicat为例。
推荐值为:验证开启。
如果身份验证功能未开启的话,a项直接不符合了。
4.2 应核查用户列表确认用户身份标识是否具有唯一性;
使用mongo shell连接进入数据库,切换至admin数据库后使用管理员登录数据库,或使用第三方管理工具远程连接至admin数据库,使用命令db.system.users.find().pretty()查看数据库用户列表。查看是否存在相同的user和userId(一般不可能相同),因MongoDB的账户和库关联,可能在不同的库下存在存在相同的账户,应避免不同人员使用同一账户名。
推荐值为:user和userId均为唯一。
4.3 应核查用户配置信息或测试验证是否不存在空口令用户;
在开启身份鉴别功能的情况下,经测试无法设置空口令账户,如下图所示:
4.4应核查用户鉴别信息是否具有复杂度要求并定期更换。
在查阅各种中英文文档和官方文档后,确认MongoDB没有复杂度校验功能,也没有定期更换的策略要求,仅有一个口令不为空的限制。只能看用户自己对口令的要求了。
4.5高风险说明
该项在二级及以上系统中为高风险项,在高风险判定(20200803版)满足一项即为高风险,只能要求客户做好口令管理工作了。
五、测评项b
b)应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施。
5.1 应核查是否配置并启用了登录失败处理功能;
使用grep authFailedDelayMs /etc/mongod.conf查看是否设置登录失败处理功能,另外这个是3.4企业版之后新添加的功能。
这个参数是指口令输错后需要等待的毫秒数,参数范围为0-5000。也就是说只要你口令输入错误,需要等最高5s后才能再次输入。
5.2 应核查是否配置并启用了限制非法登录功能,非法登录达到一定次数后采取特定动作,如账户锁定等;
在查阅各种中英文文档和官方文档后,发现确实没有次数限制。
5.3 应核查是否配置并启用了登录连接超时及自动退出功能。
在查阅各种中英文文档和官方文档后,没发现对于mongo shell和第三方管理工具的超时设置。
六、测评项c
c)当进行远程管理时,应采取必要措施防止鉴别信息在网络传输中被窃听。
6.1 应核查是否采用加密等安全方式对系统进行远程管理,防止鉴别信息在网络传输过程中被窃听。
使用grep -A2 ssl /etc/mongod.conf查看配置文件中是否开启ssl功能,记录mode的参数。
推荐值为:开启ssl
关于鉴别信息窃听,我使用物理机上的navicat连接虚拟机里的MongoDB,在未开启ssl的情况下抓包重复测试了好几遍都没看到明文的口令。我甚至还拿虚拟机里的mongo shell连接阿里云服务器上的MongoDB,测试结果也是一样的。通过一番查找发现数据包里的n=root,r=X8tybDmuvIauZnZRVist3Pzhl7q0HI+N.$db.....admin..为用户名、口令和数据库名,其中的口令已经被自动处理了,并且每次连接都会变。这只是3.6版本和4.2版本的一个简单测试,低版本的我没测试,传输过程中不一定会对口令进行处理,结果仅供参考。
建议还是以开启ssl为准,即可以保护鉴别信息,也可以保护业务数据传输安全。
6.2高风险说明
该项在二级及以上系统中为高风险项,在高风险判定(20200803版)需同时满足3条条件才为高风险,不过对3.6和4.2版本测试后发现口令为非明文传输,也就不满足高风险的判定要求了。
七、测评项d
d)应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现。
7.1 应核查是否采用动态口令、数字证书、生物技术和设备指纹等两种或两种以上组合的鉴别技术对用户身份进行鉴别;
7.2 应核查其中一种鉴别技术是否使用密码技术来实现。
数据库在这方面先天不足,只能通过其他措施来实现了。
7.3高风险说明
该项在三级系统中为高风险项,不过在高风险判定(20200803版)列举了多种补偿措施,可根据用户实际情况酌情降低风险等级。
参考链接:
Mongodb 中文文档 - 配置文件选项 | Docs4dev
Configuration File Options — MongoDB Manual