

# IAM 数据库身份验证
<a name="UsingWithRDS.IAMDBAuth"></a>

您可以使用 Amazon Identity and Access Management（IAM）数据库身份验证对数据库集群进行身份验证。IAM 数据库身份验证适用于 Aurora MySQL 和 Aurora PostgreSQL。利用此身份验证方法，您在连接到数据库集群时将无需使用密码。而是使用身份验证令牌。

*身份验证令牌* 是 Amazon Aurora 根据请求生成的唯一字符串。身份验证令牌是使用 Amazon 签名版本 4 生成的。每个令牌的使用期限为 15 分钟。您无需将用户凭证存储在数据库中，因为身份验证是使用 IAM 进行外部管理的。此外，您仍可使用标准数据库身份验证。令牌仅用于身份验证，建立后不会影响会话。

IAM 数据库身份验证具有以下优势：
+ 数据库的出站和进站网络流量是使用安全套接字层 (SSL) 或传输层安全性 (TLS) 加密的。有关将 SSL/TLS 与 Amazon Aurora 一起使用的更多信息，请参阅[使用 SSL/TLS 加密与数据库集群的连接](UsingWithRDS.SSL.md)。
+ 您可以使用 IAM 集中管理对数据库资源的访问，而不是单独管理对每个数据库集群的访问。
+ 对于在 Amazon EC2 上运行的应用程序，您可以使用 EC2 实例特定的配置文件凭证访问数据库以提高安全性，而不是使用密码。

一般来说，如果应用程序每秒创建的连接少于 200 个，而且您不想直接在应用程序代码中管理用户名和密码，请考虑使用 IAM 数据库身份验证。

