

# GetFederationToken のアクセス権限
<a name="id_credentials_temp_control-access_getfederationtoken"></a>

`GetFederationToken` オペレーションは、IAM ユーザーによって呼び出され、そのユーザーの一時的な認証情報を返します。このオペレーションでは、ユーザーを*フェデレーション*します。AWS STS フェデレーションユーザーが割り当てられたアクセス権限は、次の 2 ヶ所のいずれかで定義されます。
+ `GetFederationToken` API コールのパラメータとして渡されるセッションポリシー。（こちらが普通です)。
+ ポリシーの `Principal` 要素で AWS STS フェデレーションユーザーのセッションを明示的に指名するリソースベースのポリシー。(こちらはそれほど一般的ではありません)。

セッションポリシーは、一時セッションをプログラムで作成する際にパラメータとして渡す高度なポリシーです。AWS STS フェデレーションユーザーのセッションを作成してセッションポリシーを渡すと、結果として得られるセッションのアクセス許可はユーザーのアイデンティティベースのポリシーおよびセッションポリシーの共通部分です。セッションポリシーを使用して、フェデレーションされているユーザーのアイデンティティベースのポリシーによって許可されている以上のアクセス許可を付与することはできません。

ほとんどの場合、`GetFederationToken` API 呼び出しでポリシーを渡さなければ、返される一時的なセキュリティ認証情報はアクセス権限を持ちません。ただし、リソースベースのポリシーでは、セッションに追加のアクセス許可を提供できます。セッションを許可されたプリンシパルとして指定するリソースベースのポリシーを使用してリソースにアクセスできます。

次の図は、ポリシーがどのように相互作用して、`GetFederationToken` の呼び出しによって返される一時的なセキュリティ認証情報のアクセス権限が決まるかを視覚的に示しています。

![\[IAM ユーザー次の図は、セッション許可がユーザーの ID ベースのポリシーとセッションポリシーで共通していることを示すチェックマークを示しています。セッション許可は、ユーザーの ID ベースのポリシーとリソースベースのポリシーで共通している場合もあります。\]](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/getfederationtoken-permissions.diagram.png)


## 例: GetFederationToken を使用してアクセス権限を割り当てる
<a name="permissions-get-federation-token-example"></a>

`GetFederationToken` API アクションをさまざまなポリシーと共に使用できます。ここにいくつか例を挙げます。

### ポリシーを IAM ユーザーにアタッチするには
<a name="permissions-get-federation-token-example-iam-user"></a>

この例では、2 つのバックエンドウェブサービスに頼ったブラウザベースのクライアントアプリケーションがあります。1 つのバックエンドサービスは、独自の ID システムを使用してクライアントアプリケーションを認証する独自の認証サーバーです。もう 1 つのバックエンドサービスは、クライアントアプリケーションの機能の一部を提供する AWS サービスです。クライアントアプリケーションはサーバーによって認証され、サーバーは適切なアクセス許可ポリシーを作成または取得します。サーバーは、続いて、`GetFederationToken` API を呼び出して一時的なセキュリティ認証情報を取得し、その認証情報をクライアントアプリケーションに返します。クライアントアプリケーションは、その後、一時的なセキュリティ認証情報を使って AWS サービスに対してリクエストを直接行うことができます。このアーキテクチャでは、AWS 長期的認証情報を埋め込まなくても、クライアントアプリケーションが AWS リクエストを実行できます。

認証サーバーは、`GetFederationToken` という名前の IAM ユーザーの長期的なセキュリティ認証情報を使用して `token-app` API を呼び出します。ただし、長期的な IAM ユーザー認証情報はサーバーにとどまり、決してクライアントには配布されません。次のポリシーの例は `token-app` IAM ユーザーにアタッチされ、AWS STS フェデレーションユーザー (クライアント) が必要とする最も広範囲なアクセス権限を定義します。AWS STS フェデレーションユーザーの一時的なセキュリティ認証情報を取得するには、認証サービスに `sts:GetFederationToken` アクセス許可が必要になることに注意してください。

