2017-01-25 2 views
2

У меня есть api-шлюз, к которому будет обращаться приложение javascript переднего конца. Имея это в виду, мы не можем существенно ограничить доступ к ключу api (я не думаю?), Поэтому я действительно хотел бы ограничить его по IP-адресу ... но я не могу найти способ сделать это , Возможно ли это, поскольку на самом деле это не происходит с сервера?Ограничение общедоступного Api-шлюза на определенный IP-адрес

Таким образом, сайт размещен на S3 с Cloudfront спереди. Шлюз API принимает пару ключей и попадает на лямбда-скрипт и сохраняется на dynamodb. Если бы кто-то захотел, они могли бы просто избавиться от него со своими ценностями. Я хочу, чтобы веб-приложение было в состоянии поговорить с ним. Я все еще участвую в AWS! Я надеялся, что смогу использовать Shield или WAF, но, похоже, это не выход. Какие-либо предложения?

ответ

3

Конечно, не сложно скомпрометировать любые учетные данные или ключ API в вашем приложении, и большую часть времени вы найдете статьи, в которых объясняется, как использовать веб-федеративные провайдеры идентификации для авторизации вашего API вызовы через API-шлюз (см. Setting Credentials in a Web Browser), но поскольку вы используете CloudFront, для этого есть еще один способ обхода.

Вы можете сохранить свой ключ API (или даже учетные данные IAM) в отдельном файле на S3, но ограничить его доступ к определенному IP-адресу, чтобы ваш скрипт мог получить ключ и вызвать вызов API. Все другие IP-адреса не могут получить ключ API. Таким образом, метод API не может быть вызван.

  1. Попросите пользователей получить доступ к вашему контенту только через CloudFront. См.: Using an Origin Access Identity to Restrict Access to Your Amazon S3 Content. Таким образом, ключ API не может быть удален с использованием URL-адресов S3.
  2. Укажите учетную запись AWS, которую вы хотите использовать для создания подписанного URL. См.: Specifying the AWS Accounts That Can Create Signed URLs and Signed Cookies (Trusted Signers).
  3. Создайте подписанный URL-адрес, используя настраиваемую политику с датой окончания срока действия. См.: Creating a Signed URL Using a Custom Policy. Использование настраиваемой политики (в отличие от законченной политики) позволяет указать IP-адрес или диапазон IP-адресов пользователей, которые могут получить доступ к вашему контенту. Этот сгенерированный подписанный URL-адрес будет использоваться всякий раз, когда вы хотите вызвать метод API.
  4. Выберите распределение в CloudFront и добавить Поведение с Path Образцом в, что указывает на ключевой файл API, например, api-key.json. Убедитесь, что Restrict Viewer Access установлен в Да для поведения. Убедитесь, что это bahavior имеет приоритет над По умолчанию Поведение, помещая его вверху в список, то есть, приоритет 0.
  5. Убедитесь, что Ограничения просмотра Access установлен в Нет для По умолчанию поведения кэша, который сделает все ваши содержания общественности КРОМЕ ключевой файл API выше.

ПРИМЕЧАНИЕ: Если вы уверены, ваш подписанный URL хранится надежно и никто не имеет доступа к нему, вы можете удалить требование IP-адрес из вашей таможенной политики, так как это было бы излишним для проверки IP-адреса в этом случае. Конечно, это позволит вам использовать консервированную политику.

+0

Наружная коробка. Мне это нравится. –

+0

Спасибо за это. Однако я не уверен, что это или какое-либо решение будет работать в этой настройке. Поскольку приложение является интерфейсом, IP-адрес сервера никогда не доступен для отправки, я не думаю? –

+0

Поскольку ваше приложение для внешнего интерфейса статично, клиентские скрипты выполняются на вашем локальном компьютере. Следовательно, IP-адрес в этом контексте - это * ВАШ * IP, а не S3/CloudFront. Если у вас нет статического IP-адреса в вашем местоположении, вы можете просто сохранить подписанный URL-адрес и настроить приложение, чтобы принять его как параметр, чтобы получить файл ключа API. Надеюсь, теперь этот подход ясен. –