如何使用 IAM 身份验证连接到 RDS PostgreSQL 实例?

上次更新时间:2020 年 8 月 19 日

如何使用 AWS Identity and Access Management (IAM) 身份验证连接到 Amazon Relational Database Service (Amazon RDS) 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 策略。
  3. 将该 IAM 角色附加到该 EC2 实例。
  4. 生成一个 AWS 身份验证令牌来标识该 IAM 角色。
  5. 下载 SSL 根证书文件或证书捆绑包文件。
  6. 使用 IAM 角色凭证和身份验证令牌或 SSL 证书连接到 RDS 数据库实例。

如果您运行 MySQL,请参阅如何允许用户使用 IAM 凭证连接到 Amazon RDS MySQL 数据库实例

解决方法

在开始之前,请确保您已经启动了一个支持 IAM 数据库身份验证的 RDS 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"
            ]
        }
    ]
}

注意:在策略示例中,IAM 用户名为 iamuser

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) 中。有关更多信息,请参阅更新 SCP

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


这篇文章对您有帮助吗?


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