使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

如何使用 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 数据库身份验证比原生身份验证方法更安全。有关详细信息,请参阅适用于 MariaDB、MySQL 和 PostgreSQL 的 IAM 数据库身份验证

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

  1. 在 RDS 数据库实例上启用 IAM 数据库身份验证。
  2. 创建 IAM 用户,然后附加一个将数据库用户映射到 IAM 角色的 IAM 策略。
  3. 将该 IAM 角色附加到 Amazon Elastic Compute Cloud (Amazon EC2) 实例
  4. 生成 AWS 身份验证令牌来识别 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 数据库身份验证

要验证使用 Amazon RDS 实例或 Aurora 集群进行 IAM 身份验证所需的配置或对 IAM 身份验证进行故障排除,请使用 AWSSupport-TroubleshootRDSIAMAuthentication 运行手册。有关详细信息,请参阅 AWSSupport-TroubleshootRDSIAMAuthentication

使用 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 中创建新的服务器连接,请选择 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

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

    $ 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 身份验证失败”的错误,请检查 AWS 账户是否为 Amazon Organizations 组织的一部分。如果该账户是组织的一部分,请将 rds-db:* 添加到该账户所属的组织的服务控制策略 (SCP)。另外,检查是否存在没有 rds-db 权限的 IAM 用户或角色的层次结构。

有关更多信息,请参阅如何使用服务控制策略在您的 Amazon Organizations 的账户之间设置权限防护机制

相关信息

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

轮换您的 SSL/TLS 证书