S3桶IP限制与VPC(ECS集群)限制共存配置:ECS访问被拒排查
S3桶IP+VPC访问限制配置错误分析
你的Deny策略逻辑存在问题,同时ECS的访问方式可能不符合要求,导致被拒绝:
核心问题
当前策略的Condition是**逻辑与(AND)**关系,即只有当请求同时满足「来源IP不在指定列表」和「来源VPC不是目标VPC」时才会触发Deny。但实际场景中:
- 如果ECS通过公网访问S3(而非VPC端点),请求不会携带
aws:sourceVpc标识,此时StringNotEquals条件会被判定为成立(因为不存在该键,自然不等于指定VPC ID);同时ECS的公网IP不在你指定的列表中,NotIpAddress条件也成立,两个条件同时满足就触发了Deny。 - 即使ECS通过VPC端点访问,若策略未处理
aws:sourceVpc不存在的情况,也可能出现逻辑判定异常。
修正方案
1. 确保ECS通过S3 VPC端点访问
只有通过VPC端点访问S3的请求,才会携带aws:sourceVpc标识,让策略能识别来源VPC。需要在目标VPC中创建S3网关端点,并确保ECS所在子网的路由表指向该端点,安全组允许相关访问。
2. 修正桶策略的Condition逻辑
调整策略,拒绝所有**既不在指定IP列表,又不属于目标VPC(或无VPC标识)**的请求:
{ "Effect": "Deny", "Principal": "*", "Action": [ "s3:PutObject", "s3:ListBucket", "s3:GetObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::wb-bucket-stag", "arn:aws:s3:::wb-bucket-stag/*" ], "Condition": { "NotIpAddress": { "aws:SourceIp": [ "133.32.11.11/32", "59.106.11.1/32" ] }, "Or": [ { "StringNotEquals": { "aws:sourceVpc": "vpc-0fb1bf67df9b206aa" } }, { "Null": { "aws:sourceVpc": true } } ] } }
这个策略的逻辑是:
- 当请求来源IP不在指定列表,并且(来源VPC不是目标VPC,或者请求没有VPC标识)时,执行Deny;
- 反之,指定IP的请求,或者来自目标VPC的请求(通过VPC端点),都会被允许。
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

