Amazon Relational Database Service
用户指南 (API Version 2014-10-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

对 MySQL 和 Amazon Aurora 使用 IAM 数据库身份验证

如果采用运行 MySQL 或 Amazon Aurora 的 Amazon Relational Database Service (Amazon RDS),您可以使用 AWS Identity and Access Management (IAM) 数据库身份验证和数据库引擎中内置的本机身份验证方法来对您的数据库实例进行身份验证。如果采用 IAM 数据库身份验证方式,可使用 IAM 用户或 IAM 角色以及身份验证令牌对您的数据库实例或数据库群集进行身份验证。身份验证令牌是使用签名版本 4 签名流程生成的唯一值;它在创建的 15 分钟之后过期。通过使用 IAM 数据库身份验证,您可以使用相同的凭证来控制对 AWS 资源和数据库的访问。启用 IAM 数据库身份验证时,您仍可以使用标准数据库身份验证。

我们建议对连接到 MySQL 或 Aurora 数据库引擎的自定义应用程序使用 IAM 数据库身份验证。IAM 数据库身份验证具有以下优势:

  • 身份验证令牌是通过签名版本 4 签名流程使用您的 AWS 访问密钥生成的唯一值,比用户密码更加安全。有关详细信息,请参见 Signature Version 4 Signing Process

  • 身份验证令牌的使用期限有限,因此您不需要进行用户密码重置。它在创建的 15 分钟之后过期。

  • 因为使用 AWS 生成的身份验证令牌代替数据库密码,所以数据库不存储数据库用户凭证。

  • 如果采用 IAM 数据库身份验证,您必须使用安全套接字层 (SSL) 连接,以加密与数据库实例或数据库群集之间传输的全部数据。

  • 您可以将凭证管理委派给 IAM,这样就可以使用 IAM 访问您的 AWS 账户和数据库资源。

  • 对于在 Amazon EC2 上运行的应用程序,可以使用 EC2 实例配置文件凭证访问数据库,因此不需要在 EC2 实例中使用数据库密码。

如果要使用 IAM 数据库身份验证对数据库实例或数据库群集进行身份验证,您应了解以下内容:

  • 您可以在为 MySQL 创建或修改数据库实例或者为 Aurora 创建或修改数据库群集时启用 IAM 数据库身份验证。否则,默认情况下已禁用 IAM 数据库身份验证。

  • 如果您创建或复制了快照,则 IAM 数据库身份验证设置将继承自源数据库实例或数据库群集。

  • 如果您从快照还原数据库实例或数据库群集,则 IAM 数据库身份验证设置默认与该快照的设置相同。您可以在还原期间更改 IAM 数据库身份验证设置。

  • 如果您从 MySQL 迁移到 Aurora,则 IAM 数据库身份验证设置将继承自 MySQL 数据库实例。

  • 如果您从数据库实例创建只读副本或从数据库群集创建 Aurora 副本,则该副本将继承源数据库实例或源数据库群集的 IAM 数据库身份验证设置。

  • 如果您禁用 IAM 数据库身份验证,而您在映射到 IAM 用户的数据库引擎中拥有数据库账户,则这些用户无法进行身份验证,因此无法连接到数据库实例或数据库群集。

  • 更改 IAM 数据库身份验证设置不会引起数据库实例或数据库群集停机。因此,可立即应用更改,也可在下一维护时段内应用更改。

您可以对以下数据库引擎使用 IAM 数据库身份验证:

  • MySQL 5.6,次要版本 5.6.34 或更高版本

  • MySQL 5.7,次要版本 5.7.16 或更高版本

  • Amazon Aurora 1.10 或更高版本

对于 MySQL,您可以在除 db.t1.micro 和 db.m1.small 之外的所有支持的实例类中使用 IAM 数据库身份验证。对于 Aurora,您可以在除 db.t2.small 之外的所有支持的实例类中使用 IAM 数据库身份验证。有关每种数据库引擎支持的实例类的更多信息,请参阅 数据库实例类

在使用 IAM 数据库身份验证时,除非使用 db.t2.micro 实例类,否则应将连接数限制在每秒 20 个以下。在本例中,应将连接数限制在每秒 10 个以下。

有关连接和身份验证的更多信息,请参阅以下内容:

使用 IAM 数据库身份验证对数据库实例或数据库群集进行身份验证

要使用 IAM 数据库身份验证对数据库实例或数据库群集进行身份验证,请执行以下步骤。

使用 IAM 数据库身份验证对数据库实例或数据库群集进行身份验证

  1. 通过使用 AWS 管理控制台、AWS CLI 或 Amazon RDS API,在数据库实例或数据库群集上启用 IAM 数据库身份验证。有关更多信息,请参阅 启用和禁用 IAM 数据库身份验证

  2. 创建一个或多个使用身份验证令牌的数据库用户账户,这些令牌可将这些账户映射到 IAM 用户或角色。方法是:在 CREATE USER 命令中指定身份验证插件。有关更多信息,请参阅 为 IAM 数据库身份验证创建数据库账户

  3. 通过指定数据库实例或数据库群集资源 ID 来创建授予 RDS 资源访问权的 IAM 策略,并创建启用身份验证令牌的数据库用户账户,用于访问这些资源。然后,将策略挂载到 IAM 用户或角色。这样做可将 IAM 用户或角色以指定的数据库用户身份连接到指定的数据库实例或数据库群集。有关更多信息,请参阅 将 IAM 策略账户挂载到 IAM 用户或角色。有关 IAM 的更多信息,请参阅 IAM 用户指南中的 IAM 用户IAM 角色

  4. 使用适用于 Java 的 AWS 软件开发工具包或 AWS CLI 获取可用于标识 IAM 用户或角色的身份验证令牌。要了解如何获取身份验证令牌,请参阅 获得身份验证令牌

  5. 使用 SSL 连接连接到数据库,指定使用 IAM 用户或角色作为数据库用户账户并指定使用身份验证令牌作为密码。有关更多信息,请参阅 使用 IAM 数据库身份验证连接到数据库实例或数据库群集

启用和禁用 IAM 数据库身份验证

您可以通过使用 AWS 管理控制台、AWS CLI 或 Amazon RDS API,为 IAM 数据库身份验证启用数据库实例或数据库群集。默认情况下已禁用 IAM 数据库身份验证。

Amazon RDS 管理控制台

您可以在控制台中启用和禁用 IAM 数据库身份验证,如下所示:

  • 如果您创建数据库实例或数据库群集,则可通过在 Configure Advanced Settings 页的 Database Options 组中将 Enable IAM DB Authentication 设为 Yes 来启用 IAM 数据库身份验证。

  • 如果您修改数据库实例或数据库群集,则可通过在 Modify DB Instance 页的 Database Options 组中将 Enable IAM DB Authentication 设为 Yes 来启用 IAM 数据库身份验证。

  • 如果您还原数据库实例或数据库群集,则可通过在 Restore DB Instance 页的 Database Options 组中将 Enable IAM DB Authentication 设为 No 来禁用 IAM 数据库身份验证。

AWS CLI

您可以使用 AWS CLI 启用和禁用 IAM 数据库身份验证,如下所示:

  • 如果您通过 CLI 创建数据库实例或数据库群集,则可通过 create-db-instance 命令 (MySQL) 或 create-db-cluster 命令 (Aurora) 启用 IAM 数据库身份验证。对于数据库实例或数据库群集,IAM 数据库身份验证默认关闭。要启用 IAM 数据库身份验证,请指定 --enable-iam-database-authentication

  • 如果您通过 CLI 修改数据库实例或数据库群集,则可通过 modify-db-instance 命令 (MySQL) 或 modify-db-cluster 命令 (Aurora) 启用或禁用 IAM 数据库身份验证。要启用 IAM 数据库身份验证,请指定 --enable-iam-database-authentication。要禁用 IAM 数据库身份验证,请指定 --no-enable-iam-database-authentication

  • 如果您使用 restore-db-instance-to-point-in-timerestore-db-instance-from-db-snapshot 命令还原数据库实例,或者使用 restore-db-cluster-to-point-in-timerestore-db-cluster-from-snapshot 命令还原数据库群集,则 IAM 数据库身份验证设置默认与源快照的设置相同。您可以更改 IAM 数据库身份验证设置,指定 --enable-iam-database-authentication 为启用,指定 --no-enable-iam-database-authentication 为禁用。

以下示例创建名为 mydbinstance 并启用 IAM 数据库身份验证的 MySQL 数据库实例。

针对 Linux、OS X 或 Unix:

aws rds create-db-instance \ --db-instance-identifier mydbinstance \ --db-instance-class db.m3.medium \ --engine MySQL \ --allocated-storage 20 \ --master-username masterawsuser \ --master-user-password masteruserpassword \ --enable-iam-database-authentication

对于 Windows:

aws rds create-db-instance ^ --db-instance-identifier mydbinstance ^ --db-instance-class db.m3.medium ^ --engine MySQL ^ --allocated-storage 20 ^ --master-username masterawsuser ^ --master-user-password masteruserpassword ^ --enable-iam-database-authentication

以下示例为 mysqldb 数据库实例启用 IAM 数据库身份验证。更改将立即应用。您可以使用 --no-apply-immediately 代替 --apply-immediately 以改为在下一个维护时段内应用更改。

针对 Linux、OS X 或 Unix:

aws rds modify-db-instance \ --db-instance-identifier mysqldb \ --apply-immediately \ --enable-iam-database-authentication

对于 Windows:

aws rds modify-db-instance ^ --db-instance-identifier mysqldb ^ --apply-immediately ^ --enable-iam-database-authentication

Amazon RDS API

您可以使用 Amazon RDS API 启用和禁用 IAM 数据库身份验证,如下所示:

  • 如果您通过 API 创建数据库实例或数据库群集,则可通过 CreateDBInstance 操作 (MySQL) 或 CreateDBCluster 操作 (Amazon Aurora) 启用 IAM 数据库身份验证。对于数据库实例或数据库群集,IAM 数据库身份验证默认关闭。要启用 IAM 数据库身份验证,请将 EnableIAMDatabaseAuthentication 指定为 true

  • 如果您通过 API 修改数据库实例或数据库群集,则可通过 ModifyDBInstance 操作 (MySQL) 或 ModifyDBCluster 操作 (Aurora) 启用或禁用 IAM 数据库身份验证。要启用 IAM 数据库身份验证,请将 EnableIAMDatabaseAuthentication 指定为 true。要禁用 IAM 数据库身份验证,请将 EnableIAMDatabaseAuthentication 指定为 false

  • 如果您使用 RestoreDBInstanceToPointInTimeRestoreDBInstanceFromDBSnapshot 操作还原数据库实例,或者使用 RestoreDBClusterToPointInTimeRestoreDBClusterFromSnapshot 操作还原数据库群集,则 IAM 数据库身份验证设置默认与源快照的设置相同。您可以更改 IAM 数据库身份验证设置,将 EnableIAMDatabaseAuthentication 指定为 true 为启用,将 EnableIAMDatabaseAuthentication 指定为 false 为禁用。

为 IAM 数据库身份验证创建数据库账户

要使用 IAM 数据库身份验证连接到数据库实例或数据库群集,您需要创建可接受身份验证令牌的数据库用户账户,这些令牌可将这些账户映射到 IAM 用户或角色。

为此,您必须使用身份验证插件。在本例中,使用 CREATE USER 命令的 IDENTIFIED WITH 参数将 AWSAuthenticationPlugin 指定为身份验证插件。这将创建数据库用户账户,该账户不存储密码,而是可以接受 AWS 身份验证令牌到其所在位置。

管理与身份验证插件关联的数据库账户的方式与管理其他数据库用户账户相同,需要从标准数据库客户端应用程序连接到数据库实例或数据库群集,然后运行 ALTER USER DROP USER 等 SQL 命令。

要创建使用身份验证令牌的数据库用户账户,请使用 CREATE USER MySQL 命令创建一个数据库用户账户,如下所示。

CREATE USER jane_doe IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';

在上述命令中,以下值为 true:

  • IDENTIFIED WITH 将数据库用户账户与插件 AWSAuthenticationPlugin 关联,该插件用于管理 IAM 数据库身份验证。

  • as 'RDS" 关键字将数据库账户映射到 IAM 用户或角色。IAM 用户或角色必须为 Amazon IAM ARN 格式。在这种情况下,数据库账户将映射到 arn:aws:iam::123456789012:user/jane_doe IAM 用户。如果启用 IAM 数据库身份验证,jane_doe 可对您的数据库实例进行身份验证。要了解有关 Amazon IAM ARN 格式的更多信息,请参阅 IAM ARN。要了解有关如何创建 IAM 用户或角色的更多信息,请参阅在您的 AWS 账户中创建 IAM 用户。要了解有关管理 IAM 用户的更多信息,请参阅管理 IAM 用户

注意

删除映射到数据库账户的 IAM 用户之后,应运行 DROP USER MySQL 命令删除该用户。

将 IAM 策略账户挂载到 IAM 用户或角色

要允许 IAM 用户或角色连接到 Amazon RDS 数据库实例或数据库群集,您必须创建一个 IAM 策略,并将该策略挂载到 IAM 用户或角色。IAM 策略指定对 AWS 资源的权限以及 IAM 用户或角色可执行的操作。在本例中,通过指定以下策略属性来允许数据库用户账户的访问权:

  • Effect:指定 Allow 以允许访问数据库实例或数据库群集。默认情况下,Effect 值为 Deny,即拒绝对数据库实例或数据库群集的访问。

  • Action:指定 rds-db:connect Action 值以允许连接到一个或多个数据库实例或数据库群集。

  • Resource:指定数据库用户账户 Amazon 资源名称 (ARN),其构成如下。

    arn:aws:rds-db:region:account-id:dbuser:dbi-resource-id/database-user-name

    您可通过指定 dbi 资源 ID 来允许连接到数据库实例或数据库群集中的特定数据库用户账户,如下例所示。

    arn:aws:rds-db:us-west-2:12345678:dbuser:db-12ABC34DEFG5HIJ6KLMNOP78QR/jane_doe

    您可以在 Amazon RDS管理控制台上的数据库实例或数据库群集详细信息页中找到 dbi 资源 ID。您也可以从 AWS CLI DbiResourceIdDBInstance 命令或 Amazon RDS API describe-db-instances 操作返回的 DescribeDBInstances 对象的 元素中获取数据库实例 dbi 资源 ID,或从 AWS CLI DbClusterResourceIdDBCluster 命令或 Amazon RDS API describe-db-clusters 操作返回的 DescribeDBClusters 对象的 元素中获取数据库群集 dbi 资源 ID。

    或者,您可用 * 替代指定 dbi 资源 ID 来允许连接到所有数据库实例或数据库群集中的数据库用户账户,如下例所示。请注意,所有数据库实例或数据库群集必须包含指定的启用身份验证令牌的数据库用户账户。

    arn:aws:rds-db:us-west-2:12345678:dbuser:*/jane_doe

    数据库用户必须与管理 IAM 数据库身份验证的 AWSAuthenticationPlugin 插件相关联,如 为 IAM 数据库身份验证创建数据库账户 中所述。

    IAM 用户或角色只能访问数据库用户有权访问的那些数据库。例如,如果您的数据库实例中有数据库 A 和 B,数据库用户 jane_doe 只有访问数据库 A 的权限,则使用该账户访问该数据库实例的 IAM 用户或角色也将只有访问数据库 A 的权限。相同的限制也适用于表、视图等其他数据库对象。

    您可以映射多个 IAM 用户或角色到同一数据库用户账户。例如,通过将数据库用户 ARN arn:aws:rds-db:us-west-2:12345678:dbuser:db-12ABC34DEFG5HIJ6KLMNOP78QR/jane_doe 指定为资源,IAM 用户 A 和 B 都可以拥有为其提供数据库实例访问权的策略。

要了解有关 IAM 策略的更多信息,请参阅IAM 策略概述

以下示例策略允许使用两个数据库用户账户连接到两个数据库实例。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "rds-db:connect" ], "Resource": [ "arn:aws:rds-db:us-west-2:12345678:dbuser:db-12ABC34DEFG5HIJ6KLMNOP78QR/jane_doe", "arn:aws:rds-db:us-east-1:12345678:dbuser:db-23ABC45DEFG6HIJ7KLMNOP89QR/mary_roe" ] } ] }

