AWS 跨账户 Postgres RDS IAM 身份验证

Posted

技术标签:

【中文标题】AWS 跨账户 Postgres RDS IAM 身份验证【英文标题】:AWS cross account Postgres RDS IAM authentication 【发布时间】:2020-12-21 21:14:45 【问题描述】:

我正在尝试设置跨账户 Postgres RDS IAM 身份验证。我的用例是一个 Python 代码,它由 ECS 引擎顶部的 AWS Batch 容器化和执行,连接到另一个 AWS 账户中的 Postgres RDS。我尝试遵循here 描述的路线(发起数据库连接的帐户中的单一角色),但连接失败:

2020-06-12 19:41:10,363 - root - 错误 - 从数据 DB 读取数据时出错:致命:用户“db_user”的 PAM 身份验证失败

我还找到了this one 并尝试设置类似的东西(每个帐户都有一个角色,但没有 EC2 实例作为连接源)。不幸的是,它因同样的错误而失败。有谁知道可能与我的用例匹配的任何其他 AWS 文档?

【问题讨论】:

您需要确保您尝试登录的 linux 用户存在于数据库中。你能确认它是否存在吗?? 是的,它在那里并且拥有所有必要的权限。 您在哪一步收到此错误?你现在到底想做什么? 你试过没有跨账户案例的python代码吗?是否能够使用 IAM 连接到 Postgres? 是的,我尝试了 Python 代码 - 在同一个 AWS 账户中连接到 RDS 效果很好。 【参考方案1】:

在 AWS 支持人员的帮助下,我设法解决了这个问题。这些是我必须执行的操作:

    将以下策略添加到应用于 AWS Batch 作业(AWS 账户 A)的 IAM 角色:

    “版本”:“2012-10-17”, “陈述”: “效果”:“允许”, "动作": "sts:AssumeRole", “资源”:“arn:aws:iam::ACCOUNT_B_ID:role/ecsTaskExecutionRole”

    具有以下信任策略:

    “版本”:“2008-10-17”, “陈述”: [ “席德”:“”, “效果”:“允许”, “主要的”: “服务”:“ecs-tasks.amazonaws.com” , “动作”:“sts:AssumeRole” ]

    在用于 RDS 托管的 AWS 账户(AWS 账户 B)中添加以下 IAM 角色:

    “版本”:“2012-10-17”, “陈述”: [ “效果”:“允许”, “行动”: [ “rds-db:连接” ], “资源”:[ “arn:aws:rds-db::ACCOUNT_B_ID:dbuser:rds-resource-id/batch-user” ] ]

    具有以下信任策略:

    “版本”:“2008-10-17”, “陈述”: [ “席德”:“”, “效果”:“允许”, “主要的”: "AWS": "arn:aws:iam::ACCOUNT_A_ID:root", “服务”:“ecs-tasks.amazonaws.com” , “动作”:“sts:AssumeRole” ]

    更新在 AWS Batch 容器中执行的代码:

    sts_client = boto3.client('sts') 假定角色对象=sts_client.assume_role( RoleArn="arn:aws:iam::ACCOUNT_B_ID:role/ROLE_TO_BE_ASSUMED", RoleSessionName="AssumeRoleSession1" )

    credentials=assumed_role_object['Credentials'] 客户端 = boto3.client( 'rds', aws_access_key_id=凭证['AccessKeyId'], aws_secret_access_key=凭证['SecretAccessKey'], aws_session_token=凭证['SessionToken'], region_name=地区)

    #client = boto3.client('rds')

    token = client.generate_db_auth_token(DBHostname=ENDPOINT, Port=PORT, DBUsername=USR, Region=REGION)

    尝试: conn = psycopg2.connect(主机=ENDPOINT,端口=PORT,数据库=DBNAME,用户=USR,密码=令牌) cur = conn.cursor() cur.execute("""现在选择()""") query_results = cur.fetchall() 打印(查询结果) 例外为 e: print("数据库连接失败,因为 ".format(e))

【讨论】:

这里有一个更详细的解决方案:aws.amazon.com/blogs/database/…

以上是关于AWS 跨账户 Postgres RDS IAM 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

IAM 权限策略是不是可以用于允许访问跨账户资源?

使用 IAM 身份验证和 Spring JDBC(DataSource 和 JdbcTemplace)访问 AWS RDS

如何从 aws rds 导出 postgres 数据库

如何仅提取 AWS RDS(Postgres 数据库)中的更改数据(CDC)并将更改数据转储到另一个 RDS postgres 实例?

AWS IAM Cloudformation YAML 模板错误:不允许使用“空”值

将 EC2 实例连接到另一个 AWS 账户上的 RDS 卷