Amazon s3 如何获取移动应用程序的STS凭据以访问安全的S3对象?
我已经在AWS Fargate中部署了后端服务。我想获取STS令牌,以便从本机移动应用程序检索一组安全的S3对象。我使用Terraform创建基础设施。我已经创建了Fargate任务角色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
任务角色
。因此,对于这个特定的用例,我创建了一个新角色本机应用程序角色
,并将任务角色
分配为一个受信任的关系,有权承担本机应用程序角色
以下是地形代码:
# 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
策略应该具有允许更广泛地访问s3的权限,并且您的方法调用只会限制已经存在的策略。在这种情况下,我将在terraform模板中为您的task\u角色
附加一个新策略,以允许操作task\u角色
到e bucket(或者如果需要,根据您的用例,将其添加到帐户中的所有bucket中) AssumeRole调用将用于将临时凭据的访问限制到特定的s3:GetObject
但我认为还有第二种选择要简单得多。但您需要评估它是否适用于您的用例: S3允许您为特定对象创建一个临时url,该url将允许拥有该url的用户在特定时间间隔内获取该对象。对于该解决方案,您还需要为bucket/objectkey
添加一个具有task\u role
权限的策略。但在这种情况下,您不需要调用AssumeRole方法在您的代码中。您只需调用该方法来创建预签名url并将其发送回您的用户。您可以使用java sdk找到有关此替代实现的更多详细信息S3:GetObject
在这种情况下,用户只能访问选定的对象,而不能访问整个bucket。我可以尝试帮助您提供两种备选方案,但要做到这一点,我需要确认您的用例。据我所知,您需要为特定用户提供读取权限(在定义的时间间隔内)一个特定的s3对象。如果是这种情况,我的建议如下: 第一种选择是尝试使您的解决方案起作用。但您需要对其进行测试,因为我在这里没有这种情况:首先,我将删除,只保留虚拟代理\u本地\u iam\u角色
。我仍然需要使用任务\u角色
和特定的任务\u角色
。但您的角色配置中缺少某些内容。根据: 结果会话的权限是角色基于身份的策略和会话策略的交叉点 因此,要使其正常工作,您的$buck>调用AssumeRoleet/$objectKey
策略应该具有允许更广泛地访问s3的权限,并且您的方法调用只会限制已经存在的策略。在这种情况下,我将在terraform模板中为您的task\u角色
附加一个新策略,以允许操作task\u角色
到e bucket(或者如果需要,根据您的用例,将其添加到帐户中的所有bucket中) AssumeRole调用将用于限制临时creden的访问s3:GetObject