繁体   English   中英

从已在分配了IAM角色的Amazon EC2实例上运行的C#.NET应用程序为联合用户创建STS令牌

[英]Creating STS tokens for federated users from a C# .NET application running on an Amazon EC2 instance that's been assigned an IAM Role

我有一个运行服务器的Amazon EC2实例,需要为其客户端(Windows 7/8,iPad等)提供对S3资源的联合访问。 到目前为止,我创建了以下内容:

  • 一种IAM角色,用于限制服务器对S3资源和其他Amazon Web服务的访问。
  • 能够使用STS服务的IAM用户,即GetFederationToken。

通常,客户端将请求访问以获取或将对象放入S3,从不删除。 因此,在放置文件的情况下,不是让客户端将文件上传到服务器然后从服务器将其转发到S3,我想为客户端提供临时访问凭证,以便将文件直接放入适当的S3存储桶中。

以下是EC2实例IAM角色的样子:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": "arn:aws:s3:::devtestbucket/*"
    },
    {
      "Effect": "Allow",
      "Action": [ "sqs:*" ],
      "Resource": "arn:aws:sqs:us-west-2::dev-*"      
    },
    {
      "Effect": "Allow",
      "Action": [ "dynamodb:*" ],
      "Resource": "arn:aws:dynamodb:us-west-2::dev-*"      
    },
    {
      "Effect": "Allow",
      "Action": [ "sts:*" ],
      "Resource": "*"      
    }
  ]
}

STS Token Issuer IAM用户策略是:

{
  "Statement": [
    {
      "Action": [
        "sts:GetFederationToken"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:sts:::federated-user/*"
      ]
    },
    {
      "Action": [
        "s3:*"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::devtestbucket"
      ]
    }
  ]
}

在我的服务器端代码中,我创建了STS客户端,联合令牌请求并按如下方式进行GetFederationToken调用:

    var stsClient = new AmazonSecurityTokenServiceClient(stsTokenIssuerAwsAccessKeyId, stsTokenIssuerAwsSecretAccessKey);

    var request = new GetFederationTokenRequest
    {
        Name = GenerateIamFederatedUserName(),  // I know this is correct
        DurationSeconds = (int)TimeSpan.FromHours(6).TotalSeconds,
        Policy = GenerateSTSPolicy(objectPrefix, permittedActions) // This works as expected too
    };


    var fedTokenResponse = stsClient.GetFederationToken(request);

我不能分享Generate *函数的实现,但我知道那些工作。

这是奇怪的事情。 如果我使用绑定到用户的IAM用户凭据,其访问策略与上面显示的EC2实例角色完全相同,则一切都按预期工作,客户端可以执行所有预期的S3操作。

因此,在所有这些背景下,我的问题是:EC2实例上具有特定角色的应用程序是否仍然可以提供对其客户端的联合访问? 如果是,上述策略是否正确授予应用程序对这些AWS操作的访问权限,即请求和提供可以访问S3资源的sts联合令牌? 如果没有,应该如何修改它们以允许这种访问?

为了使这种情况有效,我不得不将策略的STS GetFederationToken部分分成它自己的策略。 因此,必须有2个策略,一个用于STS,另一个用于其他AWS服务:

STS政策:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "sts:GetFederationToken"
      ],
      "Sid": "Stmt1382573256000",
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    }
  ]
}

S3访问政策:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:List*"
      ],
      "Sid": "Stmt1382573312476",
      "Resource": [
        "arn:aws:s3:::devtestbucket"
      ],
      "Effect": "Allow"
    },
    {
      "Action": [
        "s3:*"
      ],
      "Sid": "Stmt1382573312000",
      "Resource": [
        "arn:aws:s3:::devtestbucket/*"
      ],
      "Effect": "Allow"
    }
  ]
}

不确定为什么会这样。 如果有人能够解释为什么需要两个政策而不是一个政策背后的原因,那就很有用了。

希望这有助于某人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM