

# 使用 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 端点 | 通过公共互联网 | 描述 | 
| --- | --- | --- | --- | 
| `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` 未填充。请改为使用 `aws:VpcSourceIp` 进行基于 IP 的限制。

我们建议在信任策略中使用 `aws:SourceVpcArn` 而不是 `aws:SourceVpc`。VPC ID 在区域内是唯一的，但不是全球唯一的，而 `aws:SourceVpcArn` 包含区域和账户，可提供 VPC 的全球唯一标识。

**注意**  
以下 OIDC 示例中的受众 (`aud`) 值使用 `sts.amazonaws.com`，这是 Amazon EKS 的默认值。对于其他 OIDC 提供商，请将其替换为为您的应用程序配置的受众值（例如，客户端 ID 或应用程序 URI）。

## 示例：将 OIDC 联合身份验证限制为特定 VPC
<a name="reference_sts_vpc_condition_keys_federated_example_oidc_vpc"></a>

以下信任策略仅允许 OIDC 提供商在请求通过 VPC 端点来自特定 VPC 时代入该角色。

```
{
    "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:SourceVpcArn` 条件不匹配，AWS 隐式拒绝来自指定 VPC 外部的请求。不需要明确的拒绝声明。

## 示例：将 SAML 联合身份验证限制为特定 VPC 端点
<a name="reference_sts_vpc_condition_keys_federated_example_saml_vpce"></a>

以下信任策略仅允许 SAML 提供商在请求通过特定 VPC 端点时代入该角色。

```
{
    "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"
                }
            }
        }
    ]
}
```

当您在同一 VPC 中有多个 VPC 端点并希望限制对特定端点的访问时，使用 `aws:SourceVpce` 代替 `aws:SourceVpc` 可以提供更精细的控制。

## 示例：在 VPC 内按私有 IP 范围限制 OIDC 联合身份验证
<a name="reference_sts_vpc_condition_keys_federated_example_ip"></a>

以下信任策略将联合身份验证限制为来自该 VPC 内特定子网的请求。使用 `aws:VpcSourceIp` 对通过 VPC 端点发出的请求进行基于 IP 的限制。

```
{
    "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 端点的请求，请勿将 `aws:SourceIp` 与私有 IP 范围一起使用。`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>

除非请求来自特定 VPC，否则以下资源控制策略 (RCP) 会拒绝 `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` 检查之前进行彻底的测试。