使用 VPC 条件键来控制联合访问
联合用户可以使用 AssumeRoleWithSAML 或 AssumeRoleWithWebIdentity 通过 VPC 端点代入角色。当他们这样做时,您可以在角色的信任策略或资源控制策略 (RCP) 中使用特定于 VPC 的条件键来限制这些请求的来源。除了信任策略中的身份级别控制之外,这还提供了网络级别的边界。
主题
VPC 条件键如何处理联合请求
请求上下文中可用的条件键取决于联合请求的网络路径。
条件键 |
通过 VPC 端点 |
通过公共互联网 |
描述 |
|---|---|---|---|
|
是 |
否 |
请求所经过的 VPC ID |
|
是 |
否 |
请求所经过的 VPC 的 ARN |
|
是 |
否 |
请求所经过的 VPC 端点 ID |
|
是 |
否 |
VPC 内调用方的私有 IP 地址 |
|
否 |
是 |
调用方的公共 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
以下信任策略仅允许 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 端点
以下信任策略仅允许 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) 会拒绝 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 检查之前进行彻底的测试。