Amazon Web Services（Amazon）JDBC 驱动程序支持 IAM 数据库身份验证。有关更多信息，请参阅 [Amazon Web Services（Amazon）JDBC 驱动程序 GitHub 存储库](https://github.com/aws/aws-advanced-jdbc-wrapper)中的 [Amazon IAM 身份验证插件](https://github.com/aws/aws-advanced-jdbc-wrapper/blob/main/docs/using-the-jdbc-driver/using-plugins/UsingTheIamAuthenticationPlugin.md)。

Amazon Web Services（Amazon）Python 驱动程序支持 IAM 数据库身份验证。有关更多信息，请参阅 [Amazon Web Services（Amazon）Python 驱动程序 GitHub 存储库](https://github.com/aws/aws-advanced-python-wrapper)中的 [Amazon IAM 身份验证插件](https://github.com/aws/aws-advanced-python-wrapper/blob/main/docs/using-the-python-driver/using-plugins/UsingTheIamAuthenticationPlugin.md)。

浏览以下主题，学习设置 IAM 用于数据库身份验证的过程：
+ [启用和禁用 IAM 数据库身份验证](UsingWithRDS.IAMDBAuth.Enabling.md)
+ [创建和使用适用于 IAM 数据库访问的 IAM 策略](UsingWithRDS.IAMDBAuth.IAMPolicy.md)
+ [使用 IAM 身份验证创建数据库账户](UsingWithRDS.IAMDBAuth.DBAccounts.md)
+ [使用 IAM 身份验证连接到数据库集群](UsingWithRDS.IAMDBAuth.Connecting.md) 

## 区域和版本可用性
<a name="UsingWithRDS.IAMDBAuth.Availability"></a>

 功能可用性和支持因每个 Aurora 数据库引擎的特定版本以及 Amazon Web Services 区域 而异。有关适用于 Aurora 和 IAM 数据库身份验证的版本和区域可用性的更多信息，请参阅 [支持 IAM 数据库身份验证的区域和 Aurora 数据库引擎](Concepts.Aurora_Fea_Regions_DB-eng.Feature.IAMdbauth.md)。

对于 Aurora MySQL，除 db.t2.small 和 db.t3.small 外，所有受支持的数据库实例类都支持 IAM 数据库身份验证。有关受支持的数据库实例类的信息，请参阅 [数据库实例类支持的数据库引擎](Concepts.DBInstanceClass.SupportAurora.md)。

## CLI 和开发工具包支持
<a name="UsingWithRDS.IAMDBAuth.cli-sdk"></a>

IAM 数据库身份验证可用于 [Amazon CLI](https://docs.amazonaws.cn/cli/latest/reference/rds/generate-db-auth-token.html) 以及以下特定于语言的 Amazon 软件开发工具包：
+ [适用于 .NET 的 Amazon SDK](https://docs.amazonaws.cn/sdkfornet/v3/apidocs/items/RDS/TRDSAuthTokenGenerator.html)
+ [适用于 C\$1\$1 的 Amazon SDK](https://sdk.amazonaws.com/cpp/api/LATEST/class_aws_1_1_r_d_s_1_1_r_d_s_client.html#ae134ffffed5d7672f6156d324e7bd392)
+ [适用于 Go 的 Amazon SDK](https://docs.amazonaws.cn/sdk-for-go/api/service/rds/#pkg-overview)
+ [适用于 Java 的 Amazon SDK](https://docs.amazonaws.cn/sdk-for-java/latest/reference/software/amazon/awssdk/services/rds/RdsUtilities.html)
+ [适用于 JavaScript 的 Amazon SDK](https://docs.amazonaws.cn/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_rds_signer.html)
+ [适用于 PHP 的 Amazon SDK](https://docs.amazonaws.cn/aws-sdk-php/v3/api/class-Aws.Rds.AuthTokenGenerator.html)
+ [适用于 Python (Boto3) 的 Amazon SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html#RDS.Client.generate_db_auth_token)
+ [适用于 Ruby 的 Amazon SDK](https://docs.amazonaws.cn/sdk-for-ruby/v3/api/Aws/RDS/AuthTokenGenerator.html)

## IAM 数据库身份验证的限制
<a name="UsingWithRDS.IAMDBAuth.Limitations"></a>

使用 IAM 数据库身份验证时，以下限制适用：
+ 目前，IAM 数据库身份验证并不支持所有的全局条件上下文键。

  有关全局条件上下文键的更多信息，请参阅《IAM 用户指南**》中的 [Amazon 全局条件上下文键](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html)。
+ 对于 PostgreSQL，如果将 IAM 角色（`rds_iam`）添加到某个用户（包括 RDS 主用户），IAM 身份验证将优先于密码身份验证，因此该用户必须以 IAM 用户身份登录。
+ 不能使用自定义 Route 53 DNS 记录代替数据库集群端点来生成身份验证令牌。
+ CloudWatch 和 CloudTrail 不记录 IAM 身份验证。这些服务不会跟踪授权 IAM 角色启用数据库连接的 `generate-db-auth-token` API 调用。
+ IAM 数据库身份验证需要数据库集群上的计算资源。您的数据库上必须有 300 到 1000 MiB 的额外内存，才能实现可靠的连接。要查看工作负载所需的内存，请在启用 IAM 数据库身份验证之前和之后，比较增强型监控进程列表中 RDS 进程的 RES 列。请参阅[在 RDS 控制台中查看操作系统指标](USER_Monitoring.OS.Viewing.md)。

  如果您使用的是可突增类实例，请通过将其它参数使用的内存（如缓冲区和缓存）减少相同的量，从而避免内存耗尽。
+ 对于 Aurora MySQL，您不能对使用 IAM 身份验证配置的数据库用户使用基于密码的身份验证。
+ 对于任何引擎，RDS on Outposts 不支持 IAM 数据库身份验证。

## IAM 数据库身份验证建议
<a name="UsingWithRDS.IAMDBAuth.ConnectionsPerSecond"></a>

在使用 IAM 数据库身份验证时，建议使用以下方法：
+ 当您的应用程序每秒需要少于 200 个新的 IAM 数据库身份验证连接时，请使用 IAM 数据库身份验证。

  使用 Amazon Aurora 的数据库引擎不会对每秒的身份验证尝试次数施加任何限制。不过，在使用 IAM 数据库身份验证时，您的应用程序必须生成身份验证令牌。之后，您的应用程序将使用该令牌连接到数据库集群。如果超出每秒的最大新连接数限制，则 IAM 数据库身份验证的额外开销可能会导致连接受到限制。

  考虑在应用程序中使用连接池来减少持续的连接创建。这可以减少 IAM 数据库身份验证的开销，并允许应用程序重用现有连接。或者，考虑对这些使用案例使用 RDS 代理。RDS 代理有额外费用。请参阅 [RDS 代理定价](https://www.amazonaws.cn/rds/proxy/pricing/)。
+ IAM 数据库身份验证令牌的大小取决于许多因素，包括 IAM 标签的数量、IAM 服务策略、ARN 长度以及其他 IAM 和数据库属性。此令牌的最小大小通常约为 1KB，但可以更大。由于使用 IAM 身份验证将此令牌用作数据库的连接字符串中的密码，因此，您应确保您的数据库驱动程序（例如 ODBC）和/或任何工具不会因其大小而限制或以其他方式截断该令牌。截断的令牌将导致数据库和 IAM 执行的身份验证失败。
+ 如果您在创建 IAM 数据库身份验证令牌时使用临时凭证，则在使用 IAM 数据库身份验证令牌发出连接请求时，临时凭证必须仍然有效。

## 不支持的 Amazon 全局条件上下文键
<a name="UsingWithRDS.IAMDBAuth.GlobalContextKeys"></a>

 IAM 数据库身份验证不支持 Amazon 全局条件上下文键的以下子集。
+ `aws:Referer`
+ `aws:SourceIp`
+ `aws:SourceVpc`
+ `aws:SourceVpce`
+ `aws:UserAgent`
+ `aws:VpcSourceIp`

有关更多信息，请参阅《IAM 用户指南》**中的 [Amazon 全局条件上下文键](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html)。