
# 安全最佳实践
安全性是华为云与您的共同责任。华为云负责云服务自身的安全，提供安全的云；作为租户，您需要合理使用云服务提供的安全能力对数据进行保护，安全地使用云。详情请参见[责任共担](https://support.huaweicloud.com/resp-pcre/index.html?product=dds)。
本文提供了DDS使用过程中的安全最佳实践，旨在为提高整体安全能力提供可操作的规范性指导。根据该指导文档您可以持续评估DDS的安全状态，更好地组合使用DDS提供的多种安全能力，提高对DDS的整体安全防御能力，保护存储在DDS的数据不泄露、不被篡改，以及数据传输过程中不泄露、不被篡改。
本文从以下几个维度给出建议，您可以评估DDS使用情况，并根据业务需要在本指导的基础上进行安全配置。
- [建议避免绑定EIP直接通过互联网访问DDS]
- [避免使用常用密码]
- [禁止使用默认端口号]
- [限制DDS的最大连接数]
- [关闭IPv6功能]
- [关闭脚本运行功能]
- [建议开启审计功能]
- [配置实例访问日志功能]
- [建议开启加密通信]
- [开启磁盘加密]
- [开启备份功能]
- [设置秒级监控和告警规则]
- [版本升级]
- [检查角色的合理性]
 #### 建议避免绑定EIP直接通过互联网访问DDS
避免DDS部署在互联网或者DMZ里，应该将DDS部署在公司内部网络，使用路由器或者防火墙技术把DDS保护起来，避免直接绑定EIP方式从互联网访问DDS。通过这种方式防止未授权的访问及DDos攻击等。不推荐[绑定弹性公网IP](https://support.huaweicloud.com/usermanual-dds/dds_03_0317.html)，如果业务必需，请务必[设置安全组](https://support.huaweicloud.com/usermanual-dds/dds_03_0318.html)。
 #### 避免使用常用密码
新建/修改账号密码，密码需要为强密码，在满足安全密码复杂度要求的前提下，同时避免使用常用密码。通过这种方式防止黑客爆破密码、彩虹表攻击等。常用密码可以通过[检查弱密码](https://support.huaweicloud.com/api-dds/dds_api_0217.html)接口进行查询。
 #### 禁止使用默认端口号
MongoDB的默认端口是27017，使用默认端口容易被监听，存在安全隐患，DDS推荐使用非默认端口。详情请参见[修改数据库端口](https://support.huaweicloud.com/usermanual-dds/dds_03_change_database_port.html)。
 #### 限制DDS的最大连接数
如果DDS的连接数过高，会消耗服务器过多的资源，导致OPS（query、insert、update、delete）等操作响应变慢，同时也要根据操作系统环境来设置最大连接数**net.maxIncomingConnections** ，如果高于操作系统接收的最大线程数，设置无效。详情请参见[参数调优](https://support.huaweicloud.com/usermanual-dds/dds_01_0052.html)。
 #### 关闭IPv6功能
目前DDS不支持选择IPv6网段的子网，建议您在使用时创建实例时选择IPv4网段的子网。
 #### 关闭脚本运行功能
启用javascriptEnabled选项**security.javascriptEnabled** ，可以在mongod 服务端运行javascript脚本，存在安全风险。禁用javascriptEnabled选项，mapreduce、group命令等将无法使用。如果您的应用中没有mapreduce等操作的需求，为了安全起见，建议关闭javascriptEnabled选项。详情请参见[参数调优](https://support.huaweicloud.com/usermanual-dds/dds_01_0052.html)。
 #### 建议开启审计功能
审计功能可以记录用户对数据库的所有相关操作。通过查看审计日志，您可以对数据库进行安全审计、故障根因分析等操作，提高系统运维效率。详情请参见[审计日志](https://support.huaweicloud.com/usermanual-dds/dds_03_0067.html)。
 #### 建议配置实例访问日志功能
配置访问日志后，DDS实例新生成的审计日志、错误日志和慢日志记录会上传到LTS进行管理。您可以查看DDS实例审计日志、错误日志和慢日志的详细信息，包括搜索日志、日志可视化、下载日志和查看实时日志等功能，提高系统运维效率。详情请参见[日志配置管理](https://support.huaweicloud.com/usermanual-dds/dds_03_0167.html)。
 #### 建议开启加密通信
如果未配置SSL加密通信，那么在Mongo客户端和服务器之间传输的数据，容易受到窃听、篡改和"中间人"攻击。为了提高数据传输的安全性，建议您开启SSL加密通信。详情请参见[设置SSL数据加密](https://support.huaweicloud.com/usermanual-dds/dds_03_0074.html)。
 #### 开启磁盘加密
建议您开启磁盘加密可以提供数据的安全性。详情请参见自[定义购买](https://support.huaweicloud.com/usermanual-dds/dds_03_0302.html)中的"磁盘加密"说明。
 #### 开启备份功能
DDS实例支持自动备份和手动备份，您可以定期对数据库进行备份，当数据库故障或数据损坏时，可以通过备份文件恢复数据库，从而保证数据可靠性。详情请参见[数据备份](https://support.huaweicloud.com/usermanual-dds/dds_backup_restore.html)。
 #### 设置秒级监控和告警规则
DDS默认支持对实例进行监控，当监控指标的值超出设置的阈值时就会触发告警，系统会通过SMN自动发送告警通知给云账号联系人，帮助您及时了解DDS实例的运行状况。请您结合实际的业务，设置合适的监控和告警规则。详情请参见[监控与告警](https://support.huaweicloud.com/usermanual-dds/dds_03_0026.html)。
 #### 版本升级
DDS支持[补丁升级](https://support.huaweicloud.com/usermanual-dds/dds_03_0211.html)或者[大版本升级](https://support.huaweicloud.com/usermanual-dds/dds_03_0125.html)，版本升级涉及新功能添加、问题修复，同时可以提升安全能力、性能水平。建议及时进行版本升级。
 #### 检查角色的合理性
DDS支持"基于角色"的方法授予账号对数据和命令的访问权限。建议管理员结合业务需要，遵从最低授权原则，创建合适的[自定义角色](https://support.huaweicloud.com/devg-dds/dds_devg_0101.html)，对账号进行授权。如果发现账号权限过大，请结合业务需要，对账号权限进行[更新](https://support.huaweicloud.com/devg-dds/dds_devg_0098.html)或者[删除](https://support.huaweicloud.com/devg-dds/dds_devg_0099.html)。
表1DDS高权限角色的描述 
| 序号 | 检查项                                | 描述                                                                                                                                   |
|:---|:---|:---|
| 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角色的用户，该角色用户即可拥有授权所有数据库任意用户的权限，包括它们自己的，不利于权限的管理。                                                              |
   
