Микросервисная безопасность связи - PullRequest
1 голос
/ 06 апреля 2020

Просто домашний проект, который я делаю дома сейчас, когда я в основном запираюсь в помещении. Сказав это, я пытаюсь соединить это со всеми прибамбасами, главным образом, чтобы я мог изучить кое-что новое. Я внедрил версию 1 этой версии еще в 2015 году, и она уже более 5 лет работает на моем raspberryPi как чемпион.

Для обновленной версии (Angular 9 /.net core 3.1 ), Я думаю об использовании Auth0 в качестве моего поставщика аутентификации (однако я также рассматриваю возможность использования AWS Cognito). Я определил границы микросервиса для приложения и по возможности буду использовать RabbitMQ для обмена сообщениями между службами. Однако существует ряд сценариев ios, в которых одна MS должна будет получить данные от другой MS для выполнения запроса. По сути, то, что в монолите было бы объединением БД. Я прочитал об этом на выходных и обнаружил, что вы можете сделать это объединение на внешнем интерфейсе, в шлюзе API или с помощью MS A выполнить запрос REST к MS B. Первое выглядит немного глупо, потому что затем браузер должен выполнить несколько запросов, а второй потребует от меня создания шлюза (я только планировал использовать NGINX в качестве обратного прокси-сервера). Поэтому я остановился на третьем варианте ... REST-запросы от MS A к MS B.

Мой вопрос ...

Как вы справляетесь с безопасностью при межсервисной связи? Я рассмотрел в порядке упрощения:

  1. Пересылать заголовок Auth от MS A к MS B при выполнении запроса
  2. Узел внутреннего экземпляра MS B, который не является предоставляется через inte rnet через обратный прокси-сервер и предоставляет только функциональные возможности, которые потребуются в кросс-микросервисной связи. (Не уверен, что это объяснение имеет смысл)
  3. Иметь MS A запросить собственный токен у провайдера аутентификации (Auth0, AWS Cognito и др. c.) И вызвать MS B с этим токеном.

Есть ли стандартный способ сделать это?

1 Ответ

0 голосов
/ 07 апреля 2020

Это хорошие вопросы, которые нужно задавать, но, к сожалению, нет «стандартного» способа сделать это. Я бы сказал, что ваши параметры будут между 1 и 2, и причины каждого из них будут следующими:

Вариант 1 - Пересылать заголовок Auth от MS A к MS B при выполнении запроса

Если бы вы применили эту практику в масштабе с несколькими разными командами, каждая из которых владеет различными услугами, это был бы лучший маршрут. Создатель MS B не обязательно будет знать, кто звонит им в долгосрочной перспективе, поэтому для обеспечения того, чтобы они не создавали угрозы безопасности, самый простой способ выставить свои услуги - это потребовать проверяемый JWT. Это предотвратит случайное использование кем-либо своего сервиса ненадлежащим образом.

Вариант 2 - размещение внутреннего экземпляра MS B, который не подвергается inte rnet через обратный прокси-сервер, и предоставляет только те функции, которые будут необходим в кросс-микросервисной связи.

Вы можете думать об этом методе как о завершении TLS на шлюзе. Вы можете прекратить TLS в каждой службе (например, вариант 1 для JWT), или вы можете прервать его на шлюзе, чтобы трафик c из внешнего мира был зашифрован перед входом, позволяя ему свободно течь внутри стен. Шлюз также может быть единственной ответственной стороной за проверку и декодирование JWT, а затем за то, чтобы трафик c мог свободно перемещаться внутри системы после прохождения проверки.

Этот параметр очень удобен для приложений, поддерживаемых отдельными командами или разработчиками. потому что это очень легко организовать. Если каждая «внутренняя» служба просто отвечает на идентификатор пользователя / субъекта для выполнения запросов и доверяет , что идентификатор пользователя был извлечен из проверенного JWT, вы можете создать другие внутренние системы гораздо проще. Это решение является самым простым для начала работы, но может быть сложным, если вы не можете доверять другим службам или разработчикам в вашем приложении или команде.

Вариант 3 - иметь MS Запрос самостоятельно токен от провайдера аутентификации (Auth0, AWS Cognito и т. д. c.) и вызов MS MS с этим токеном

. Я бы не рекомендовал каждому сервису выдавать свой собственный токен oauth. JWT от oauth-провайдеров, таких как Auth0, выдаются пользователям , а не машинам.

При этом серьезным дополнением к облачной безопасности будет учетные данные и белый список трафика c, передаваемого между всеми Сервисы. Это могут быть такие вещи, как Kubernetes NetworkPolicys , обеспечиваемые такими инструментами, как Cilium , или это могут быть уникальные сертификаты SSL, предназначенные для уникального посредника связи для каждого отношения между службами в вашем стеке. Этот вид дополнительной безопасности на самом деле не имеет никакого отношения к вашему вышеупомянутому вопросу, но был бы дополнительным источником размышлений о защите межпроцессного взаимодействия в облачной среде.

...