VPC 条件キーを使用してフェデレーティッドアクセスをコントロールする
フェデレーションユーザーは、AssumeRoleWithSAML または AssumeRoleWithWebIdentity を使用して、VPC エンドポイント経由でロールを引き受けることができます。その場合は、ロールの信頼ポリシーまたはリソースコントロールポリシー (RCP) で VPC 固有の条件キーを使用して、これらのリクエストの発信元を制限できます。これにより、信頼ポリシーのアイデンティティレベルのコントロールに加えて、ネットワークレベルの境界が提供されます。
トピック
フェデレーティッドリクエストに対する VPC 条件キーの仕組み
リクエストコンテキストで使用できる条件キーは、フェデレーティッドリクエストのネットワークパスによって異なります。
条件キー |
VPC エンドポイント経由 |
パブリックインターネット経由 |
[Description] (説明) |
|---|---|---|---|
|
はい |
いいえ |
リクエストが通過する VPC ID |
|
はい |
いいえ |
リクエストが通過する VPC の ARN |
|
はい |
いいえ |
リクエストが通過する VPC エンドポイント ID |
|
はい |
いいえ |
VPC 内の発信者のプライベート IP アドレス |
|
いいえ |
はい |
発信者のパブリック 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 に制限する
次の信頼ポリシーは、リクエストが 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 エンドポイントに制限する
次の信頼ポリシーは、リクエストが特定の 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 フェデレーションの制限
次の信頼ポリシーは、フェデレーションを 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 に制限する
次の信頼ポリシーは、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 とプロバイダー固有の条件を組み合わせる
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 へのフェデレーティッドアクセスを制限する
次のリソースコントロールポリシー (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 チェックを削除する前に、徹底的にテストすることをお勧めします。