我有一个 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 或 Amazon Aurora PostgreSQL 兼容版数据库实例。我想使用 Amazon Identity and Access Management (IAM) 身份验证来连接我的实例。
简短描述
IAM 数据库身份验证比原生身份验证方法更安全。有关详细信息,请参阅适用于 MariaDB、MySQL 和 PostgreSQL 的 IAM 数据库身份验证。
要使用 IAM 角色设置 IAM 数据库身份验证,请完成以下步骤:
- 在 RDS 数据库实例上启用 IAM 数据库身份验证。
- 创建 IAM 用户,然后附加一个将数据库用户映射到 IAM 角色的 IAM 策略。
- 将该 IAM 角色附加到 Amazon Elastic Compute Cloud (Amazon EC2) 实例。
- 生成 AWS 身份验证令牌来识别 IAM 角色。
- 下载 SSL 根证书文件或证书捆绑包文件。
- 要连接到 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 数据库身份验证:
-
在您的 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 中创建新的服务器连接,请选择 General(常规)选项卡并清除 Connect now(立即连接)复选框。在 Connection(连接)选项卡中,输入主机名、端口和用户名,但不要输入密码。在 SSL 选项卡中,将 SSL mode(SSL 模式)设置为 Require(需要),然后保存服务器连接。
-
(可选)您可以在 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
-
连接到服务器。系统提示时,输入 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 证书。