如何用AWS WAF或ALB限制特定IP访问/admin.php路径
针对ALB后/admin.php的IP访问控制方案
问题背景
有两台部署在Application Load Balancer(ALB)后的实例,需要仅允许特定IP访问/admin.php脚本。当前Terraform配置的AWS WAF规则为全局生效,需调整为针对指定路径的IP访问控制,同时也接受更简便的ALB原生配置方案。
方案一:调整AWS WAF规则(推荐)
通过修改WAF规则,实现仅当请求路径为/admin.php时才校验客户端IP,其他路径不受限制。以下是调整后的Terraform代码:
resource "aws_wafv2_ip_set" "allowed_ips" { name = "allowed-ips" scope = "REGIONAL" description = "IP set containing allowed IP addresses for /admin.php" ip_address_version = "IPV4" addresses = var.allowed_ip_addresses } resource "aws_wafv2_web_acl" "web_acl" { name = "example-web-acl" description = "Web ACL restricting /admin.php to allowed IPs" scope = "REGIONAL" # 默认动作改为允许所有请求(非/admin.php路径无需限制) default_action { allow {} } visibility_config { cloudwatch_metrics_enabled = false metric_name = "web-acl-metric" sampled_requests_enabled = false } # 新增规则:拦截访问/admin.php且IP不在允许列表的请求 rule { name = "block-unauthorized-admin-access" priority = 1 statement { and_statement { statement { # 匹配请求路径为/admin.php byte_match_statement { field_to_match { uri_path {} } positional_constraint = "EXACTLY" search_string = "/admin.php" text_transformation { priority = 1 type = "NONE" } } } statement { # 匹配IP不在允许列表内的请求 not_statement { statement { ip_set_reference_statement { arn = aws_wafv2_ip_set.allowed_ips.arn } } } } } } action { block {} } visibility_config { cloudwatch_metrics_enabled = false metric_name = "block-unauthorized-admin-access-metric" sampled_requests_enabled = false } } } resource "aws_wafv2_web_acl_association" "load_balancer_acl_association" { resource_arn = aws_lb.external_alb.arn web_acl_arn = aws_wafv2_web_acl.web_acl.arn }
关键调整说明
- 将WAF默认动作从
block改为allow,确保非/admin.php路径的请求正常通行 - 使用
and_statement组合两个条件:请求路径为/admin.php且 IP不在允许列表中 - 对符合上述条件的请求执行
block动作,实现精准的路径+IP访问控制
方案二:ALB原生配置(局限性说明)
ALB本身无法直接实现路径+IP的组合访问控制:
- ALB的安全组仅能控制全局IP访问,无法区分请求路径
- ALB监听器规则支持路径匹配,但不支持IP匹配条件
若要通过ALB原生能力实现,需结合Lambda(或Lambda@Edge)处理请求:
- 创建Lambda函数,从
X-Forwarded-For头获取客户端IP,校验IP是否在允许列表且请求路径为/admin.php - 在ALB监听器中添加规则,将
/admin.php的请求转发至Lambda函数 - Lambda函数根据校验结果决定允许或拒绝请求
但该方案配置复杂度高于WAF,且需要额外维护Lambda资源,因此更推荐使用方案一的WAF调整方案。
内容的提问来源于stack exchange,提问作者user12482025
相关产品推荐
相关产品推荐

