

# VPC 조건 키를 사용하여 페더레이션 액세스 제어
<a name="reference_sts_vpc_condition_keys_federated"></a>

페더레이션 사용자는 VPC 엔드포인트를 통해 `AssumeRoleWithSAML` 또는 `AssumeRoleWithWebIdentity`를 사용하여 역할을 수임할 수 있습니다. 이 경우 역할의 신뢰 정책 또는 리소스 제어 정책(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 엔드포인트를 통해 | 퍼블릭 인터넷을 통해 | 설명 | 
| --- | --- | --- | --- | 
| `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`를 사용하지 마십시오. VPC 엔드포인트 요청에는 `aws:SourceIp` 키를 사용할 수 없습니다. 대신 `aws:VpcSourceIp`을 사용하세요.

## 예: SAML 페더레이션을 여러 VPC로 제한
<a name="reference_sts_vpc_condition_keys_federated_example_saml_multi_vpc"></a>

다음 신뢰 정책은 SAML 공급자가 여러 VPC에서 역할을 수임하도록 허용합니다. 이는 조직에서 여러 환경 또는 리전에 걸쳐 여러 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` 검사를 제거하기 전에 철저히 테스트하는 것이 좋습니다.