# RDS for MySQL安全最佳实践
安全性是华为云与您的共同责任。华为云负责云服务自身的安全，提供安全的云；作为租户，您需要合理使用云服务提供的安全能力对数据进行保护，安全地使用云。详情请参见[责任共担](https://support.huaweicloud.com/productdesc-rds-mysql/rds_01_0053.html)。
本文提供了RDS for MySQL使用过程中的安全最佳实践，旨在为提高整体安全能力提供可操作的规范性指导。根据该指导文档您可以持续评估RDS for MySQL的安全状态，更好的组合使用RDS for MySQL提供的多种安全能力，提高对RDS for MySQL的整体安全防御能力，保护存储在RDS for MySQL的数据不泄露、不被篡改，以及数据传输过程中不泄露、不被篡改。
本文从以下几个维度给出建议，您可以评估RDS for MySQL使用情况，并根据业务需要在本指导的基础上进行安全配置。
- [完善数据库连接相关配置，减少被网络攻击的风险]
- [妥善进行数据库账号密码管理，减少数据泄露风险]
- [建议使用DEW服务托管数据库密码]
- [加强权限管理，减少相关风险]
- [开启数据库审计，便于事后回溯]
- [开启备份功能，完善备份相关配置，保障数据可靠性]
- [加密存储数据]
- [加固数据库敏感参数]
- [使用最新版本数据库获得更好的操作体验和更强的安全能力]
- [使用其他云服务进一步增强对数据的安全防护]
- [RDS数据库实例应配置多个可用区]
- [建议开启敏感操作保护]
- [建议使用基于时间点恢复数据]
- [建议使用磁盘加密功能]
- [建议配置日志对接LTS]
#### 完善数据库连接相关配置，减少被网络攻击的风险
1. **建议避免绑定EIP** **直接通过互联网访问** **RDS for MySQL**
   避免RDS for MySQL部署在互联网或者DMZ里，应该将RDS for MySQL部署在公司内部网络，使用路由器或者防火墙技术把RDS for MySQL保护起来，避免直接绑定EIP方式从互联网访问RDS for MySQL。通过这种方式防止未授权的访问及DDos攻击等。建议[解绑弹性公网IP外部连接](https://support.huaweicloud.com/usermanual-rds-mysql/rds_public_accessibility.html)，如果您的业务必须绑定EIP，请务必通过设置安全组规则限制访问数据库的源IP。
   
2. **避免使用默认端口号**
   MySQL的默认端口号为3306，此端口会更容易受到恶意人员的攻击。建议您为数据库实例[修改数据库端口](https://support.huaweicloud.com/usermanual-rds-mysql/rds_change_database_port.html)。
   
3. **确保限制数据库用户的可用资源**
   如果不限定数据库用户的可用资源，数据库在受到攻击时，可能会出现系统过载，导致服务DoS。限定数据库用户的可用资源，防止资源过度占用导致的资源过度消耗。您需要结合业务模型给出合理值，避免在高负载场景下影响业务可用性。
   配置SQL语句如下：
   ```
   alter user  '<user>'@'<hostname>' with max_queries_per_hour <queries_num>;
   alter user  '<user>'@'<hostname>' with max_user_connections <connections_num>;
   alter user  '<user>'@'<hostname>' with max_updates_per_hour <updates_num>;
   alter user  '<user>'@'<hostname>' with max_connections_per_hour <connections_per_hour>;
   ```
   - \<user\>表示需要做资源设置的用户名。
   
   - \<hostname\>表示需要做资源设置的用户hostname。
   
   - \<queries_num\>表示设置的数据库允许用户的每小时最大查询数。
   
   - \<connections_num\>表示设置的数据库允许用户的最大连接数。
   
   - \<updates_num\>表示设置的数据库允许用户的每小时最大更新数。
   
   - \<connections_per_hour\>表示设置的数据库允许用户的每小时最大连接数。
    
4. **确保用户主机名不使用通配符"%"**
   MySQL用户主机名指定用户可用于连接的主机，对应user表中的host字段。主机名设置为通配符"%"时，标识用户接受来自任何IP的连接，从而导致扩大数据库的攻击范围。为了减小受攻击范围，建议您[修改主机IP](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0050.html)为特定网段或具体IP。
   
5. **确保限制数据库连接闲置等待时间**
   MySQL服务器的每个连接建立都会消耗内存，且所支持的最大连接数也有上限，如果MySQL Server有大量的闲置连接，不仅会白白消耗内存，而且如果连接一直累加而不断开，最终会达到MySQL Server的连接上限数，新建连接就会报"too many connections"错误。所以应该设置闲置连接的等待时间，确保及时清除闲置连接。请参考[修改实例参数](https://support.huaweicloud.com/usermanual-rds-mysql/rds_configuration.html)修改"wait_timeout"和"interactive_timeout"，具体值需您根据业务自行审视。
   
6. **确保默认开启SSL**
   如未配置SSL加密通信，那么在MySQL客户端和服务器之间传输的数据，容易受到窃听、篡改和"中间人"攻击。为了提高数据传输的安全性，建议您为数据库用户添加REQUIRE SSL属性，同时[设置SSL数据加密](https://support.huaweicloud.com/usermanual-rds-mysql/rds_mysql_0001.html)。
   配置SQL语句如下：
   ```
   create user '<user>'@'<hostname>' REQUIRE SSL;
   alter user '<user>'@'<hostname>' REQUIRE SSL;
   ```
   
 
#### 妥善进行数据库账号密码管理，减少数据泄露风险
1. **建议定期修改管理员用户的密码**
   默认的数据库管理员账号root拥有较高的权限，建议您参考[重置管理员密码和root账号权限](https://support.huaweicloud.com/usermanual-rds-mysql/rds_reset_password.html)定期修改root密码。
   
2. **设置密码复杂度**
   数据库系统作为信息的聚集体，易成为攻击者的目标。用户需要妥善保存数据账号与密码，避免泄漏。同时建议您配置数据库密码的复杂度，避免使用弱密码。详情请参见[数据库安全设置](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0018.html)中的"设置密码复杂度"。
   
3. **设置密码过期策略**
   长期使用同一个密码会增加被暴力破解和恶意猜测的风险。建议您[设置密码过期策略](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0032.html)限制使用同一个密码的时间。
   
 
#### 建议使用DEW服务托管数据库密码
用户或应用程序使用RDS for MySQL数据库时，不同的用户密码分散在不同业务，可能存在管理混乱，密码泄露或丢失的风险。建议使用[DEW服务](https://support.huaweicloud.com/productdesc-dew/dew_01_0093.html)托管RDS for MySQL数据库密码，通过DEW的凭据管理[创建凭据](https://support.huaweicloud.com/usermanual-dew/dew_01_9993.html)，实现RDS for MySQL数据库用户密码的托管服务。
#### 加强权限管理，减少相关风险
1. **禁止以管理员用户创建存储过程和函数**
   存储过程和函数默认以创建者的身份运行，如果管理员用户创建的存储过程和函数存在提权或其他破坏操作，那么普通用户可以提权至管理员的身份运行，因此要避免使用管理员用户创建存储过程和函数。
   
2. **审视并加固权限相关配置**
   请用户审视如下权限配置是否符合安全要求，如有出入您需要自行完成配置加固：
   - 确保mysql.user表只有管理员用户才能操作。
   
   - 确保Process_priv权限只能赋予管理员用户。
   
   - 确保Create_user_priv权限只能赋予管理员用户。
   
   - 确保Grant_priv权限只能赋予管理员用户。
   
   - 确保Reload_priv权限只能赋予管理员用户。
   
   - 确保复制账号有且只能有replication slave权限。
   
   - 确保数据库指标监控用户有且只能有replication client权限。
   
   
   示例：如有非管理员用户拥有Process权限，请执行如下SQL取消Process权限。
   ```
   revoke process on *.* from <your_account>;
   ```
   其中，\<your_account\>表示需取消Process权限的用户名。
   
 
#### 开启数据库审计，便于事后回溯
数据库审计功能可以实时记录用户对数据库的所有相关操作。通过对用户访问数据库行为的记录、分析和汇报，用来帮助您事后生成合规报告、事故追根溯源，提高数据资产安全性。详情请参见[开启SQL审计日志](https://support.huaweicloud.com/usermanual-rds-mysql/rds_sql_auditing_log.html)。
#### 开启备份功能，完善备份相关配置，保障数据可靠性
1. **开启数据备份**
   RDS for MySQL实例支持自动备份和手动备份，您可以定期对数据库进行备份，当数据库故障或数据损坏时，可以通过备份文件恢复数据库，从而保证数据可靠性。详情请参见[数据备份](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0047.html)。
   
2. **配置** **MySQL binlog** **日志清理策略**
   Binlog日志会随着业务的运行而持续膨胀，需要配置清零策略避免磁盘膨胀。请您参考[设置RDS for MySQL本地Binlog日志清理](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0037.html)设置Binlog保存时间。
   
 
#### 加密存储数据
为提升用户数据的安全性，建议开启[服务端加密](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0025.html)，开启后您创建实例和扩容磁盘时，磁盘数据会在服务端加密成密文后存储，降低数据泄露的风险。
#### 加固数据库敏感参数
1. **建议** "**local_infile** "**参数配置为OFF**
   "local_infile"设置为ON时，将允许数据库客户端通过load data local语法将客户端本地文件加载到数据库表中。例如，在web服务器作为数据库客户端连接数据库的场景，如果web服务器存在SQL注入漏洞，那么攻击者可用构造load data local命令将web服务器的敏感文件加载到数据库中，从而造成信息泄露。建议您参考[修改实例参数](https://support.huaweicloud.com/usermanual-rds-mysql/rds_configuration.html)配置"local_infile"的值为OFF。
   
2. **建议** "**sql_mode** "**参数包含** "**STRICT_ALL_TABLES** "
   攻击者在试图攻击时会试错性输入各种参数，若服务器自适应错误语句，将有可能泄漏数据库数据。因此推荐使用"STRICT_ALL_TABLES"，即使错误出现在首行后的其他行，一旦发现非法数据值就会放弃语句。这种用法能最大限度的保证数据库信息不被泄露。建议您参考[修改实例参数](https://support.huaweicloud.com/usermanual-rds-mysql/rds_configuration.html)配置"sql_mode"参数包含"STRICT_ALL_TABLES"。
   
 
#### 使用最新版本数据库获得更好的操作体验和更强的安全能力
MySQL社区不定期披露新发现的漏洞，RDS for MySQL会评估数据库内核版本的实际风险，发布新的数据库内核版本。为了提升数据库系统的易用性和安全性，建议您[使用最新版本数据库](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0003.html)。
#### 使用其他云服务进一步增强对数据的安全防护
如果您希望获得更智能的数据库安全服务，建议[使用数据安全服务DBSS](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0042.html)来扩展数据安全能力。
#### RDS数据库实例应配置多个可用区
RDS for MySQL支持跨AZ高可用。当用户[购买实例](https://support.huaweicloud.com/usermanual-rds-mysql/rds_10_0028.html)的时候，选择主备实例类型，可以选择主可用区和备可用区不在同一个可用区（AZ）。主机和备机部署在不同的可用区，提供不同可用区之间的故障转移能力和高可用性。
#### 建议开启敏感操作保护
RDS控制台支持敏感操作保护，开启后执行删除实例等敏感操作时，系统会进行身份验证，进一步保证RDS配置和数据的安全性。开启敏感操作保护需要在IAM上启用MFA，详见[开启或关闭敏感操作](https://support.huaweicloud.com/usermanual-iam/iam_07_0002.html)。
#### 建议使用基于时间点恢复数据
RDS for MySQL支持使用已有的自动备份，恢复实例数据到指定时间点。实例恢复到指定时间点，会从OBS备份空间中选择一个该时间点最近的全量备份下载到实例上进行全量恢复，再重放增量备份到指定时间点，基于时间点恢复能够提升云数据库在面对数据丢失或损坏时的安全响应能力。详见[全量数据恢复：恢复到指定时间点（PITR）](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0008.html)。
#### 建议使用磁盘加密功能
建议您开启磁盘加密，可以提高数据的安全性。更多内容，请参见[购买RDS for MySQL实例](https://support.huaweicloud.com/usermanual-rds-mysql/rds_10_0028.html)中"磁盘加密"的说明。
#### 建议配置日志对接LTS
RDS for MySQL支持将错误日志、慢日志、审计日志上传至LTS，可根据合规要求记录日志以及设置保留时间。配置完成后，需要注意以下内容：
- 配置访问日志后，实例新生成的日志记录会上传到LTS进行管理。

- 配置完成后不会立即生效，存在10分钟左右的时延，请知悉。
- 配置成功后，会在LTS服务下产生一定费用。具体计费请参见[LTS价格详情](https://www.huaweicloud.com/pricing/calculator.html?tab=detail#/lts)。
- 在您进行LTS审计日志配置后，会默认上传所有审计策略。
- 若您的审计策略为打开的状态，则将会复用您之前的审计策略，且会在原有的审计日志计费基础上增加您LTS的审计日志收费。（原有的审计日志费用会在您关闭原有审计策略后终止）
- 出于对您实例的正常运行考虑，若您原有审计策略开启的情况下，配置了LTS审计日志，建议保留原有审计策略一段时间，待您LTS审计日志运转正常后，再行关闭。
更多内容，请参见[日志配置管理](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0036.html)。
