Как ограничить доступ AWS API Gateway к конкретному дистрибутиву CloudFront или поддомену Route53 - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть настройка API-интерфейса шлюза API, доступ к которому я хочу ограничить.У меня есть настройка субдомена в AWS Route 53, которая указывает на дистрибутив CloudFront, где живет мое приложение.Это приложение отправляет POST-запрос к API.

Я рассмотрел вопрос добавления политики ресурсов для моего API на основе примера «белого списка AWS API», но не могу понять, что синтаксис правильный, я постояннополучить ошибки.

Я также пытался создать пользователя IAM и заблокировать API с помощью аутентификации AWS_IAM, но затем мне нужно создать подписанный запрос, который выглядит как большая работа, которая должна быть намного проще с помощью политик ресурсов?

Это пример политики ресурсов, которую я пытался подключить к своему API:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity {{CloudFrontID}}"
            },
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*/*/*"
            ]
        }
    ]
}

Возвращает следующую ошибку: Invalid policy document. Please check the policy syntax and ensure that Principals are valid.

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

"AWS": "arn: aws: iam :: cloudfront: пользователь / CloudFront Origin Access Identity {{CloudFrontID}}"

Проблема в том, что этопубличный HTTP-запрос.Если это не подписанный запрос, AWS не будет знать ни о каких ресурсах IAM или ARN, он просто знает, что у него есть стандартный HTTP-запрос.Если вы сделаете запрос с помощью команды curl -v, вы увидите, что параметры запроса выглядят примерно так:


    GET
    /test/mappedcokerheaders
    HTTP/2
    Host: APIID.execute-api.REGION.amazonaws.com
    User-Agent: curl/7.61.1
    Accept: */*

Возможно, вы можете отфильтровать пользовательский агент, так как я вижу, что условие определено здесь.

Я бы проверил все значения, которые поступают в запросе из cloudfront, против запроса из вашего curl напрямую в API, перехватывая идентификатор запроса api gw в заголовках ответа и ища их в вашем APIЖурналы доступа к шлюзу.Вы должны будете включить журналы доступа и определить, какие параметры вы хотите зарегистрировать, что вы можете увидеть, как это сделать здесь .

1 голос
/ 27 сентября 2019

У меня есть настройка поддомена в AWS Route 53, которая указывает на дистрибутив CloudFront, где живет мое приложение.Это приложение отправляет POST-запрос к API.

Насколько я понимаю, у вас есть общедоступная служба, которую можно вызвать из веб-браузера (https://your -service.com )

Вы хотите, чтобы служба отвечала только тогда, когда браузер клиента находится по адресу https://your -site.com .Служба не будет отвечать, например, если браузер находится на https://another -site.com

В этом случае вам необходимо прочитать подробнее о CORS

Это не помешает случайному парню / веб-клиенту перейти и напрямую позвонить в ваш сервис по номеру https://your -service.com .Чтобы защитить сервис от этого, вам нужна правильная система аутентификации

...