如何使用 IAM 身份验证连接到 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL?

上次更新日期:2022 年 10 月 7 日

如何使用 AWS Identity and Access Management(IAM)身份验证连接到 Amazon Relational Database Service(Amazon RDS)PostgreSQL 或 Amazon Aurora PostgreSQL 兼容版数据库实例?

简短描述

用户可以使用 IAM 用户或角色凭证以及身份验证令牌连接到 Amazon RDS 数据库实例或集群。IAM 数据库身份验证比原生身份验证方法更安全,这是因为:

  • IAM 使用 AWS 访问密钥生成数据库身份验证令牌,因此您无需存储数据库用户凭证。
  • 身份验证令牌的有效期为 15 分钟,因此您无需强制执行密码重置。
  • IAM 数据库身份验证需要使用 SSL 连接,因此您传入和传出 RDS 数据库实例的所有数据都已加密。
  • 如果您的应用程序在 Amazon Elastic Compute Cloud (Amazon EC2) 上运行,您可以使用 EC2 实例配置文件凭证来访问数据库。您不需要在您的实例上存储数据库密码。

要使用 IAM 角色设置 IAM 数据库身份验证,请按照以下步骤操作:

1.    在 RDS 数据库实例上开启 IAM 数据库身份验证。

2.    创建一个 IAM 用户并附加一个可以将数据库用户映射到 IAM 角色的 IAM policy。

3.    将 IAM 角色附加到 EC2 实例

4.    生成一个 AWS 身份验证令牌以标识该 IAM 角色。

5.    下载 SSL 根证书文件或证书捆绑包文件。

6.    使用 IAM 角色凭证和身份验证令牌或 SSL 证书连接到 RDS 数据库实例。

如果您运行 MySQL,则参阅如何允许用户使用其 IAM 凭证向 Amazon RDS for MySQL 数据库实例进行身份验证?

解决方法

在开始之前,请务必执行以下操作:

  • 启动支持 IAM 数据库身份验证的 RDS for PostgreSQL 数据库实例或与 Aurora PostgreSQL 兼容的集群
  • 启动 EC2 实例以连接到该数据库

有关更多信息,请参阅 Amazon Aurora 的 IAM 数据库身份验证和 RDS 的 IAM 数据库身份验证

您可以使用 适用于 PostgreSQL 的 IAM 数据库身份验证来连接到 Amazon RDS 数据库实例或 Amazon Aurora PostgreSQL 数据库集群。

1.    在 RDS 数据库实例Aurora 集群上开启 IAM 身份验证。

2.    创建一个 IAM 用户并附加以下策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "rds-db:connect"
      ],
      "Resource": [
        "arn:aws:rds-db:<region>:<account>:dbuser:<resource id>/iamuser"
      ]
    }
  ]
}

注意:iamuser 替换为 IAM 用户信息。

3.    使用主用户登录到 Amazon RDS PostgreSQL 数据库实例或 Aurora PostgreSQL 集群。

psql

psql -h {database or cluster endpoint} -U {Master username} -d {database name}

pgAdmin

从 pgAdmin 导航窗格中选择 Servers(服务器)。然后,选择服务器名称并输入主用户密码。

4.    创建与 IAM 用户具有相同名称的子用户:

CREATE USER iamuser WITH LOGIN; 
GRANT rds_iam TO iamuser;

5.    使用您创建的用户名运行 generate-db-auth-token。这将为用户创建一个临时密码,以供后续使用。请参阅以下示例连接:

[ec2-user@ip-172-31-24-237 ~]$ export RDSHOST="aurorapg-ssl.cluster-XXXXXXXXXXX.us-west-2.rds.amazonaws.com"
[ec2-user@ip-172-31-24-237 ~]$ export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region us-west-2 --username iamuser)"
[ec2-user@ip-172-31-24-237 ~]$ echo $PGPASSWORD
aurorapg-ssl.cluster-XXXXXXX.us-west-2.rds.amazonaws.com:5432/?Action=connect&DBUser=iamuser&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=900&X-Amz-Credential=AKIA2O5GXNVDTAMABZFE%2F20190909%2Fus-west-2%2Frds-db%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Date=20190909T171907Z&X-Amz-Signature=ead28003477c3082e5a17529ac8316db4f4bdf2fa8f79d3aaea806e9bafa2673
[ec2-user@ip-172-31-24-237 ~]$

6.    要在 pgAdmin 中新建服务器连接,请选择 General(常规)选项卡并取消选中 Connect now(立即连接)框。在 Connection(连接)选项卡中,输入主机名、端口和用户名(无需输入密码)。在“SSL”选项卡中,将 SSL mode(SSL 模式)设置为 Require(需要),并保存服务器连接。

7.    (可选)在 SSL 选项卡中,您可以将 SSL mode(SSL 模式)更改为 verify-full。根据选择的 SSL 模式输入证书的路径(您可以通过运行以下命令来下载)。

wget https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem

注意:如果您使用 2015 年根证书,要注意它已在 2020 年到期。要迁移到 2019 年根证书,请参阅轮换 SSL/TLS 证书

如果您的应用程序不接受证书链,请运行以下命令以下载包含旧根证书和新根证书的证书捆绑包:

$ wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

8.    创建服务器后,在出现提示时,输入 generate-db-auth-token 为用户 iamuser 生成的临时令牌,以连接到服务器。

使用 psql 时,请运行以下命令进行连接。以下示例使用您在生成令牌时设置的环境变量 $PGPASSWORD。它在机器中设置并启动连接:

psql -h aurorapg-ssl.cfkx5hi8csxj.us-west-2.rds.amazonaws.com -p 5432 "sslmode=verify-full sslrootcert=rds-ca-2019-root.pem dbname=aurora_pg_ssl user=iamuser"

注意:生成后,每个令牌的有效期为 15 分钟。如果您尝试使用相同的令牌重新建立连接,连接将会失败。您必须生成新令牌。

如果您仍然收到类似“用户的 PAM 身份验证失败”等错误,请检查 AWS 账户是否属于 AWS Organizations 组织。如果账户属于某个组织,则要将 rds-db:* 添加到该账户所属的组织单位的服务控制策略(SCP)中。有关更多信息,请参阅创建、更新和删除服务控制策略

如果账户属于某个组织,则要检查 IAM 用户或角色是否有层次结构不具有 rds-db 权限。有关更多信息,请参阅如何使用服务控制策略设置您在 AWS Organizations 中的跨账户权限防护机制


这篇文章对您有帮助吗?


您是否需要账单或技术支持?