2013-10-23 10 views
6

Ich habe eine Amazon EC2-Instanz läuft ein Server zugewiesen wird worden, der für seine Kunden föderierte Zugriff auf S3-Ressourcen bereitstellen muss (Fenster 7/8, iPad, unter anderem). Bisher habe ich Folgendes erstellt:Erstellen von STS-Tokens für föderierte Benutzer aus einer C# .NET-Anwendung auf einer Amazon EC2-Instanz ausgeführt wird, der eine IAM-Rolle

  • Eine IAM-Rolle, die den Zugriff des Servers auf S3-Ressourcen und andere Amazon-Webdienste beschränkt.
  • Ein IAM-Benutzer mit der Möglichkeit, STS-Dienste zu verwenden, nämlich GetFederationToken.
  • In der Regel werden die Clients Zugriff anfordern, um Objekte in S3 zu erhalten oder zu setzen, nie löschen. Wenn also der Client die Datei auf den Server hochlädt und sie dann vom Server an S3 weiterleitet, möchte ich die temporären Zugangsdaten für den Client bereitstellen, um die Datei direkt in den entsprechenden S3-Bucket zu stellen . Hier

    ist, was die EC2-Instanz IAM Rolle wie folgt aussieht:

    { 
        "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": "*"  
        } 
        ] 
    } 
    

    Und die STS Token Emittent IAM Nutzungsbedingungen ist:

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

    In meinem Server-Side-Code, erstelle ich den STS-Client vereinigungsTokenAnforderung und die GetFederationToken Anruf wie folgt:

    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); 
    

    ich nicht shar kann Die Implementierungen der Generate * -Funktionen, aber ich weiß, dass diese funktionieren.

    Hier ist das seltsame Ding. Wenn ich IAM-Benutzeranmeldeinformationen verwenden, die an einen Benutzer mit einer Zugriffsrichtlinie gebunden sind, die genau wie die oben gezeigte EC2-Instanzrolle aussieht, funktioniert alles wie erwartet und Clients können alle erwarteten S3-Aktionen ausführen.

    Vor diesem Hintergrund sind meine Fragen: Kann eine Anwendung auf einer EC2-Instanz, die eine bestimmte Rolle erhalten hat, weiterhin einen föderierten Zugriff auf ihre Clients bereitstellen? Wenn dies der Fall ist, sind die oben genannten Richtlinien korrekt, um der Anwendung Zugriff auf diese AWS-Aktionen zu gewähren, nämlich föderierte Token von sts anzufordern und zu liefern, die auf S3-Ressourcen zugreifen können? Wenn nicht, wie sollten sie geändert werden, um einen solchen Zugang zu ermöglichen?

    Antwort

    3

    dieses Szenario zum Laufen zu bringen, hatte ich den STS GetFederationToken Teil der Politik in ihre eigene Politik zu trennen. So hatte es 2 Politik sein, ein für STS und eine für andere Dienstleistungen AWS:

    STS Politik:

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

    S3-Richtlinie:

    { 
        "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" 
        } 
        ] 
    } 
    

    Nicht sicher genau, warum dies der Fall. Wenn jemand den Grund erklären kann, warum es zwei Richtlinien statt einer gibt, wäre es großartig, wissen Sie.

    Ich hoffe, das hilft jemandem.