安全最佳实践
安全性是华为云与您的共同责任。华为云负责云服务自身的安全,提供安全的云;作为租户,您需要合理使用云服务提供的安全能力对数据进行保护,安全地使用云。详情请参见责任共担。
本文提供了DDS使用过程中的安全最佳实践,旨在为提高整体安全能力提供可操作的规范性指导。根据该指导文档您可以持续评估DDS的安全状态,更好的组合使用DDS提供的多种安全能力,提高对DDS的整体安全防御能力,保护存储在DDS的数据不泄露、不被篡改,以及数据传输过程中不泄露、不被篡改。
本文从以下几个维度给出建议,您可以评估DDS使用情况,并根据业务需要在本指导的基础上进行安全配置。
- 建议避免绑定EIP直接通过互联网访问DDS
- 避免使用常用密码
- 禁止使用默认端口号
- 限制DDS的最大连接数
- 关闭IPv6功能
- 关闭脚本运行功能
- 建议开启审计功能
- 建议开启加密通信
- 开启磁盘加密
- 开启备份功能
- 设置秒级监控和告警规则
- 版本升级
- 检查角色的合理性
建议避免绑定EIP直接通过互联网访问DDS
避免DDS部署在互联网或者DMZ里,应该将DDS部署在公司内部网络,使用路由器或者防火墙技术把DDS保护起来,避免直接绑定EIP方式从互联网访问DDS。通过这种方式防止未授权的访问及DDos攻击等。不推荐绑定弹性公网IP,如果业务必需,请务必设置安全组。
限制DDS的最大连接数
如果DDS的连接数过高,会消耗服务器过多的资源,导致OPS(query、insert、update、delete)等操作响应变慢,同时也要根据操作系统环境来设置最大连接数net.maxIncomingConnections,如果高于操作系统接收的最大线程数,设置无效。详情请参见参数调优。
关闭脚本运行功能
启用javascriptEnabled选项security.javascriptEnabled,可以在mongod 服务端运行javascript脚本,存在安全风险。禁用javascriptEnabled选项,mapreduce、group命令等将无法使用。如果您的应用中没有mapreduce等操作的需求,为了安全起见,建议关闭javascriptEnabled选项。详情请参见参数调优。
建议开启加密通信
如果未配置SSL加密通信,那么在Mongo客户端和服务器之间传输的数据,容易受到窃听、篡改和"中间人"攻击。为了提高数据传输的安全性,建议您开启SSL加密通信。详情请参见设置SSL数据加密。
设置秒级监控和告警规则
DDS默认支持对实例进行监控,当监控指标的值超出设置的阈值时就会触发告警,系统会通过SMN自动发送报警通知给云账号联系人,帮助您及时了解DDS实例的运行状况。请您结合实际的业务,设置合适的监控和告警规则。详情请参见监控与告警。
检查角色的合理性
DDS支持“基于角色”的方法授予账号对数据和命令的访问权限。建议管理员结合业务需要,遵从最低授权原则,创建合适的自定义角色,对账号进行授权。如果发现账号权限过大,请结合业务需要,对账号权限进行更新或者删除。
序号 |
检查项 |
描述 |
---|---|---|
1 |
检查在用户表中存在userAdmin角色的用户 |
当在admin数据库定义了userAdmin角色的用户后,该用户被提供了任何用户的任何权限的能力,即拥有这个角色的用户可以在任何数据库上定义它们自己的权限。 |
2 |
检查在用户表中存在userAdminAnyDatabase角色的用户 |
当定义了userAdminAnyDatabase角色的用户后,该用户被提供了任何用户的任何权限的能力,即拥有这个角色的用户可以在任何数据库上定义它们自己的权限。 |
3 |
检查拥有anyAction动作权限的角色 |
当定义了anyAction动作权限的角色,该角色用户拥有对应数据库的任何操作,不利于权限的管理。 |
4 |
检查拥有anyResource动作权限的角色 |
当定义了anyResource动作权限的角色,该角色用户拥有对应数据库的所有操作资源,不利于权限的管理。 |
5 |
检查拥有changeCustomData动作权限的角色 |
当定义了changeCustomData动作权限的角色,该角色用户拥有对应数据库所有用户自定义信息的更改权限,不利于权限的管理。 |
6 |
检查拥有changePassword动作权限的角色 |
当定义了changePassword动作权限的角色,该角色用户即可拥有对应数据库所有用户密码的更改权限,不利于权限的管理。 |
7 |
检查拥有createRole动作权限的角色 |
当定义了createRole动作权限的角色,该角色用户即可拥有对应数据库中任意创建角色的权限,不利于权限的管理。 |
8 |
检查拥有createUser动作权限的角色 |
当定义了createUser动作权限的角色,该角色用户即可拥有对应数据库中任意创建用户的权限,不利于权限的管理。 |
9 |
检查拥有dropRole动作权限的角色 |
当定义了dropRole动作权限的角色,该角色用户即可拥有对应数据库中删除任意角色的权限,不利于权限的管理。 |
10 |
检查拥有dropUser动作权限的角色 |
当定义了dropUser动作权限的角色,该角色用户即可拥有对应数据库中删除任意用户的权限,不利于权限的管理。 |
11 |
检查拥有grantRole动作权限的角色 |
当定义了grantRole动作权限的角色,该角色用户即可拥有对应数据库中任何用户授予任意角色的权限,不利于权限的管理。 |
12 |
检查拥有revokeRole动作权限的角色 |
当定义了revokeRole动作权限的角色,该角色用户即可拥有对应数据库中任何用户取消任意角色的权限,不利于权限的管理。 |
13 |
检查拥有authSchemaUpgrade动作权限的角色 |
当定义了authSchemaUpgrade动作权限的角色,该角色用户即可拥有执行authschemaupgrade的权限,不利于权限的管理。authschemaupgrade命令可以修改用户认证转换格式。 |
14 |
检查拥有closeAllDatabases动作权限的角色 |
当定义了closeAllDatabases动作权限的角色,该角色用户即可拥有执行closeAllDatabases命令的权限,关闭所有数据库并释放MongoDB占用的内存,不利于权限的管理。 |
15 |
检查拥有dropDatabase动作权限的角色 |
当定义了dropDatabase动作权限的角色,该角色用户即可拥有执行dropDatabase命令的权限,删除任意的数据库,不利于权限的管理。 |
16 |
检查拥有getParameter动作权限的角色 |
当定义了getParameter动作权限的角色,该角色用户即可拥有执行getParameter命令的权限,任意查看命令行选项的值,不利于权限的管理。 |
17 |
检查拥有setParameter动作权限的角色 |
当定义了setParameter动作权限的角色,该角色用户即可拥有执行setParameter命令的权限,任意修改命令行选项的值,不利于权限的管理。 |
18 |
检查拥有shutdown动作权限的角色 |
当定义了shutdown动作权限的角色,该角色用户即可拥有执行shutdown命令的权限,清除所有数据库资源,然后终止进程,不利于权限的管理。 |
19 |
检查拥有getCmdLineOpts动作权限的角色 |
当定义了getCmdLineOpts动作权限的角色,该角色用户即可拥有执行getCmdLineOpts命令的权限,获得argv和parsed两个字段,argv包含用于调用mongod或mongos命令字符串,parsed包含所有运行时选项,不利于权限的管理。 |
20 |
检查拥有internal动作权限的角色 |
当定义了internal动作权限的角色,该角色用户即可拥有对应数据库进行任何操作的权限,不利于权限的管理。 |
21 |
检查拥有readWrite角色的用户 |
当定义了readWrite角色的用户,该角色用户即可拥有对应数据库进行读的权限加上更改数据的权限,不利于权限的管理。 |
22 |
检查拥有backup角色的用户 |
当定义了backup角色的用户,该角色用户即可拥有在admin数据库mms.bak文档中insert、update的权限,不利于权限的管理。 |
23 |
检查拥有clusterAdmin角色的用户 |
当定义了clusterAdmin角色的用户,该角色用户即可拥有最高集群管理的权限,这个角色包括了clusterManager,clusterMonitor,hostManager角色的权限,不利于权限的管理。 |
24 |
检查拥有clusterManager角色的用户 |
当定义了clusterManager角色的用户,在集群上管理和监视操作,该角色用户可以有权管理分别被用来共享、复制的设置本地数据库的权限,不利于权限的管理。 |
25 |
检查拥有clusterMonitor角色的用户 |
当定义了clusterMonitor角色的用户,该角色用户即可拥有为监视工具提供只读的权限,不利于权限的管理。 |
26 |
检查拥有dbAdmin角色的用户 |
当定义了dbAdmin角色的用户,该角色用户即可拥有对应数据库管理员的权限,不利于权限的管理。 |
27 |
检查拥有dbAdminAnyDatabase角色的用户 |
当定义了dbAdminAnyDatabase角色的用户,该角色用户即可拥有和dbAdmin角色一样的权限,除了适用于集群内所有数据库这个特性,这个角色也为整个集群提供listDatabases操作,不利于权限的管理。 |
28 |
检查拥有dbOwner角色的用户 |
当定义了dbOwner角色的用户,该角色用户即可拥有执行数据库所有管理操作的权限,这个角色合并了readWrite,dbAdmin,userAdmin角色的权限,不利于权限的管理。 |
29 |
检查拥有hostManager角色的用户 |
当定义了hostManager角色的用户,该角色用户即可拥有监视和管理服务器的权限,不利于权限的管理。 |
30 |
检查拥有readAnyDatabase角色的用户 |
当定义了readAnyDatabase角色的用户,该角色用户即可拥有读任何数据库的权限,这个角色也为整个集群提供listdatabases操作,不利于权限的管理。 |
31 |
检查拥有readWriteAnyDatabase角色的用户 |
当定义了readWriteAnyDatabase角色的用户,该角色用户即可拥有读写任何数据库的权限,这个角色也为整个集群提供listdatabases操作,不利于权限的管理。 |
32 |
检查拥有restore角色的用户 |
当定义了restore角色的用户,该角色用户即可拥有还原备份所需的权限,不利于权限的管理。 |
33 |
检查拥有root角色的用户 |
当定义了root角色的用户,该角色用户即可拥有所有资源的所有操作,包括readWriteAnyDatabase,dbAdminAnyDatabase,userAdminAnyDatabases,clusterAdmin,restore角色的权限,不利于权限的管理。 |
34 |
检查拥有userAdmin角色的用户 |
当定义了userAdmin角色的用户,该角色用户即可拥有授权任意用户的权限,包括它们自己的,不利于权限的管理。 |
35 |
检查拥有userAdminAnyDatabase角色的用户 |
当定义了userAdminAnyDatabase角色的用户,该角色用户即可拥有授权所有数据库任意用户的权限,包括它们自己的,不利于权限的管理。 |