限制对 Application Load Balancer 的访问的最佳方法是什么?

What is the best way to restrict access to an Application Load Balancer?

提问人:fuzzi 提问时间:12/11/2018 最后编辑:fuzzi 更新时间:2/4/2021 访问量:3900

问:

理想情况下,我想锁定我的 ALB,以便它只能由 API Gateway 访问。

我已经研究了是否可以将 API 网关与入站规则关联 - 但是,我发现 API Gateway 不能与 IP 地址或安全组关联。我还研究了面向内部的 ALB,但我无法让它们工作,因为 VPC 链接仅支持 NLB。

任何帮助将不胜感激 - 我一直在寻找网关设置,但找不到此选项。

解决这个问题的最佳方法是什么,以便尽可能地限制 ALB?

aws-api-gateway aws-security-group amazon-elb

评论


答:

4赞 Bram 12/14/2018 #1

API Gateway 没有静态 IP,ALB 目前不提供除 Cognito 用户池以外的任何身份验证。因此,我认为您最好的选择是在提出建议时使用带有 Network Load Balancer 的 VPC 链接,并通过 NLB 将请求通过隧道传输到 ALB。

或者,您可以让 VPC 中的 Lambda 调用 ALB,但这会慢得多,但对于低容量来说更便宜,因为您跳过了 NLB。

评论

0赞 fuzzi 1/24/2019
NLB 方法有什么目的吗?ALB不是仍然向公众开放吗?
0赞 fuzzi 1/24/2019
无论如何,为跨站点脚本创建 WAF 规则会有所帮助吗?(假设网关和 ALB 的域是同一个顶级域)
0赞 Bram 1/24/2019
不可以,如果您将 NLB 与 ALB 的 VPC 链接结合使用,则 ALB 可以是内部的。创建一些规则来防止 XSS 并不会降低 API 的公开性。
1赞 Suraj Bhatia 1/29/2020 #2

根据用例,一种可能性是使用客户端 SSL 证书保护您的后端而不是 ALB。生成并配置用于后端身份验证的SSL证书

评论

0赞 banavalikar 2/3/2021
请考虑这样一个事实,即 OP 需要限制对 ALB 的访问,而不是用替代解决方案替换它。谢谢。
9赞 mon 6/24/2020 #3

使用WAF验证API GW中设置的自定义HTTP Header值

在 API GW HTTP 集成方法的集成请求中注入自定义 HTTP 头。按照 Amazon API Gateway API 请求和响应数据映射参考中的说明使用静态值

'STATIC_VALUE'。STATIC_VALUE是字符串文本,必须括在一对单引号内。

enter image description here

与AWS文档一样,我们是否应该使用“integration.request.header.”格式是令人困惑的。如果在 AWS 控制台中进行设置,则无需键入“integration.request.header”。只需键入标头名称即可。确保标头值为单引号

但是,当使用 CDK 或 CFN 等工具时,我们需要使用“integration.request.header.”部分。

cdk_api_method: aws_apigateway.Method = cdk_api_resource.add_method(
    http_method="post",
    integration=aws_apigateway.HttpIntegration(
        url=url,
        http_method="post",
        proxy=True,
        options=aws_apigateway.IntegrationOptions(
            request_parameters={
                "integration.request.header.{}".format(HTTP_HEADER_X_VALIDATION_CLIENT_NAME): "'{}'".format(HTTP_HEADER_X_VALIDATION_CLIENT_VALUE)
            }
        )
    )
)

设置 WAF 以验证 HTTP 标头值并将 ALB 关联到 WAF ACL。

enter image description here

# https://github.com/aws-samples/wafv2-json-yaml-samples/blob/master/JSON/rule-001.json
aws_wafv2.CfnWebACL.RuleProperty(
    name='header-x-validation-client',
    action=aws_wafv2.CfnWebACL.RuleActionProperty(
        allow={}
    ),
    statement=aws_wafv2.CfnWebACL.StatementOneProperty(
        byte_match_statement=aws_wafv2.CfnWebACL.ByteMatchStatementProperty(
            field_to_match=aws_wafv2.CfnWebACL.FieldToMatchProperty(
                single_header={
                  "Name": HTTP_HEADER_X_VALIDATION_CLIENT_NAME
                }
            ),
            positional_constraint="EXACTLY",
            search_string=HTTP_HEADER_X_VALIDATION_CLIENT_VALUE,
            text_transformations=[
                aws_wafv2.CfnWebACL.TextTransformationProperty(
                    priority=0,
                    type="NONE"
                )
            ]
        )
    ),
    visibility_config=aws_wafv2.CfnWebACL.VisibilityConfigProperty(
        sampled_requests_enabled=True,
        cloud_watch_metrics_enabled=True,
        metric_name='waf-rule-header-x-validation-client'
    ),
    priority=0
)

评论

0赞 banavalikar 2/5/2021
为了安全起见,正则表达式匹配会更好。因此,调用方将发送带有符合正则表达式的随机字符串的 x-validation-client。如果存在匹配项,则允许流量,否则阻止。但这是我迄今为止找到的最好的答案。:)干得好。