

# VPC 条件キーを使用してフェデレーティッドアクセスをコントロールする
<a name="reference_sts_vpc_condition_keys_federated"></a>

フェデレーションユーザーは、`AssumeRoleWithSAML` または `AssumeRoleWithWebIdentity` を使用して、VPC エンドポイント経由でロールを引き受けることができます。その場合は、ロールの信頼ポリシーまたはリソースコントロールポリシー (RCP) で VPC 固有の条件キーを使用して、これらのリクエストの発信元を制限できます。これにより、信頼ポリシーのアイデンティティレベルのコントロールに加えて、ネットワークレベルの境界が提供されます。

**Topics**
+ [フェデレーティッドリクエストに対する VPC 条件キーの仕組み](#reference_sts_vpc_condition_keys_federated_how)
+ [例: OIDC フェデレーションを特定の VPC に制限する](#reference_sts_vpc_condition_keys_federated_example_oidc_vpc)
+ [例: SAML フェデレーションを特定の VPC エンドポイントに制限する](#reference_sts_vpc_condition_keys_federated_example_saml_vpce)
+ [例: VPC 内のプライベート IP 範囲による OIDC フェデレーションの制限](#reference_sts_vpc_condition_keys_federated_example_ip)
+ [例: SAML フェデレーションを複数の VPC に制限する](#reference_sts_vpc_condition_keys_federated_example_saml_multi_vpc)
+ [例: VPC とプロバイダー固有の条件を組み合わせる](#reference_sts_vpc_condition_keys_federated_example_combined)
+ [例: RCP を使用して、特定の VPC へのフェデレーティッドアクセスを制限する](#reference_sts_vpc_condition_keys_federated_example_rcp)

## フェデレーティッドリクエストに対する VPC 条件キーの仕組み
<a name="reference_sts_vpc_condition_keys_federated_how"></a>

リクエストコンテキストで使用できる条件キーは、フェデレーティッドリクエストのネットワークパスによって異なります。


**ネットワークパス別の VPC 条件キーの可用性**  

| 条件キー | VPC エンドポイント経由 | パブリックインターネット経由 | [Description] (説明) | 
| --- | --- | --- | --- | 
| `aws:SourceVpc` | はい | いいえ | リクエストが通過する VPC ID | 
| `aws:SourceVpcArn` | はい | いいえ | リクエストが通過する VPC の ARN | 
| `aws:SourceVpce` | はい | いいえ | リクエストが通過する VPC エンドポイント ID | 
| `aws:VpcSourceIp` | はい | いいえ | VPC 内の発信者のプライベート IP アドレス | 
| `aws:SourceIp` | いいえ | はい | 発信者のパブリック IP アドレス | 

信頼ポリシーが `Allow` ステートメントで `aws:SourceVpc`、`aws:SourceVpcArn`、または `aws:SourceVpce` を使用していて、リクエストが VPC エンドポイントを通過してきていない場合、条件は一致せず、AWS はリクエストを黙示的に拒否します。これにより、フェデレーティッドリクエストが成功するためには、VPC エンドポイントを通過することが実質的に必要になります。

**重要**  
VPC エンドポイントを介して行われたリクエストでは、`aws:SourceIp` は入力されません。代わりに、IP ベースの制限には `aws:VpcSourceIp` を使用します。

信頼ポリシーでは、`aws:SourceVpc` の代わりに `aws:SourceVpcArn` を使用することをお勧めします。VPC ID はリージョンごとに一意ですが、グローバルに一意ではありません。一方、`aws:SourceVpcArn` にはリージョンとアカウントが含まれており、VPC をグローバルに一意に識別できます。

**注記**  
次の OIDC 例のオーディエンス (`aud`) 値は、Amazon EKS のデフォルトである `sts.amazonaws.com` を使用します。他の OIDC プロバイダーでは、これをアプリケーション用に設定されたオーディエンス値 (クライアント ID やアプリケーション URI など) に置き換えます。

## 例: OIDC フェデレーションを特定の VPC に制限する
<a name="reference_sts_vpc_condition_keys_federated_example_oidc_vpc"></a>

次の信頼ポリシーは、リクエストが VPC エンドポイントを介して特定の VPC から発信された場合にのみ、OIDC プロバイダーがロールを引き受けることを許可します。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowOIDCFromVpc",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::111122223333:oidc-provider/idp.example.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "idp.example.com:aud": "sts.amazonaws.com",
                    "aws:SourceVpcArn": "arn:aws:ec2:us-west-2:111122223333:vpc/vpc-111bbb22"
                }
            }
        }
    ]
}
```

AWS は、`aws:SourceVpcArn` 条件が一致しないため、指定された VPC の外部からのリクエストを黙示的に拒否します。明示的な拒否ステートメントは必要ありません。

## 例: SAML フェデレーションを特定の VPC エンドポイントに制限する
<a name="reference_sts_vpc_condition_keys_federated_example_saml_vpce"></a>

次の信頼ポリシーは、リクエストが特定の VPC エンドポイントを通過してくる場合にのみ、SAML プロバイダーがロールを引き受けることを許可します。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSAMLFromVpce",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::111122223333:saml-provider/ExampleProvider"
            },
            "Action": "sts:AssumeRoleWithSAML",
            "Condition": {
                "StringEquals": {
                    "SAML:aud": "https://signin.aws.amazon.com/saml",
                    "aws:SourceVpce": "vpce-0abcdef1234567890"
                }
            }
        }
    ]
}
```

`aws:SourceVpc` の代わりに `aws:SourceVpce` を使用すると、同じ VPC に複数の VPC エンドポイントがあり、特定のエンドポイントへのアクセスを制限したい場合に、より詳細なコントロールが可能になります。

## 例: VPC 内のプライベート IP 範囲による OIDC フェデレーションの制限
<a name="reference_sts_vpc_condition_keys_federated_example_ip"></a>

次の信頼ポリシーは、フェデレーションを VPC 内の特定のサブネットから発信されるリクエストに制限します。VPC エンドポイントを介して行われたリクエストに対する IP ベースの制限には、`aws:VpcSourceIp` を使用します。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowOIDCFromSubnet",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::111122223333:oidc-provider/idp.example.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "idp.example.com:aud": "sts.amazonaws.com",
                    "aws:SourceVpcArn": "arn:aws:ec2:us-west-2:111122223333:vpc/vpc-111bbb22"
                },
                "IpAddress": {
                    "aws:VpcSourceIp": "10.0.1.0/24"
                }
            }
        }
    ]
}
```

**重要**  
VPC エンドポイントを介したリクエストには、プライベート IP 範囲とともに `aws:SourceIp` を使用しないでください。`aws:SourceIp` キーは VPC エンドポイントリクエストでは使用できません。代わりに `aws:VpcSourceIp` を使用します。

## 例: SAML フェデレーションを複数の VPC に制限する
<a name="reference_sts_vpc_condition_keys_federated_example_saml_multi_vpc"></a>

次の信頼ポリシーは、SAML プロバイダーが複数の VPC のいずれかからロールを引き受けることを許可します。これは、同じロールへのフェデレーティッドアクセスを必要とする異なる環境またはリージョン全体で複数の VPC がある場合に便利です。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSAMLFromMultipleVpcs",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::111122223333:saml-provider/ExampleProvider"
            },
            "Action": "sts:AssumeRoleWithSAML",
            "Condition": {
                "StringEquals": {
                    "SAML:aud": "https://signin.aws.amazon.com/saml",
                    "aws:SourceVpcArn": [
                        "arn:aws:ec2:us-west-2:111122223333:vpc/vpc-111aaa11",
                        "arn:aws:ec2:us-east-1:111122223333:vpc/vpc-222bbb22"
                    ]
                }
            }
        }
    ]
}
```