以下示例策略允许在给定账户的 us-west-2 区域中连接到所有数据库实例和数据库群集,该账户拥有启用身份验证令牌的数据库用户账户 jane_doe

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "rds-db:connect" ], "Resource": [ "arn:aws:rds-db:us-west-2:12345678:dbuser:*/jane_doe" ] } ] }

要了解如何将 rds-db:connect IAM 策略挂载到 IAM 用户或角色,请参阅 IAM 用户指南中的创建和挂载您的第一个客户托管策略教程。在该教程中,指定一个 rds-db:connect 策略,如上述策略。

获得身份验证令牌

如果采用 IAM 数据库身份验证方式,可使用 IAM 用户或角色以及身份验证令牌对数据库引擎进行身份验证。身份验证令牌是通过 AWS 签名版本 4 算法创建的值,使用期限为 15 分钟。如果使用过期的令牌连接数据库,则连接请求将被拒绝。

您可通过多种方式获得身份验证令牌;以下各节将分别解释每种方式:

如果应用程序在 Amazon EC2 实例中运行,您可以使用 EC2 实例配置文件凭证。有关 EC2 实例配置文件凭证的更多信息,请参阅 IAM 用户指南中的使用 IAM 角色授予对 Amazon EC2 上的 AWS 资源的访问权以及使用 IAM 角色为在 Amazon EC2 实例上运行的应用程序授权。

