如何使用 Django 进行 RDS IAM 身份验证?

Nas*_*sir 7 django postgresql amazon-web-services amazon-rds amazon-iam

我希望我的 django 应用程序使用 IAM 身份验证连接到 RDS postgres。这意味着数据库密码每 15 分钟过期一次,应该重新生成。问题是如何在运行时更改数据库密码?或者我应该更新我的数据库 URL 环境?

Nas*_*sir 13

我们为此功能实现了一个包并发布到 PyPi。你可以在这里查看https://github.com/labd/django-iam-dbauth

但原则上这里是步骤:

首先启用 IAM 身份验证

然后添加策略并将其附加到连接到数据库的角色或用户。

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "rds-db:connect"
        ],
        "Resource": [
            "arn:aws:rds-db:us-east-2:1234567890:dbuser:db-ABCDEFGHIJKL01234/db_userx"
        ]
    }
]
}
Run Code Online (Sandbox Code Playgroud)

然后在您的 AWS postgres 上创建一个用户并rds_iam为其授予角色:

CREATE USER db_userx WITH LOGIN; 
GRANT rds_iam TO db_userx;
Run Code Online (Sandbox Code Playgroud)

对于 Django,您需要一个自定义后端来允许即时生成凭据。

创建一个包,如your.package.postgresqlbase.py

import boto3
from django.db.backends.postgresql import base

class DatabaseWrapper(base.DatabaseWrapper):
    def get_connection_params(self):
        params = super().get_connection_params()
        rds_client = boto3.client("rds")
        params["password"] = rds_client.generate_db_auth_token(
            DBHostname=params.get("host", "localhost"),
            Port=params.get("port", 5432),
            DBUsername=params.get("user") or getpass.getuser(),
        )

        return params
Run Code Online (Sandbox Code Playgroud)

然后使用如下设置:

DATABASES = {
    "default": {
        "HOST": "<hostname>",
        "USER": "<user>",
        "PORT": 5432,
        "ENGINE": "your.package.postgresql"
    }
}
Run Code Online (Sandbox Code Playgroud)