【问题标题】:AWS RDS IAM Authentication with Terraform使用 Terraform 进行 AWS RDS IAM 身份验证
【发布时间】:2019-09-14 00:01:27
【问题描述】:

我正在尝试正确设置我的基础架构,并且没有密码或密钥。 AWS RDS 可以选择这样做,让用户(应用程序)使用生成的令牌进行身份验证。

但是,在文档中,其中一个步骤 (this one) 需要在 Postgres 数据库中运行查询以创建用户并授予他特定权限:

CREATE USER test_rds WITH LOGIN;
GRANT rds_iam TO test_rds;

我想使用 Terraform 配置整个堆栈。我在 RDS 实例化后查找了一些“hacks”来运行查询 (here),方法是:

resource "null_resource" "db_setup" {
  depends_on = ["aws_db_instance.your_database_instance",   "aws_security_group.sg_allowing_external_access"]

    provisioner "local-exec" {
 // run shell commands to manually psql into the db

或:

resource "aws_instance" "web" {


  provisioner "remote-exec" {
    inline = [
   // run shell commands to manually psql into the db

但它们都需要创建主密码并以某种方式将其传递到“脚本”中。

是否可以使用 Terraform 干净地做到这一点,没有硬编码的密码被传递?

我很想配置数据库并仅启用具有正确 permissions 的特定 EC2/ECS 实例来访问它,而我的 git 存储库中没有任何密码。

【问题讨论】:

    标签: postgresql amazon-web-services amazon-rds terraform infrastructure-as-code


    【解决方案1】:

    为 RDS 数据库启用 IAM 身份验证后,您将无法再为该用户/角色使用基于密码的身份验证。

    这意味着您可以使用安全性较低的密码,甚至只生成一个随机密码(使用random_id resource),用于设置主密码并首先用于身份验证,以便您可以授予rds_iam 权限主用户和您创建的任何其他用户。

    虽然此密码最终会出现在状态文件中(即使是随机生成的),但如上所述,一旦应用了rds_iam 授权,您将无法使用此密码登录您的数据库。

    【讨论】:

    • 其他人的主密码不是仍然有效吗?我能够(从我自己的工作站)运行所需的查询以启用基于 IAM 的身份验证,并且不会使凭证无效。我仍然可以使用主密码访问数据库。
    • 您还需要将授权添加到您正在登录的用户。我在任何地方都找不到它的文档,但是当我在自己的 RDS 数据库上启用它时我感到很困惑,我在申请授权后不再能够使用用户名/密码凭证登录,AWS 支持确认一旦出现这种情况rds_iam 权限授予用户。
    • 现在听起来更合理了,非常感谢!我明天会尝试实施它,然后接受你的回答。你会推荐什么 Terraform“方法”来执行查询?
    • 您应该能够在aws_db_instance 资源本身上使用local-exec 配置程序,因此它只会在创建RDS 实例时运行。 postgresql provider 也很有用,但现在 RDS 存在一些问题,所以我正在维护它的一个分支,直到问题得到修复。
    • 现在编辑了,希望够清楚吗?我更喜欢链接到一些文档,但是我找不到任何明确说明这种行为发生的内容,尽管当您考虑幕后发生的事情时这是有道理的(RDS 每 15 分钟轮换一次用户的密码,然后在通过 IAM 身份验证后请求时提供该密码。
    【解决方案2】:

    要为 IAM 身份验证准备 RDS 数据库用户,可以添加以下 terraform 配置:

    resource "postgresql_role" "db_user" {
      name  = "db_userx"
      login = true
      roles = ["rds_iam"]
    }
    

    上面的代码使用了cyrilgdn/postgresql 提供者。如果您使用 aws_db_instance 属性为其连接参数配置提供程序,如下所示,则强制执行正确的依赖顺序。

    provider "postgresql" {
      host            = aws_db_instance.web.address
      port            = aws_db_instance.web.port
      database        = "postgres"
      username        = aws_db_instance.web.username
      password        = aws_db_instance.web.password
      sslmode         = "require"
      connect_timeout = 15
      superuser       = false # postgres user is not a true superuser in RDS
    }
    

    RDS User Guide 现在包括以下内容:

    对于 PostgreSQL,如果将 IAM 角色 (rds_iam) 添加到主用户, IAM 身份验证优先于密码身份验证,因此 主用户必须以 IAM 用户身份登录

    【讨论】:

      猜你喜欢
      • 2017-12-08
      • 2020-01-11
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 2018-11-23
      • 2023-01-05
      • 1970-01-01
      相关资源
      最近更新 更多