【问题标题】:What is the best way to restrict access to an Application Load Balancer?限制对 Application Load Balancer 的访问的最佳方法是什么?
【发布时间】:2019-05-11 21:51:34
【问题描述】:

理想情况下,我想锁定我的 ALB,使其只能由 API 网关访问。

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

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

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

【问题讨论】:

    标签: aws-api-gateway aws-security-group aws-load-balancer


    【解决方案1】:

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

    在 API GW HTTP 集成方法的集成请求中注入自定义 HTTP 标头。按照Amazon API Gateway API request and response data mapping reference 中的说明使用静态值

    'STATIC_VALUE'。 STATIC_VALUE 是一个字符串文字,必须用一对单引号括起来。

    与 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。

    # 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
    )
    

    【讨论】:

    • 为了安全,RegEx 匹配会更好。因此,调用者将发送带有符合 RegEx 的随机字符串的 x-validation-client。如果匹配,则允许流量,否则阻止。但这是迄今为止我找到的最好的答案。干得好:)。
    【解决方案2】:

    API 网关没有静态 IP,ALB 目前不提供除 Cognito 用户池之外的任何身份验证。因此,我想说您最好的选择是在您提议时使用带有网络负载均衡器的 VPC 链接,并通过 NLB 将请求传送到您的 ALB。

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

    【讨论】:

    • NLB 方法有目的吗? ALB 不会仍然对公众开放吗?
    • 是否会为跨站点脚本创建 WAF 规则? (假设网关和ALB的域是同一个顶级域)
    • 否,如果您使用带有 VPC 链接的 NLB,则您的 ALB 可以是内部的。创建一些规则来防止 XSS 不会使您的 API 不那么公开。
    【解决方案3】:

    根据用例,一种可能性是使用客户端 SSL 证书保护您的后端而不是 ALB。 Generate and Configure an SSL Certificate for Backend Authentication

    【讨论】:

    • 请考虑这样一个事实,即 OP 需要限制对 ALB 的访问,而不是用替代解决方案替换它。谢谢。
    猜你喜欢
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2021-01-21
    • 2011-06-20
    • 2019-01-30
    • 2020-08-03
    相关资源
    最近更新 更多