Проверьте источник HTTP-запроса - PullRequest
5 голосов
/ 15 февраля 2010

У меня есть две системы, которые должны общаться. Системы настроены как:

System A, запуск Django (Python 2.5) в Google App Engine (GAE)

System B, запуск Django (Python 2.6) в Ubuntu / Linux через Lighttpd (возможно, nginx, позже)

Система A будет периодически отправлять запросы («реквизиции») системы B, используя Url Fetch .

Система B имеет настройку приложения Django для прослушивания этих запросов с urls.py с чем-то вроде:

urlpatterns = patterns('producer.views',
    url(r'^requisition$', 'requisition', name='requisition'),
)

И соответствующий views.py с чем-то вроде:

import json
from django.http import HttpResponse

def requisition(request):
    " do something "
    response = HttpResponse()
    response['Content-type'] = 'application/json'
    response.write(json.dumps(...))
    return response

Было бы ценным дополнением к безопасности системы, если бы система B отвечала на заявки только из системы A.

Я хотел бы знать, какие параметры доступны для системы B, чтобы проверить, поступили ли запросы от системы A. Я рассмотрел следующее:

  • Проверьте, что IP-адрес от GAE (однако я не знаю, IP-адреса GAE, они могут измениться, и они могут быть подделаны)
  • Убедитесь, что обратный DNS IP-адреса получен от GAE (однако я не знаю, что такое записи DNS GAE, если они изменятся и могут быть подделаны)
  • Используйте клиентский сертификат TLS из системы A, но я не знаю, как это сделать с GAE
  • Выполните вызов / ответ, основанный на чем-то общем, например, на соли, с pycrypto

В идеале я хочу закончить с views.py чем-то подобным:

... 
from django.http import HttpResponseForbidden 

def requisition(request):
   " do something "
  if not verify_request_origin():
     return HttpResponseForbidden("Denied.")

  response = HttpResponse()
  ...

Где verify_request_origin () возвращает true, когда запрос к System B был от System A в GAE.

Спасибо, и я с нетерпением жду ваших мыслей.

Ответы [ 4 ]

2 голосов
/ 15 февраля 2010

Похоже, будет достаточно использовать SSL для ссылки и включить пароль в строку запроса.

SSL защищает от перехвата, и вы не собираетесь раскрывать запросы вне систем, находящихся под вашим контролем, так что общий секрет подойдет (и будет более безопасным, чем отслеживание IP, так как другие сайты GAE будут использовать эти адреса).

1 голос
/ 09 июня 2013

Один из пуленепробиваемых вариантов - посмотреть FOAF + SSL http://www.w3.org/wiki/Foaf%2Bssl/FAQ#What_is_FOAF.2BSSL

1 голос
/ 15 февраля 2010

Система A может отправлять HTTPS-запросы через urlfetch.fetch - просто введите параметр URL, начинающийся с https://. Однако это не аутентифицирует его в системе B (оно предотвращает анализаторы и атаки типа «человек посередине»); нет способа использовать клиентский сертификат TLS.

Проверка того, что запрос поступил от GAE (что было бы вполне осуществимо: просто используйте собственный DNS-сервер Google на 8.8.8.8 - если кому-то удалось настроить собственный DNS Google, его способность обмануть вашу систему B была бы наименьшей) беспокойств в мире ;-) тоже не помогает по той же причине: это может быть любое приложение GAE (все они используют несколько IP-адресов, и данный IP-адрес может использоваться любым числом приложений GAE за короткий промежуток времени).

Таким образом, шифрование полезной нагрузки с помощью общего секрета кажется самым простым, учитывая ограничения GAE. PyCrypto - возможно, с exPyCrypto - может быть хорошо; или вы можете попробовать SlowAES (у меня, конечно, слабое место для последнего; -).

1 голос
/ 15 февраля 2010

Вы на месте, первые две точки не нужны.

Пароль, как говорит Эндрю , достаточно хорош, если только вы не беспокоитесь о проблемах с кэшем браузера. Если это так, вам все равно следует использовать SSL, но для аутентификации одного приложения в другом, например, с помощью hmac , и использовать его для генерации общего секрета для сеанса. Секрет должен находиться в коде, а не в передаваемых данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...