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

2 分钟阅读
0

我有一个 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 或 Amazon Aurora PostgreSQL 兼容版数据库实例。我想使用 Amazon Identity and Access Management (IAM) 身份验证来连接我的实例。

简短描述

由于以下原因,IAM 数据库身份验证比本地身份验证方法更安全:

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

要使用 IAM 角色来设置 IAM 数据库身份验证,请执行以下步骤:

  1. 在 RDS 数据库实例上启用 IAM 数据库身份验证。
  2. 创建 IAM 用户并附加将数据库用户映射到 IAM 角色的 IAM 策略。
  3. 将 IAM 角色附加到 EC2 实例
  4. 生成亚马逊云科技身份验证令牌以识别 IAM 角色。
  5. 下载 SSL 根证书文件或证书捆绑包文件。
  6. 要连接到 RDS 数据库实例,请使用您的 IAM 角色凭证和身份验证令牌或 SSL 证书。

如果您运行 MySQL,请参阅如何允许用户使用他们的 IAM 凭证在 Amazon RDS for MySQL 数据库实例进行身份验证?

解决方法

在开始之前,请满足以下先决条件:

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

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

要连接到 RDS 数据库实例或 Aurora PostgreSQL 兼容版数据库集群,请使用适用于 PostgreSQL 的 IAM 数据库身份验证

  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 for PostgreSQL 数据库实例或 Aurora PostgreSQL 兼容版集群:

    psql

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

    pgAdmin

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

  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 中创建新的服务器连接,请选择常规选项卡并清除立即连接复选框。在连接选项卡中,输入主机名、端口和用户名,但不要输入密码。在 SSL 选项卡中,将 SSL 模式设置为需要,然后保存服务器连接。

  7. (可选)在 SSL 选项卡中,您可以将 SSL 模式更改为验证完整。对于所选的 SSL 模式,输入证书的路径。要下载路径,请运行以下命令:

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

    **注意:**自 2020 年起,2015 根证书已过期。要改为使用 2019 根证书,请参阅轮换您的 SSL/TLS 证书

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

    $ wget https://truststore.pki.rds.amazonaws.com/global/global-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 身份验证失败的错误,请检查亚马逊云科技账户是否为 Amazon Organizations 组织的一部分。如果该账户是组织的一部分,则将 rds-db:* 添加到该账户所属的组织的服务控制策略 (SCP)。另外,检查是否存在没有 rds-db 权限的 IAM 用户或角色的层次结构。有关更多信息,请参阅如何使用服务控制策略在您的 Amazon Organizations 的账户之间设置权限防护机制

相关信息

在 Aurora PostgreSQL 兼容版中使用 IAM 身份验证