View a markdown version of this page

使用 VPC 条件键来控制联合访问 - Amazon Identity and Access Management
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 VPC 条件键来控制联合访问

联合用户可以使用 AssumeRoleWithSAMLAssumeRoleWithWebIdentity 通过 VPC 端点代入角色。当他们这样做时,您可以在角色的信任策略或资源控制策略 (RCP) 中使用特定于 VPC 的条件键来限制这些请求的来源。除了信任策略中的身份级别控制之外,这还提供了网络级别的边界。

VPC 条件键如何处理联合请求

请求上下文中可用的条件键取决于联合请求的网络路径。

按网络路径划分的 VPC 条件键可用性

条件键

通过 VPC 端点

通过公共互联网

描述

aws:SourceVpc

请求所经过的 VPC ID

aws:SourceVpcArn

请求所经过的 VPC 的 ARN

aws:SourceVpce

请求所经过的 VPC 端点 ID

aws:VpcSourceIp

VPC 内调用方的私有 IP 地址

aws:SourceIp

调用方的公共 IP 地址

如果您的信任策略在 Allow 语句中使用 aws:SourceVpcaws:SourceVpcArnaws:SourceVpce,并且请求不是通过 VPC 端点发出,则条件不匹配,Amazon 将隐式拒绝该请求。这实际上要求联合请求通过 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

以下信任策略仅允许 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 条件不匹配,Amazon 隐式拒绝来自指定 VPC 外部的请求。不需要明确的拒绝声明。

示例:将 SAML 联合身份验证限制为特定 VPC 端点

以下信任策略仅允许 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 联合身份验证

以下信任策略将联合身份验证限制为来自该 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

以下信任策略允许 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 的联合访问

除非请求来自特定 VPC,否则以下资源控制策略 (RCP) 会拒绝 AssumeRoleWithSAMLAssumeRoleWithWebIdentity 请求。与按角色应用的信任策略不同,资源控制策略 (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 检查之前进行彻底的测试。