如何配置AWS MFA用于Terraform?

8

我希望为Terraform执行MFA,这意味着每次terraform [command]都需要从我的虚拟MFA设备请求6位令牌。在阅读文档之后:cli-roles terraform mfa 我创建了一个角色:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::[ACCOUNT_ID]:user/testuser"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
    }
  ]
}

该用户默认需要使用多因素身份验证,我已为他配置了虚拟多因素身份验证设备。

~/.aws/credentials:

[default]
...

[terraform_role]
role_arn = arn:aws:iam::[ACCOUNT_ID]:role/terraform-test-role
source_profile = default
mfa_serial = arn:aws:iam::[ACCOUNT_ID]:mfa/testuser

在我的 Terraform 环境中,我放置了以下内容:
provider "aws" {
  profile = "terraform_role"
}

但是当我运行terraform plan时,它会抛出一个错误:
Error refreshing state: 1 error(s) occurred:

* provider.aws: No valid credential sources found for AWS Provider.
  Please see https://terraform.io/docs/providers/aws/index.html for more information on
  providing credentials for the AWS Provider

已创建了一个名为 .config 的文件,其中包含有关配置文件的信息。 - Malice
在我的 ~/.aws/config 文件中,我只有以下内容 [default] region = us-east-1 output = json - Alexander Nekrasov
你需要为 terraform_role 创建一个新的配置文件。 - Malice
@Malice terraform-role语句在~/.aws/credentials文件中是对该配置文件的声明。 - Alexander Nekrasov
这个问题是早期的,然而有一个更新的重复问题,其中有更多答案的链接是Terraform unable to assume roles with MFA enabled - Hongbo Miao
3个回答

2
解决方案是指定一个assume_role语句:
provider "aws" {
  profile = "default"
  assume_role {
    role_arn = "arn:aws:iam::[ACCOUNT_ID]:role/terraform-test-role"
  }
}

一旦我添加了“assume_role”部分,我就会收到错误提示:provider.aws:无法扮演角色"arn:aws:iam::[ACCOUNT_ID]:role/terraform-test-role"。 有关如何修复它的任何想法? - shlomiLan
你可能需要为用户创建一个假定角色策略,以允许它扮演这个角色,但老实说,我不明白这如何解决原始问题。 - Eric Rini
你把这部分放在哪里? - thevoipman

1

不幸的是,仅使用assume_role语句并不能解决问题。您需要使用一个MFA身份验证包装器aws-runas,它不仅可以简化扮演角色的过程,还可以为.aws/credentials文件上的mfa_serial子句提供支持。

简而言之,有三个步骤:

  1. 您需要像以前一样拥有您的.aws/credentials文件。
  2. 安装aws-runas
  3. 运行应用程序:aws-runas [your_profile] - terraform apply

0
我在使用Terraform设置MFA强制执行时遇到了这个问题。
这是我解决问题的方法:
我必须使用enforce-mfa Terraform模块。
data aws_caller_identity current {}

resource aws_iam_group support {
  name =  "support"
}

module enforce_mfa {
  source  = "terraform-module/enforce-mfa/aws"
  version = "~> 1.0"

  policy_name                     = "managed-mfa-enforce"
  account_id                      = data.aws_caller_identity.current.id
  groups                          = [aws_iam_group.support.name]
  manage_own_signing_certificates  = true
  manage_own_ssh_public_keys      = true
  manage_own_git_credentials      = true
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接