Amazon s3 如何获取移动应用程序的STS凭据以访问安全的S3对象?

Amazon s3 如何获取移动应用程序的STS凭据以访问安全的S3对象?,amazon-s3,terraform,amazon-iam,Amazon S3,Terraform,Amazon Iam,我已经在AWS Fargate中部署了后端服务。我想获取STS令牌,以便从本机移动应用程序检索一组安全的S3对象。我使用Terraform创建基础设施。我已经创建了Fargate任务角色任务角色。因此,对于这个特定的用例,我创建了一个新角色本机应用程序角色,并将任务角色分配为一个受信任的关系,有权承担本机应用程序角色 以下是地形代码: # Fargate Role with trust relationship to ECS data "aws_iam_policy_document" "fg

我已经在AWS Fargate中部署了后端服务。我想获取STS令牌,以便从本机移动应用程序检索一组安全的S3对象。我使用Terraform创建基础设施。我已经创建了Fargate任务角色
任务角色
。因此,对于这个特定的用例,我创建了一个新角色
本机应用程序角色
,并将
任务角色
分配为一个受信任的关系,有权承担
本机应用程序角色

以下是地形代码:

# Fargate Role with trust relationship to ECS

data "aws_iam_policy_document" "fg_task_role_assume_role_policy_doc" {
  statement {
    actions = [
      "sts:AssumeRole"
    ]

    effect = "Allow"

    principals {
      type = "Service"
      identifiers = [
        "ecs-tasks.amazonaws.com"
      ]
    }
  }
}


resource "aws_iam_role" "task_role" {
  name = "${var.application}-${var.namespace}-fargate-task-role"
  assume_role_policy = data.aws_iam_policy_document.fg_task_role_assume_role_policy_doc.json

  tags = {
    Name = "${var.application}-${var.namespace}-fargate-task-role" # virtual-agent-alpha-fargate-task-role
  }
}


# Native app role with trust relationship to Fargate role
data "aws_iam_policy_document" "native_app_iam_policy_doc" {
  statement {
    actions = [
      "sts:AssumeRole"
    ]

    effect = "Allow"

    principals {
      type = "AWS"
      identifiers = [
        aws_iam_role.task_role.arn
      ]
    }
  }
}

resource "aws_iam_role" "virtual_agent_native_iam_role" {
  name = "${var.application}-${var.namespace}-native-application-role"
  assume_role_policy = data.aws_iam_policy_document.native_app_iam_policy_doc.json

  tags = {
    Name = "${var.application}-native-${var.namespace}-role"
  }
}
data "aws_iam_policy_document" "virtual_agent_native_assume_role_policy_doc" {
  statement {
    effect = "Allow"
    actions = ["sts:AssumeRole"]
    resources = ["*"]
  }
}

resource "aws_iam_policy" "virtual_agent_native_assume_role_policy" {
  name = "${var.application}-${var.namespace}-native-role-assume-role-policy"
  policy = data.aws_iam_policy_document.virtual_agent_native_assume_role_policy_doc.json
}

resource "aws_iam_role_policy_attachment" "task_role_virtual_agent_native_assume_role_policy_att" {
  role = aws_iam_role.task_role.name
  policy_arn = aws_iam_policy.virtual_agent_native_assume_role_policy.arn
}
然后,我使用以下Kotlin代码获取STS凭据: 注意:
roleArn
virtual\u agent\u native\u iam\u角色的ARN