**Example `token-app` を呼び出す IAMユーザー `GetFederationToken` にアタッチされたポリシーの例**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:GetFederationToken",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "dynamodb:ListTables",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "sqs:ReceiveMessage",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "sns:ListSubscriptions",
      "Resource": "*"
    }
  ]
}
```

前述のポリシーは、IAM ユーザーに複数のアクセス許可を付与します。ただし、このポリシーだけで AWS STS フェデレーションユーザーにアクセス許可が付与されることはありません。この IAM ユーザーが `GetFederationToken` を呼び出して、API コールのパラメータとしてポリシーを渡さない場合、結果として得られる AWS STS フェデレーションユーザーには有効なアクセス許可がありません。

### パラメータとして渡されたセッションポリシー
<a name="permissions-get-federation-token-example-passed-policy"></a>

AWS STS フェデレーションユーザーに適切なアクセス許可を確実に割り当てる最も一般的な方法は、`GetFederationToken` API コールでセッションポリシーを渡すことです。前の例を拡張して、`GetFederationToken` が IAM ユーザー `token-app` の認証情報を使用して呼び出されると仮定します。次に、API 呼び出しのパラメータとして以下のセッションポリシーを渡すとします。結果として得られる AWS STS フェデレーションユーザーには、`productionapp` という名前の Amazon S3 バケットのコンテンツを一覧表示するアクセス許可があります。ユーザーは、`productionapp` バケット内の項目に対して Amazon S3 `GetObject`、`PutObject`、および `DeleteObject` アクションを実行できません。

アクセス許可は IAM ユーザーポリシーとユーザーが渡すセッションポリシーとの共通部分であるため、フェデレーティッドユーザーにはこれらのアクセス許可が割り当てられます。

AWS STS フェデレーションユーザーは、Amazon SNS、Amazon SQS、Amazon DynamoDB、`productionapp` を除くすべての S3 バケットでアクションを実行できませんでした。これらのアクションは、このアクセス許可が `GetFederationToken` コールに関連付けられている IAM ユーザーに付与されている場合でも拒否されます。

**Example `GetFederationToken` API 呼び出しのパラメータとして渡されるセッションポリシー**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::productionapp"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::productionapp/*"]
    }
  ]
}
```

### リソースベースのポリシー
<a name="permissions-get-federation-token-resource-based-policy"></a>

一部の AWS リソースはリソースベースのポリシーをサポートし、これらのポリシーは AWS STS フェデレーションユーザーにアクセス許可を直接付与する別の仕組みを実現します。一部の AWS サービスのみでリソースに基づくポリシーをサポートしています。たとえば、Amazon S3 にはバケット、Amazon SNS にはトピック、Amazon SQS にはキューがあり、これらにポリシーをアタッチできます。リソースベースのポリシーをサポートするすべてのサービスのリストについては、「[IAM と連携する AWS のサービス](reference_aws-services-that-work-with-iam.md)」を参照の上、テーブルの「リソースベースのポリシー」列を確認してください。リソースベースのポリシーを使用し、AWS STS フェデレーションユーザーに直接アクセス許可を割り当てることができます。リソースベースのポリシーの `Principal` 要素で AWS STS フェデレーションユーザーの Amazon Resource Name (ARN) を指定します。以下の例では、これを表し、また `productionapp` という名前の S3 バケットを使用して前の例を拡張しています。

次のリソースベースのポリシーは、バケットにアタッチされています。このバケットポリシーでは、Carol という名前の AWS STS フェデレーションユーザーに対してバケットへのアクセスを許可します。以前に説明したポリシーの例が `token-app` IAM ユーザーにアタッチされると、Carol という名前の AWS STS フェデレーションユーザーは `productionapp` という名前のバケットに対し、`s3:GetObject`、`s3:PutObject`、`s3:DeleteObject` のアクションを実行するアクセス許可があります。これは、`GetFederationToken` API コールのパラメータとしてセッションポリシーが渡されていない場合にも当てはまります。この場合、Carol という名前の AWS STS フェデレーションユーザーは、次のリソースベースのポリシーによってアクセス権限が明示的に付与されているからです。

IAM ユーザー***と*** AWS STS フェデレーションユーザーの両方にアクセス許可が明示的に付与されている場合に限り、AWS STS フェデレーションユーザーにアクセス許可が付与されることについて覚えておきましょう。次の例のように、ポリシーの `Principal` 要素で AWS STS フェデレーションユーザーを明示的に指名するリソースベースのポリシーによって (アカウント内で) 付与することもできます。

**Example フェデレーティッドユーザーにアクセスを許可するバケットポリシーの例**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Principal": {
            "AWS": "arn:aws:sts::111122223333:federated-user/Carol"
        },
        "Effect": "Allow",
        "Action": [
            "s3:GetObject",
            "s3:PutObject",
            "s3:DeleteObject"
        ],
        "Resource": [
            "arn:aws:s3:::productionapp/*"
        ]
    }
}
```

ポリシーの評価方法の詳細については、「[ポリシーの評価論理](reference_policies_evaluation-logic.md)」を参照してください。