## 例: VPC とプロバイダー固有の条件を組み合わせる
<a name="reference_sts_vpc_condition_keys_federated_example_combined"></a>

VPC 条件キーをオーディエンス (`aud`) やサブジェクト (`sub`) などのプロバイダー固有の条件と組み合わせて、きめ細かなアクセスコントロールを行うことができます。次の信頼ポリシーは、ロールの引き受けを特定のフェデレーションユーザーに制限し、リクエストが特定の VPC から発信されることを必要とします。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowOIDCUserFromVpc",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::111122223333:oidc-provider/idp.example.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "idp.example.com:aud": "sts.amazonaws.com",
                    "idp.example.com:sub": "user123",
                    "aws:SourceVpcArn": "arn:aws:ec2:us-west-2:111122223333:vpc/vpc-111bbb22"
                }
            }
        }
    ]
}
```

これは、アイデンティティレベルのコントロール (特定のフェデレーションユーザーに制限) とネットワークレベルのコントロール (特定の VPC に制限) を組み合わせて、多層防御を提供します。

## 例: RCP を使用して、特定の VPC へのフェデレーティッドアクセスを制限する
<a name="reference_sts_vpc_condition_keys_federated_example_rcp"></a>

次のリソースコントロールポリシー (RCP) は、特定の VPC から発信されない限り、`AssumeRoleWithSAML` および `AssumeRoleWithWebIdentity` リクエストを拒否します。ロールごとに適用される信頼ポリシーとは異なり、リソースコントロールポリシー (RCP) はターゲットアカウントのすべてのロール全体に適用されます。これにより、一元化されたネットワーク境界が提供されます。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyFederatedAccessOutsideVpc",
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "sts:AssumeRoleWithWebIdentity",
                "sts:AssumeRoleWithSAML"
            ],
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "aws:SourceVpcArn": "arn:aws:ec2:us-west-2:111122223333:vpc/vpc-111bbb22"
                },
                "Null": {
                    "aws:SourceVpcArn": "false"
                }
            }
        }
    ]
}
```

`Null` 条件により、`aws:SourceVpcArn` がリクエストコンテキストに存在する (つまり、リクエストが VPC エンドポイントを通過してきたが、間違った VPC からであった) 場合にのみ拒否が適用されます。これがないと、パブリックインターネット経由のリクエスト (`aws:SourceVpcArn` が存在しない場合) も `StringNotEquals` によって拒否されます。`Null` チェックを削除すると、パブリックインターネット経由のリクエストを含め、VPC エンドポイントを経由しないリクエストにも拒否が適用されます。本番環境で `Null` チェックを削除する前に、徹底的にテストすることをお勧めします。