使用适用于 Java 的 AWS 开发工具包获取身份验证令牌

要使用 DefaultAWSCredentialsProviderChain 类获取身份验证令牌,请先创建 RdsIamAuthTokenGenerator 类的一个实例,该类位于AWS SDK for Java 中。然后调用 getToken() 方法。

要创建 RdsIamAuthTokenGenerator 的实例,必须提供 AWS 凭证。要提供 AWS 凭证,请先创建 DefaultAWSCredentialsProviderChain 类的一个实例,该类也位于AWS SDK for Java 中。该类将使用它在默认凭证提供程序链中找到的第一个 AWS 访问密钥和 AWS 私有密钥。有关 AWS 访问密钥的更多信息,请参阅管理 IAM 用户的访问密钥。对于 RdsIamAuthTokenGenerator 的实例,调用 getToken() 方法。

以下示例使用 DefaultAWSCredentialsProviderChain 获取身份验证令牌。

private static String generateAuthToken() { // Generate an authentication token using AWS credentials in the default credential provider chain. RdsIamAuthTokenGenerator generator = RdsIamAuthTokenGenerator.builder() .credentials(new DefaultAWSCredentialsProviderChain()) .region(regionName) .build(); String authToken = generator.getAuthToken(GetIamAuthTokenRequest .builder() .hostname(rds_instance_hostname) .port(rds_instance_port) .userName("iam-database-user") .build()); return authToken; }

使用 AWS CLI 获取身份验证令牌

您可以通过 generate-db-auth-token CLI 命令使用 AWS CLI 获取身份验证令牌。generate-db-auth-token 命令具有以下格式:

generate-db-auth-token --hostname <value> --port <value> --username <value>

generate-db-auth-token CLI 命令的参数定义如下:

  • hostname — (字符串) 数据库连接的主机名。

  • port — (整数) 数据库侦听的端口号。

  • username — (字符串) 登录使用的用户名。

以下示例为主机名生成适用于用户名 iamuser,在端口 3306 上的身份验证令牌。

aws rds generate-db-auth-token --hostname iam-db-auth-test.eu-central-1.rds.amazonaws.com --port 3306 --username iamuser

使用 IAM 数据库身份验证连接到数据库实例或数据库群集

下例使用上一示例中的 authToken 值连接到运行 MySQL 的数据库实例。要获取 Amazon RDS 实例的终端节点,可以使用 AWS 管理控制台或 AWS CLI describe-db-instances 命令 (对于 MySQL),或使用 RDS API 操作 describe-db-clusters (对于 Aurora)。

注意

您可以通过使用数据库群集的多个终端节点中的一个连接到 Aurora 数据库群集中的实例:群集终端节点、读取器终端节点或实例终端节点。有关更多信息,请参阅 Aurora 终端节点

private static Connection getDBConnectionUsingIam() { String jdbcUrl = "jdbc:mysql://" + rds_instance_endpoint; Properties mysqlConnectionProperties = new Properties(); mysqlConnectionProperties.setProperty("verifyServerCertificate", "true"); mysqlConnectionProperties.setProperty("useSSL", "true"); System.setProperty("javax.net.ssl.trustStore","path_to_truststore"); System.setProperty("javax.net.ssl.trustStorePassword","trustore_password"); mysqlConnectionProperties.setProperty("user", "iam-database-user"); // Call a method to generate an authentication token (see above example) String authToken = generateAuthToken(); // Set authentication token as password mysqlConnectionProperties.setProperty("password", authToken); Connection connection = DriverManager.getConnection(jdbcUrl, mysqlConnectionProperties); }

相关主题