

# 保护 MySQL 数据库实例连接安全
<a name="securing-mysql-connections"></a>

您可以实施强有力的安全措施来保护 MySQL 数据库实例免受未经授权的访问和潜在威胁。安全组、SSL/TLS 加密和 IAM 数据库身份验证协同工作，来为 MySQL 数据库实例创建多层连接安全性。这些安全控制措施有助于您满足合规性要求，防止数据泄露，并维护应用程序和数据库之间的安全通信通道。可以通过加密传输中数据、限制对特定 IP 范围的访问以及通过 IAM 角色而不是数据库密码管理用户身份验证，来保护 MySQL 数据库实例。

MySQL 数据库实例的安全性在三个级别上进行管理：
+ Amazon Identity and Access Management 控制可以对数据库实例执行 Amazon RDS 管理操作的人员。使用 IAM 证书连接到Amazon时，您的 IAM 账户必须具有授予执行 Amazon RDS 管理操作所需的权限的 IAM 策略。有关更多信息，请参阅 [Amazon RDS 的 Identity and Access Management](UsingWithRDS.IAM.md)。
+ 创建数据库实例时，可以使用 VPC 安全组控制哪些设备和 Amazon EC2 实例能够建立到数据库实例的端点和端口的连接。可以使用安全套接字层 (SSL)/传输层安全性协议 (TLS) 建立这些连接。此外，公司的防火墙规则也可以控制公司中运行的哪些设备可以建立到数据库实例的连接。
+ 要对 MySQL 数据库实例的登录信息和权限进行身份验证，可单独或组合采用以下各种方式：
  + 您可采用与独立 MySQL 实例相同的方式。`CREATE USER`、`RENAME USER`、`GRANT`、`REVOKE` 和 `SET PASSWORD` 等命令的作用与它们在本地数据库中的作用相同，就像直接修改数据库架构表。但是，直接修改数据库架构表并不是最佳做法，而且从 RDS for MySQL 版本 8.0.36 开始，不支持直接修改数据库架构表。有关信息，请参阅 MySQL 文档中的[访问控制和账户管理](https://dev.mysql.com/doc/refman/8.0/en/access-control.html)。
  + 您还可以使用 IAM 数据库身份验证。如果采用 IAM 数据库身份验证方式，可使用 IAM 用户或 IAM 角色以及身份验证令牌对数据库实例进行身份验证。*身份验证令牌*是使用签名版本 4 签名流程生成的唯一值。通过使用 IAM 数据库身份验证，您可以使用相同的凭证来控制对 Amazon 资源和数据库的访问。有关更多信息，请参阅 [适用于 MariaDB、MySQL 和 PostgreSQL 的IAM 数据库身份验证](UsingWithRDS.IAMDBAuth.md)。
  + 另一个选项是 RDS for MySQL 的 Kerberos 身份验证。数据库实例与 Amazon Directory Service for Microsoft Active Directory (Amazon Managed Microsoft AD) 配合使用以启用 Kerberos 身份验证。当用户在加入信任域的 MySQL 数据库实例中进行身份验证时，将转发身份验证请求。转发的请求将转到您使用 Amazon Directory Service 创建的域目录。有关更多信息，请参阅 [对 Amazon RDS for MySQL 进行 Kerberos 身份验证](mysql-kerberos.md)。

 当您创建 Amazon RDS 数据库实例时，主用户有以下默认权限：


| 引擎版本 | 系统权限 | 数据库角色 | 
| --- | --- | --- | 
|  RDS for MySQL 版本 8.4.3 及更高版本  |  `GRANT SELECT`, `INSERT`, `UPDATE`, `DELETE`, `CREATE`, `DROP`, `RELOAD`, `PROCESS`, `REFERENCES`,`INDEX`, `ALTER`, `SHOW DATABASES`, `CREATE TEMPORARY TABLES`, `LOCK TABLES`, `EXECUTE`, `REPLICATION SLAVE`, `REPLICATION CLIENT`, `CREATE VIEW`, `SHOW VIEW`, `CREATE ROUTINE`, `ALTER ROUTINE`, `CREATE USER`, `EVENT`, `TRIGGER`, `CREATE ROLE`, `DROP ROLE`, `APPLICATION_PASSWORD_ADMIN`, `FLUSH_OPTIMIZER_COSTS`, `FLUSH_PRIVILEGES`, `FLUSH_STATUS`, `FLUSH_TABLES`, `FLUSH_USER_RESOURCES`, `ROLE_ADMIN`, `SENSITIVE_VARIABLES_OBSERVER`, `SESSION_VARIABLES_ADMIN`, `SET_ANY_DEFINER`, `SHOW_ROUTINE`, `XA_RECOVER_ADMIN`  |  `rds_superuser_role` 有关 `rds_superuser_role`的更多信息，请参阅[RDS for MySQL 的基于角色的权限模型](Appendix.MySQL.CommonDBATasks.privilege-model.md)。  | 
|  RDS for MySQL 版本 8.0.36 及更高版本  |  `SELECT`, `INSERT`, `UPDATE`, `DELETE`, `CREATE`, `DROP`, `RELOAD`, `PROCESS`, `REFERENCES`, `INDEX`, `ALTER`, `SHOW DATABASES`, `CREATE TEMPORARY TABLES`, `LOCK TABLES`, `EXECUTE`, `REPLICATION SLAVE`, `REPLICATION CLIENT`, `CREATE VIEW`, `SHOW VIEW`, `CREATE ROUTINE`, `ALTER ROUTINE`, `CREATE USER`, `EVENT`, `TRIGGER`, `CREATE ROLE`, `DROP ROLE`, `APPLICATION_PASSWORD_ADMIN`, `ROLE_ADMIN`, `SET_USER_ID`, `XA_RECOVER_ADMIN`  |  `rds_superuser_role` 有关 `rds_superuser_role`的更多信息，请参阅[RDS for MySQL 的基于角色的权限模型](Appendix.MySQL.CommonDBATasks.privilege-model.md)。  | 
|  低于 8.0.36 的 RDS for MySQL 版本  |  `SELECT`, `INSERT`, `UPDATE`, `DELETE`, `CREATE`, `DROP`, `RELOAD`, `PROCESS`, `REFERENCES`, `INDEX`, `ALTER`, `SHOW DATABASES`, `CREATE TEMPORARY TABLES`, `LOCK TABLES`, `EXECUTE`, `REPLICATION CLIENT`, `CREATE VIEW`, `SHOW VIEW`, `CREATE ROUTINE`, `ALTER ROUTINE`, `CREATE USER`, `EVENT`, `TRIGGER`, `REPLICATION SLAVE`  |  无  | 

**注意**  
尽管能够在数据库实例上删除主用户，但不推荐这样做。要重新创建主用户，请执行 [ModifyDBInstance](https://docs.amazonaws.cn/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) RDS API 操作或运行 [modify-db-instance](https://docs.amazonaws.cn/cli/latest/reference/rds/modify-db-instance.html) Amazon CLI 命令，并使用相应的参数指定新的主用户密码。如果实例中不存在主用户，将使用指定的密码创建主用户。

要为每个数据库实例提供管理服务，需在创建数据库实例时创建 `rdsadmin` 用户。如果试图删掉、重命名、修改密码，或者修改 `rdsadmin` 账户的权限，会导致出错。

若要允许管理数据库实例，需限制标准的 `kill` 和 `kill_query` 命令。通过所提供的 Amazon RDS 命令 `rds_kill` 和 `rds_kill_query`，您可以结束数据库实例上的用户会话或查询。