Как лучше всего ограничить доступ к балансировщику нагрузки приложений?

В идеале я хотел бы заблокировать свой ALB, чтобы он был доступен только через API Gateway.

Я изучил, могу ли я связать шлюз API с правилом для входящего трафика, однако обнаружил, что шлюз API нельзя связать с IP-адресом или группой безопасности. Я также изучил внутренний ALB, но мне не удалось заставить их работать, поскольку ссылка VPC поддерживает только NLB.

Любая помощь будет принята с благодарностью - я искал в настройках шлюза, но не могу найти эту опцию.

Как лучше всего подойти к этому, чтобы максимально ограничить ALB?


person fuzzi    schedule 10.12.2018    source источник


Ответы (3)


У API-шлюза нет статического IP-адреса, и ALB на данный момент не предлагают никакой аутентификации, кроме пользовательских пулов Cognito. Из-за этого я бы сказал, что ваш лучший вариант - использовать ссылку VPC с Network Load Balancer, когда вы предлагаете, и туннелировать запрос через NLB на ваш ALB.

В качестве альтернативы у вас может быть лямбда внутри вашего VPC, вызывающая ALB, но это будет намного медленнее, но дешевле для небольших объемов, потому что вы пропускаете NLB.

person Bram    schedule 13.12.2018
comment
Есть ли цель у подхода NLB? Разве ALB не будет по-прежнему открыт для публики? - person fuzzi; 23.01.2019
comment
поможет ли создание правила WAF для межсайтового скриптинга? (Предполагая, что домен шлюза и ALB были одним и тем же доменом верхнего уровня) - person fuzzi; 23.01.2019
comment
Нет, если вы используете NLB со ссылкой VPC на ваш ALB, ваш ALB может быть внутренним. Создание некоторых правил для предотвращения XSS не сделает ваш API менее публичным. - person Bram; 24.01.2019

Используйте WAF для проверки значения настраиваемого заголовка HTTP, установленного в API GW

Внедрить настраиваемый заголовок HTTP в запрос интеграции метода интеграции HTTP API GW. Используйте статическое значение, как описано в Справочник по сопоставлению данных запросов и ответов API Amazon API Gateway.

"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
)
person mon    schedule 24.06.2020
comment
В целях безопасности было бы лучше использовать совпадение с регулярным выражением. Таким образом, вызывающий отправит x-validation-client со случайной строкой, которая будет соответствовать RegEx. Если есть совпадение, разрешите трафик, в противном случае заблокируйте. Но это лучший ответ, который я до сих пор нашел. Отличная работа :). - person banavalikar; 05.02.2021

В зависимости от варианта использования можно защитить серверную часть вместо ALB с помощью клиентских SSL-сертификатов. Создание и настройка сертификата SSL для внутренней аутентификации

person Suraj Bhatia    schedule 28.01.2020
comment
Пожалуйста, примите во внимание тот факт, что OP должен ограничивать доступ к ALB, а не заменять его альтернативным решением. Спасибо. - person banavalikar; 03.02.2021