クライアント (Windows 7/8、iPad など) に S3 リソースへのフェデレーション アクセスを提供する必要があるサーバーを実行している Amazon EC2 インスタンスがあります。これまでに、次のものを作成しました。
- サーバーが S3 リソースやその他の Amazon Web サービスに対して持つアクセスを制限する IAM ロール。
- STS サービス、つまり GetFederationToken を使用できる IAM ユーザー。
通常、クライアントはオブジェクトを 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 フェデレーション トークンをリクエストして提供することについて正しいですか? そうでない場合、そのようなアクセスを許可するにはどのように変更する必要がありますか?