簡體   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