【问题标题】:How to do RDS IAM Authentication with Django?如何使用 Django 进行 RDS IAM 身份验证?
【发布时间】:2020-01-11 22:02:57
【问题描述】:

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

【问题讨论】:

    标签: django postgresql amazon-web-services amazon-rds amazon-iam


    【解决方案1】:

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

    但原则上是以下步骤:

    第一个enable IAM Authentication

    然后add the policy and attach it 连接到数据库的角色或用户。

    {
    "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"
            ]
        }
    ]
    }
    

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

    CREATE USER db_userx WITH LOGIN; 
    GRANT rds_iam TO db_userx;
    

    对于 Django,您需要一个自定义后端以允许动态生成凭据。

    创建一个包,例如your.package.postgresql,其中包含base.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
    

    然后使用如下设置:

    DATABASES = {
        "default": {
            "HOST": "<hostname>",
            "USER": "<user>",
            "PORT": 5432,
            "ENGINE": "your.package.postgresql"
        }
    }
    

    【讨论】:

    • 这种 your.package.postgresql 方法很干净,而且有效——但只能持续 15 分钟。之后,身份验证令牌过期,后续连接失败。我已经在 GitHub 上尝试过你的包,但得到 django.db.utils.OperationalError: FATAL: PAM authentication failed for user "db_userx" 将继续寻找......
    猜你喜欢
    • 2019-09-14
    • 1970-01-01
    • 2017-12-08
    • 2012-11-12
    • 2020-09-03
    • 2020-12-21
    • 1970-01-01
    • 2023-01-05
    • 2017-10-21
    相关资源
    最近更新 更多