fun getS3ReadOnlyTempCredentials(roleArn: String, bucket: String, objectKey: String, expiry: Expiry = Expiry(15, ChronoUnit.MINUTES)): AwsStsCredentials {
        val duration = Duration.of(expiry.duration, expiry.unit).toSeconds().toInt()
        val request = AssumeRoleRequest().apply {
            this.roleArn = roleArn
            roleSessionName = UUID.randomUUID().toString()
            durationSeconds = duration
            policy = """
                {
                  "Id": "${UUID.randomUUID()}",
                  "Version": "2012-10-17",
                  "Statement": [
                    {
                      "Action": [
                        "s3:GetObject"
                      ],
                      "Effect": "Allow",
                      "Resource": "arn:aws:s3:::$bucket/$objectKey",
                      "Principal": {
                        "AWS": [ $roleArn ]
                      }
                    }
                  ]
                }
            """.trimIndent()
        }

        return stsClient.assumeRole(request).credentials.let {
            AwsStsCredentials(it.accessKeyId, it.secretAccessKey, it.sessionToken, ZonedDateTime.now().plusSeconds(duration.toLong()) )
        }

执行此操作时,会出现以下错误:
com.amazonaws.services.securitytoken.model.AWSSecurityTokenServiceException:用户:arn:aws:sts::913597729265:假定角色/虚拟代理alpha fargate任务角色/c082fba5-3d13-4030-a457-9a18fb105efd无权在资源上执行:sts:AssumeRole:“arn:aws:iam::913597729265:角色/虚拟代理alpha本机应用程序角色”(服务:AWSSecurityTokenService;状态代码:403;错误代码:AccessDenied;请求ID:573630b6-b02a-4185-ae5b-9360d05b4225)

上面的错误表示,
虚拟代理alpha fargate任务角色
无权担任
虚拟本机角色
,但我已通过Terraform的
aws_iam_resource
属性添加了信任关系


有人能指出我做错了什么吗?

我相信你的角色创建是错误的。你在代码中创建的策略必须是你的terraform模板中的虚拟代理本地iam角色的一部分


您也不需要在代码中假设角色,您可以将任务配置为使用您在terraform模板中创建的执行角色。查看更多信息。

我认为您的角色创建是错误的。您在代码中创建的策略必须是您的
虚拟代理\u本地\u iam\u角色的一部分我们的地形模板


您也不需要在代码中假设角色,您可以将任务配置为使用您在terraform模板中创建的执行角色。查看更多信息。

我可以尝试在两个备选方案中帮助您,但要做到这一点,我需要确认您的用例。据我所知,您需要为特定用户提供访问权限(在规定的时间间隔内)读取特定的s3对象。如果是这种情况,我的建议如下:

第一种选择是尝试使您的解决方案起作用。但您需要对其进行测试,因为我在这里没有这种情况:首先,我将删除
虚拟代理\u本地\u iam\u角色
,只保留
任务\u角色
。我仍然需要使用
任务\u角色
和特定的
$buck>调用AssumeRoleet/$objectKey
。但您的角色配置中缺少某些内容。根据:

结果会话的权限是角色基于身份的策略和会话策略的交叉点

因此,要使其正常工作,您的
task\u角色
策略应该具有允许更广泛地访问s3的权限,并且您的方法调用只会限制已经存在的策略。在这种情况下,我将在terraform模板中为您的
task\u角色
附加一个新策略,以允许操作
s3:GetObject
到e bucket(或者如果需要,根据您的用例,将其添加到帐户中的所有bucket中)

AssumeRole调用将用于将临时凭据的访问限制到特定的
bucket/objectkey

但我认为还有第二种选择要简单得多。但您需要评估它是否适用于您的用例:

S3允许您为特定对象创建一个临时url,该url将允许拥有该url的用户在特定时间间隔内获取该对象。对于该解决方案,您还需要为
task\u role
添加一个具有
S3:GetObject
权限的策略。但在这种情况下,您不需要调用AssumeRole方法在您的代码中。您只需调用该方法来创建预签名url并将其发送回您的用户。您可以使用java sdk找到有关此替代实现的更多详细信息


在这种情况下,用户只能访问选定的对象,而不能访问整个bucket。

我可以尝试帮助您提供两种备选方案,但要做到这一点,我需要确认您的用例。据我所知,您需要为特定用户提供读取权限(在定义的时间间隔内)一个特定的s3对象。如果是这种情况,我的建议如下:

第一种选择是尝试使您的解决方案起作用。但您需要对其进行测试,因为我在这里没有这种情况:首先,我将删除
虚拟代理\u本地\u iam\u角色
,只保留
任务\u角色
。我仍然需要使用
任务\u角色
和特定的
$buck>调用AssumeRoleet/$objectKey
。但您的角色配置中缺少某些内容。根据:

结果会话的权限是角色基于身份的策略和会话策略的交叉点

因此,要使其正常工作,您的
task\u角色
策略应该具有允许更广泛地访问s3的权限,并且您的方法调用只会限制已经存在的策略。在这种情况下,我将在terraform模板中为您的
task\u角色
附加一个新策略,以允许操作
s3:GetObject
到e bucket(或者如果需要,根据您的用例,将其添加到帐户中的所有bucket中)

AssumeRole调用将用于限制临时creden的访问