使用 Amazon Aurora MySQL 实现高安全性 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Amazon Aurora MySQL 实现高安全性

Amazon Aurora MySQL 的安全性在三个级别上进行管理:

  • 要控制可对 Aurora MySQL 数据库集群和数据库实例执行 Amazon RDS 管理操作的人员,请使用 Amazon Identity and Access Management (IAM)。使用 IAM 凭证连接到Amazon时,您的Amazon账户必须具有授予执行 Amazon RDS 管理操作所需的权限的 IAM 策略。有关更多信息,请参阅Amazon Aurora 的 Identity and Access Management

    如果要使用 IAM 访问 Amazon RDS 控制台,请确保首先使用您的 IAM 用户凭证登录 Amazon Web Services Management Console。然后通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  • 确保基于 Amazon VPC 服务在 Virtual Public Cloud (VPC) 中创建 Aurora MySQL 数据库集群。要控制哪些设备和 Amazon EC2 实例能够建立与 VPC 中 Aurora MySQL 数据库集群的数据库实例的终端节点和端口的连接,请使用 VPC 安全组。您可以使用传输层安全性协议(TLS)建立这些端点和端口连接。此外,公司的防火墙规则也可以控制公司中运行的哪些设备可以建立与数据库实例的连接。有关 VPC 的更多信息,请参阅 Amazon VPC 和 Amazon Aurora

    支持的 VPC 租赁取决于 Aurora MySQL 数据库集群使用的数据库实例类。对于 default VPC 租赁,VPC 在共享硬件上运行。对于 dedicated VPC 租赁,VPC 在专用硬件实例上运行。可突增的性能数据库实例类仅支持原定设置 VPC 租赁。可突增的性能数据库实例类包括 db.t2、db.t3 和 db.t4g 数据库实例类。所有其他 Aurora MySQL 数据库实例类都支持原定设置和专用 VPC 租赁。

    注意

    建议仅将 T 数据库实例类用于开发和测试服务器,或其他非生产服务器。有关 T 实例类的更多详细信息,请参阅使用 T 实例类进行开发和测试

    有关实例类的更多信息,请参阅 Aurora 数据库实例类。有关 defaultdedicated VPC 租赁的更多信息,请参阅 Amazon Elastic Compute Cloud 用户指南 中的专用实例

  • 要对 Amazon Aurora MySQL 数据库集群的登录信息和权限进行身份验证,可单独或组合采用以下各种方式:

    • 您可采用与独立 MySQL 实例相同的方式。

      CREATE USERRENAME USERGRANTREVOKESET PASSWORD 等命令的作用与它们在本地数据库中的作用相同,就像直接修改数据库架构表。有关更多信息,请参阅 MySQL 文档中的访问控制和账户管理

    • 您还可以使用 IAM 数据库身份验证。

      如果采用 IAM 数据库身份验证方式,可使用 IAM 用户或 IAM 角色以及身份验证令牌对您的数据库集群进行身份验证。身份验证令牌是使用签名版本 4 签名流程生成的唯一值。通过使用 IAM 数据库身份验证,您可以使用相同的凭证来控制对 Amazon 资源和数据库的访问。有关更多信息,请参阅“ 的 IAM 数据库身份验证”。

注意

有关更多信息,请参阅“Amazon Aurora 中的安全性”。

Amazon Aurora MySQL 中的主用户权限

当您创建 Amazon Aurora MySQL 数据库实例时,主用户具有 主用户账户权限 中列出的原定设置权限。

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

在 Aurora MySQL 版本 2 数据库集群中,在创建数据库集群时系统会创建 adminrdsadmin 用户。在 Aurora MySQL 版本 3 数据库集群中,系统会创建 adminrdsadminrds_superuser_role 用户。

重要

我们强烈建议不要直接在应用程序中使用主用户。请遵守使用数据库用户的最佳实践,按照您的应用程序所需的最少权限创建用户。

对于 Aurora MySQL 数据库集群管理,已限制标准 killkill_query 命令。应使用 Amazon RDS 命令 rds_killrds_kill_query 以终止 Aurora MySQL 数据库实例上的用户会话或查询。

注意

中国 (宁夏) 区域不支持数据库实例和快照加密。

将 TLS 与 Aurora MySQL 数据库集群结合使用

Amazon Aurora MySQL 数据库集群通过使用与 RDS for MySQL 数据库实例相同的过程和公有密钥,支持从应用程序建立传输层安全性协议(TLS)连接。

在 Amazon RDS 预调配数据库实例时,Amazon RDS 创建 TLS 证书,并将该证书安装在数据库实例上。这些证书由证书颁发机构签署。TLS 证书会将数据库实例端点作为 TLS 证书的公用名(CN)包含在内以防止欺诈攻击。因此,只有在您的客户端支持主题备用名称(SAN)时,您才能使用数据库集群端点通过 TLS 连接到数据库集群。否则,您必须使用写入器实例的实例终端节点。

有关下载证书的信息,请参阅使用 SSL/TLS 加密与数据库集群的连接

我们建议将 Amazon JDBC Driver for MySQL 作为支持使用 TLS 的 SAN 的客户端。有关 Amazon JDBC Driver for MySQL 的更多信息及其完整使用说明,请参阅 Amazon JDBC Driver for MySQL GitHub 存储库

需要与 Aurora MySQL 数据库集群建立 TLS 连接

通过使用 require_secure_transport 数据库集群参数,您可以要求与您 Aurora MySQL 数据库集群建立的所有用户连接都使用 TLS。默认情况下,require_secure_transport 参数设置为 OFF。您可将 require_secure_transport 参数设置为 ON 以要求使用 TLS 连接到数据库集群。

您可通过更新数据库集群的数据库集群参数组来设置 require_secure_transport 参数值。您无需重新启动数据库集群即可使更改生效。有关参数组的更多信息,请参阅使用参数组

注意

require_secure_transport 参数适用于 Aurora MySQL 版本 2 和 3。您可以在自定义数据库集群参数组中设置此参数。该参数在数据库实例参数组中不可用。

当数据库集群的 require_secure_transport 参数设置为 ON 时,如果数据库客户端能够建立加密连接,则可以连接到该数据库集群。否则,将向客户端返回类似于以下内容的错误消息:

MySQL Error 3159 (HY000): Connections using insecure transport are prohibited while --require_secure_transport=ON.

Aurora MySQL 的 TLS 版本

Aurora MySQL 支持传输层安全性协议(TLS)版本 1.0、1.1、1.2 和 1.3。从 Aurora MySQL 3.04.0 及更高版本开始,您可以使用 TLS 1.3 协议来保护您的连接。下表显示各个 Aurora MySQL 版本的 TLS 支持情况。

Aurora MySQL version TLS 1.0 TLS 1.1 TLS 1.2 TLS 1.3

Aurora MySQL 版本 3

支持(低于 3.04.0 的所有版本) 支持(低于 3.04.0 的所有版本)

支持

支持

Aurora MySQL 版本 2

支持 支持

支持

不支持
重要

如果您为版本 2 和版本低于 3.04.0 的 Aurora MySQL 集群使用自定义参数组,我们建议使用 TLS 1.2,因为 TLS 1.0 和 1.1 不太安全。MySQL 8.0.26 和 Aurora MySQL 3.03 的社区版及其次要版本已不再支持 TLS 版本 1.1 和 1.0。

MySQL 8.0.28 的社区版和兼容的 Aurora MySQL 版本 3.04.0 及更高版本不支持 TLS 1.1 和 TLS 1.0。如果您使用的是 Aurora MySQL 版本 3.04.0 及更高版本,请勿在自定义参数组中将 TLS 协议设置为 1.0 和 1.1。

对于 Aurora MySQL 版本 3.04.0 及更高版本,原定设置为 TLS 1.3 和 TLS 1.2。

您可以使用 tls_version 数据库集群参数来指示允许的协议版本。大多数客户端工具或数据库驱动程序都有类似的客户端参数。某些较旧的客户端可能不支持较新的 TLS 版本。默认情况下,数据库集群尝试使用服务器和客户端配置都允许的最高 TLS 协议版本。

tls_version 数据库集群参数设置为以下值之一:

  • TLSv1.3

  • TLSv1.2

  • TLSv1.1

  • TLSv1

