IAM Authentication

AWS IAM用于管理对资源的访问。通过 IAM Authentication,我们可以允进行RDS 数据库身份验证,而无需使用数据库密码。IAM Authentication具有以下优势:

  • 无需在数据库中存储用户密码,因为身份验证是使用 IAM 在外部管理的。我们仍然可以对某些用户使用标准数据库身份验证,同时对其他用户使用 IAM 数据库身份验证。
  • 使用 IAM 集中管理对数据库资源的访问,而不是单独管理每个数据库实例的访问。
  • 对于在EC2 上运行的应用程序,可以使用instance profile来访问数据库,而不是使用密码,以提高安全性。

配置IAM Database Authentication Policy

为名为 iam-db-user的用户组装一个ARN((我们将在下一节中创建用户), 保存生成的 ARN:

echo \"arn:aws:rds-db:`aws configure \
get region`:`aws sts \
get-caller-identity --query "Account" --output text`:dbuser:`aws \
rds describe-db-instances --db-instance-identifier rds-pg-labs \
--query "DBInstances[*].DbiResourceId" --output text`/iam_db_user\"

image-20231104173836507

输出:

"arn:aws:rds-db:us-west-2:145197526627:dbuser:db-FN4GBE6TTWLI2RS2W73NIPPM2E/iam_db_user"

在IAM控制台上创建一个新的policy,内容如下,命名为RDSAUTH_iam_db_user

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "rds-db:connect",
            "Resource": "arn:aws:rds-db:us-west-2:145197526627:dbuser:db-FN4GBE6TTWLI2RS2W73NIPPM2E/iam_db_user" 
        }
    ]
}

在IAM控制台上创建一个新的Role,信任实体为EC2,并添加这个policy。创建完成后将这个Role attach到对应的EC2上。

使用IAM authentication连接到数据库

需要使用 SSL 才能使用 RDS IAM 身份验证。

要使用 SSL验证 RDS endpoint,需要 PostgreSQL 客户端的 RDS SSL 证书副本。先下载 ssl 证书:

wget https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem -O /home/ec2-user/environment/rds-ca-2019-root.pem

使用以下ssl 参数, psql 在 SSL 通信期间会验证 RDS 服务器证书:

psql "sslrootcert=/home/ec2-user/environment/rds-ca-2019-root.pem sslmode=verify-full dbname=pglab"

image-20231104174137443

创建一个iam_db_user用户,然后授予rds_iam角色:

select current_user;

CREATE USER iam_db_user with LOGIN; 
GRANT rds_iam TO iam_db_user;

image-20231104182318142

通过执行以下命令生成用户iam_db_user连接数据库的authentication token

export PGPASSWORD=`aws rds generate-db-auth-token \
    --hostname $DBENDP \
    --port 5432 \
    --region $AWSREGION \
    --username iam_db_user`

它的格式如下:

image-20231223091703841

使用这个密码连接到数据库:

psql "sslrootcert=/home/ec2-user/environment/rds-ca-2019-root.pem sslmode=verify-full dbname=pglab user=iam_db_user"
select current_user;

image-20231223091745300