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

本文关键字:应用程序 NET 身份 令牌 STS 创建 用户 运行 IAM 分配 角色 | 更新日期: 2023-09-27 18:36:48

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

  • 一个 IAM 角色,用于限制服务器对 S3 资源和其他 亚马逊云科技服务的访问。
  • 能够使用 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 令牌颁发者 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* 函数的实现,但我知道这些工作。

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

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

从在分配了 IAM 角色的 Amazon EC2 实例上运行的 C# .NET 应用程序为联合身份用户创建 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"
    }
  ]
}

不知道为什么会这样。如果有人能解释为什么需要两个政策而不是一个政策背后的原因,那就太好了。

希望这对某人有所帮助。