也可以将 tls_version 参数设置为以逗号分隔的列表的字符串。如果您想同时使用 TLS 1.2 和 TLS 1.0 协议,tls_version 参数必须包括从最低协议到最高协议的所有协议。在这种情况下,tls_version 设置为:

tls_version=TLSv1,TLSv1.1,TLSv1.2

有关在数据库集群参数组中修改参数的信息,请参阅修改数据库集群参数组中的参数。如果您将 Amazon CLI 用于修改 tls_version 数据库集群参数,ApplyMethod 必须设置为 pending-reboot。当应用方法为 pending-reboot 时,对参数的更改会在您停止并重新启动与参数组相关的数据库集群之后应用。

配置密码套件以连接到 Aurora MySQL 数据库集群

通过使用可配置的密码套件,您可以更好地控制数据库连接的安全性。您可以指定想要允许保护客户端与数据库的 TLS 连接的密码套件列表。使用可配置的密码套件,您现在可以控制数据库服务器接受的连接加密。这样做可防止使用不安全已或弃用的密码。

Aurora MySQL 版本 3 和 Aurora MySQL 版本 2 支持可配置的密码套件。要指定允许用于加密连接的 TLS 1.2、TLS 1.1、TLS 1.0 密码的列表,请修改 ssl_cipher 集群参数。使用 Amazon Web Services Management Console、Amazon CLI 或 RDS API 在集群参数组中设置 ssl_cipher 参数。

ssl_cipher 参数设置为 TLS 版本的以逗号分隔的密码值字符串。对于客户端应用程序,您可以在连接到数据库时使用 --ssl-cipher 选项指定用于加密连接的密码。有关连接到数据库的更多信息,请参阅 连接到 Amazon Aurora MySQL 数据库集群

从 Aurora MySQL 版本 3.04.0 及更高版本开始,您可以指定 TLS 1.3 密码套件。要指定允许的 TLS 1.3 密码套件,请修改参数组中的 tls_ciphersuites 参数。TLS 1.3 减少了可用密码套件的数量,这是由于命名约定中进行了相关更改,删除了使用的密钥交换机制和证书。将 tls_ciphersuites 设置为 TLS 1.3 以逗号分隔的密码值字符串。

下表显示了支持的密码、TLS 加密协议以及每个密码的有效 Aurora MySQL 引擎版本。

密码加密协议支持的 Aurora MySQL 版本

DHE-RSA-AES128-SHA

TLS 1.03.01.0 及更高版本,均低于 2.11.0

DHE-RSA-AES128-SHA256

TLS 1.23.01.0 及更高版本,均低于 2.11.0

DHE-RSA-AES128-GCM-SHA256

TLS 1.23.01.0 及更高版本,均低于 2.11.0

DHE-RSA-AES256-SHA

TLS 1.03.03.0 及更低版本,所有低于 2.11.0 的版本

DHE-RSA-AES256-SHA256

TLS 1.23.01.0 及更高版本,均低于 2.11.0

DHE-RSA-AES256-GCM-SHA384

TLS 1.23.01.0 及更高版本,均低于 2.11.0

ECDHE-RSA-AES128-SHA

TLS 1.03.01.0 及更高版本、2.09.3 及更高版本、2.10.2 及更高版本

ECDHE-RSA-AES128-SHA256

TLS 1.23.01.0 及更高版本、2.09.3 及更高版本、2.10.2 及更高版本

ECDHE-RSA-AES128-GCM-SHA256

TLS 1.23.01.0 及更高版本、2.09.3 及更高版本、2.10.2 及更高版本

ECDHE-RSA-AES256-SHA

TLS 1.03.01.0 及更高版本、2.09.3 及更高版本、2.10.2 及更高版本

ECDHE-RSA-AES256-SHA384

TLS 1.23.01.0 及更高版本、2.09.3 及更高版本、2.10.2 及更高版本

ECDHE-RSA-AES256-GCM-SHA384

TLS 1.23.01.0 及更高版本、2.09.3 及更高版本、2.10.2 及更高版本

TLS_AES_128_GCM_SHA256

TLS 1.33.04.0 及更高版本

TLS_AES_256_GCM_SHA384

TLS 1.33.04.0 及更高版本

