使用 Amazon Aurora MySQL 实现高安全性 - Amazon Aurora

使用 Amazon Aurora MySQL 实现高安全性

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

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

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

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

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

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

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

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

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

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

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

注意

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

Amazon Aurora MySQL 中的主用户权限

当您创建 Amazon Aurora MySQL 数据库实例时,主用户有以下默认权限:

  • ALTER

  • ALTER ROUTINE

  • CREATE

  • CREATE ROUTINE

  • CREATE TEMPORARY TABLES

  • CREATE USER

  • CREATE VIEW

  • DELETE

  • DROP

  • EVENT

  • EXECUTE

  • GRANT OPTION

  • INDEX

  • INSERT

  • LOAD FROM S3

  • LOCK TABLES

  • PROCESS

  • REFERENCES

  • RELOAD

  • REPLICATION CLIENT

  • REPLICATION SLAVE

  • SELECT

  • SHOW DATABASES

  • SHOW VIEW

  • TRIGGER

  • UPDATE

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

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

注意

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

将 SSL/TLS 与 Aurora MySQL 数据库集群配合使用

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

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

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

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

需要至 Aurora MySQL 数据库集群的 SSL/TLS 连接

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

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

注意

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

当数据库集群的 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。下表显示各个 Aurora MySQL 版本的 TLS 支持情况。

Aurora MySQL version TLS 1.0 TLS 1.1 TLS 1.2

Aurora MySQL 版本 3

支持

支持

支持

Aurora MySQL 版本 2

支持

支持

支持

Aurora MySQL 版本 1

支持

支持 Aurora MySQL 1.23.1 及更高版本

支持 Aurora MySQL 1.23.1 及更高版本

尽管 MySQL 8.0 的社群版支持 TLS 1.3,但是兼容 MySQL 8.0 的 Aurora MySQL 版本 3 目前不支持 TLS 1.3。

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

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

  • TLSv1.2 – 仅允许将 TLS 版本 1.2 协议用于加密连接。

  • TLSv1.1 – 允许将 TLS 版本 1.1 和 1.2 协议用于加密连接。

  • TLSv1 – 允许将 TLS 版本 1.0、1.1 和 1.2 协议用于加密连接。

如果未设置参数,则允许将 TLS 版本 1.0、1.1 和 1.2 协议用于加密连接。

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

注意

tls_version 数据库集群参数对 Aurora MySQL 5.6 不可用。

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

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

对于 MySQL 5.7 和 8.0:

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

对于 MySQL 5.6:

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

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

您可以要求特定用户账户建立 SSL/TLS 连接。例如,可以根据您的 MySQL 版本,使用以下语句之一来要求用户账户 encrypted_user 建立 SSL/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 Proxy

注意

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

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

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

Aurora MySQL 版本 3 和 Aurora MySQL 版本 2 支持可配置的密码套件。

要指定加密连接的允许密码列表,请修改 ssl_cipher 集群参数。使用 AWS Management Console、AWS CLI 或 RDS API 在集群参数组中设置 ssl_cipher 参数。

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

对于客户端应用程序,您可以在连接到数据库时使用 --ssl-cipher 选项指定用于加密连接的密码。有关连接到数据库的更多信息,请参阅 连接到 Amazon Aurora MySQL 数据库集群

ssl_cipher 参数设置为逗号分隔的密码值字符串。下表显示了支持的密码、TLS 加密协议以及每个密码的有效 Aurora MySQL 引擎版本。

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

DHE-RSA-AES128-SHA

TLS 1.03.01.0 及更高版本、2.10.2、2.10.1、2.09.3、2.08.4、2.07.7、2.04.9

DHE-RSA-AES128-SHA256

TLS 1.23.01.0 及更高版本、2.10.2、2.10.1、2.09.3、2.08.4、2.07.7、2.04.9

DHE-RSA-AES128-GCM-SHA256

TLS 1.23.01.0 及更高版本、2.10.2、2.10.1、2.09.3、2.08.4、2.07.7、2.04.9

DHE-RSA-AES256-SHA

TLS 1.03.01.0 及更高版本、2.10.2、2.10.1、2.09.3、2.08.4、2.07.7、2.04.9

DHE-RSA-AES256-SHA256

TLS 1.23.01.0 及更高版本、2.10.2、2.10.1、2.09.3、2.08.4、2.07.7、2.04.9

DHE-RSA-AES256-GCM-SHA384

TLS 1.23.01.0 及更高版本、2.10.2、2.10.1、2.09.3、2.08.4、2.07.7、2.04.9

ECDHE-RSA-AES128-SHA

TLS 1.03.01.0 及更高版本、2.10.2、2.09.3

ECDHE-RSA-AES128-SHA256

TLS 1.23.01.0 及更高版本、2.10.2、2.09.3

ECDHE-RSA-AES128-GCM-SHA256

TLS 1.23.01.0 及更高版本、2.10.2、2.09.3

ECDHE-RSA-AES256-SHA

TLS 1.03.01.0 及更高版本、2.10.2、2.09.3

ECDHE-RSA-AES256-SHA384

TLS 1.23.01.0 及更高版本、2.10.2、2.09.3

ECDHE-RSA-AES256-GCM-SHA384

TLS 1.23.01.0 及更高版本、2.10.2、2.09.3

您也可以使用 describe-engine-default-cluster-parameters CLI 命令来确定特定参数组系列当前支持哪些密码套件。以下示例展示如何获取 Aurora MySQL 5.7 的 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 文档。