我有一个 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 数据库身份验证,请执行以下步骤:
- 在 RDS 数据库实例上启用 IAM 数据库身份验证。
- 创建 IAM 用户并附加将数据库用户映射到 IAM 角色的 IAM 策略。
- 将 IAM 角色附加到 EC2 实例。
- 生成亚马逊云科技身份验证令牌以识别 IAM 角色。
- 下载 SSL 根证书文件或证书捆绑包文件。
- 要连接到 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 数据库身份验证:
-
在您的 RDS 数据库实例或 Aurora 集群上启用 IAM 身份验证。
-
创建 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 用户信息。
-
以主用户身份登录您的 Amazon RDS for PostgreSQL 数据库实例或 Aurora PostgreSQL 兼容版集群:
psql
psql -h {database or cluster endpoint} -U {Master username} -d {database name}
pgAdmin
从 pgAdmin 导航窗格中选择服务器。然后,选择服务器名称并输入主用户密码。
-
创建与 IAM 用户同名的子用户:
CREATE USER iamuser WITH LOGIN;
GRANT rds_iam TO iamuser;
-
使用您创建的用户名来运行 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 ~]$
-
要在 pgAdmin 中创建新的服务器连接,请选择常规选项卡并清除立即连接复选框。在连接选项卡中,输入主机名、端口和用户名,但不要输入密码。在 SSL 选项卡中,将 SSL 模式设置为需要,然后保存服务器连接。
-
(可选)在 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
-
创建服务器后,连接到服务器。出现提示时,输入 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 身份验证