TLS_CHACHA20_POLY1305_SHA256

TLS 1.33.04.0 及更高版本
注意

只有 2.11.0 之前的 Aurora MySQL 版本才支持 DHE-RSA 密码。2.11.0 及更高版本仅支持 ECDHE 密码。

有关在数据库集群参数组中修改参数的信息,请参阅修改数据库集群参数组中的参数。如果您使用 CLI 来修改 ssl_cipher 数据库集群参数,请务必将 ApplyMethod 设置为 pending-reboot。当应用方法为 pending-reboot 时,对参数的更改会在您停止并重新启动与参数组相关的数据库集群之后应用。

您也可以使用 describe-engine-default-cluster-parameters CLI 命令来确定特定参数组系列当前支持哪些密码套件。以下示例展示如何获取 Aurora MySQL 版本 2 的 ssl_cipher 集群参数允许的值。

aws rds describe-engine-default-cluster-parameters --db-parameter-group-family aurora-mysql5.7 ...some output truncated... { "ParameterName": "ssl_cipher", "ParameterValue": "DHE-RSA-AES128-SHA,DHE-RSA-AES128-SHA256,DHE-RSA-AES128-GCM-SHA256,DHE-RSA-AES256-SHA,DHE-RSA-AES256-SHA256,DHE-RSA-AES256-GCM-SHA384,ECDHE-RSA-AES128-SHA,ECDHE-RSA-AES128-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-AES256-SHA,ECDHE-RSA-AES256-SHA384,ECDHE-RSA-AES256-GCM-SHA384", "Description": "The list of permissible ciphers for connection encryption.", "Source": "system", "ApplyType": "static", "DataType": "list", "AllowedValues": "DHE-RSA-AES128-SHA,DHE-RSA-AES128-SHA256,DHE-RSA-AES128-GCM-SHA256,DHE-RSA-AES256-SHA,DHE-RSA-AES256-SHA256,DHE-RSA-AES256-GCM-SHA384,ECDHE-RSA-AES128-SHA,ECDHE-RSA-AES128-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-AES256-SHA,ECDHE-RSA-AES256-SHA384,ECDHE-RSA-AES256-GCM-SHA384", "IsModifiable": true, "SupportedEngineModes": [ "provisioned" ] }, ...some output truncated...

有关密码的更多信息,请参阅 MySQL 文档中的 ssl_cipher 变量。有关密码套件格式的更多信息,请参阅 OpenSSL 网站上的 openssl-ciphers list formatopenssl-ciphers string format 文档。

加密到 Aurora MySQL 数据库集群的连接

要使用默认的 mysql 客户端对连接加密,需用 --ssl-ca 参数启动 mysql 客户端以便引用公有密钥,例如:

对于 MySQL 5.7 和 8.0:

mysql -h myinstance.123456789012.rds-cn-north-1.amazonaws.com --ssl-ca=full_path_to_CA_certificate --ssl-mode=VERIFY_IDENTITY

对于 MySQL 5.6:

mysql -h myinstance.123456789012.rds-cn-north-1.amazonaws.com --ssl-ca=full_path_to_CA_certificate --ssl-verify-server-cert

full_path_to_CA_certificate 替换为证书颁发机构 (CA) 证书的完整路径。有关下载证书的信息,请参阅 使用 SSL/TLS 加密与数据库集群的连接

您可以要求特定用户账户建立 TLS 连接。例如,可以根据您的 MySQL 版本,使用以下语句之一来要求用户账户 encrypted_user 建立 TLS 连接。

对于 MySQL 5.7 和 8.0:

ALTER USER 'encrypted_user'@'%' REQUIRE SSL;

对于 MySQL 5.6:

GRANT USAGE ON *.* TO 'encrypted_user'@'%' REQUIRE SSL;

使用 RDS 代理时,您可以连接到代理端点,而不是通常的集群端点。对于到代理的连接,您可以像直接到 Aurora 数据库集群的连接那样,使 SSL/TLS 成为必需或可选的选项。有关使用 RDS 代理的信息,请参阅将 Amazon RDS 代理用于 Aurora

注意

有关与 MySQL 的 TLS 连接的更多信息,请参阅 MySQL 文档