Проектирование безопасной архитектуры для распределенных систем

Безопасность распределенных систем является сложной задачей из-за разнообразия и масштаба компонентов, участвующих в ней. Учитывая, что между множеством услуг, взаимодействующих через потенциально небезопасные сети, риск неаutorizedного доступа и проникновения данных значительно увеличивается. Эта статья исследует практический подход к безопасности распределенных систем с использованием открытого исходного проекта. PROJEKT показывает, как интегрировать несколько механизмов и технологий безопасности, чтобы решить общие проблемы безопасности, такие как аутентификация, авторизация и безопасное общение.

Общественные проблемы безопасности в распределенных системах

Распределенные системы включают множество услуг или микросервисов, которые должны общаться безопасно через сеть. Ключевые проблемы безопасности в таких архитектурах включают:

  1. Безопасное общение: Убедиться, что данные, передаваемые между услугами, зашифрованы и защищены от подслушивания или вмешательства
  2. Аутентификация: проверка идентификаций пользователей и услуг для предотвращения неаutorizedного доступа
  3. Авторизация: управление тем, что авторизованные пользователи и услуги разрешено делать, основываясь на их ролях и разрешениях
  4. Implements fine-grained access controls and policies that govern service-to-service and user interactions
  5. Управление сертификатами: Управление цифровыми сертификатами для шифрования данных и установления доверия между услугами

Этот проект на основе open-source решает эти проблемы, используя несколько интегрированных технологий и решений.

Установка и настройка проекта

Проект начинается с установки безопасной среды с использованием shell-скриптов и Docker. Установка включает предоставление цифровых сертификатов и запуск необходимых служб для обеспечения безопасной связи между компонентами.

Шаги для установки среды

1. Предоставление сертификатов

Проект использует shell-скрипт (provisioning.sh), чтобы имитировать Аutorité de certification (CA) и генерировать необходимые сертификаты для услуг.

   ./provisioning.sh

2. Запуск служб

Используется Docker Compose для запуска всех служб, определенных в проекте, чтобы убедиться, что они правильно настроены для безопасной работы.

   docker-compose up

3. Тестирование связи между услугами

Для проверки сервисно- к сервисного общения с использованием сертификатов и JWT токенов предоставлен скрипт test_services.sh. Этот скрипт демонстрирует, как различные сервисы взаимодействуют безопасно, используя назначенные ими сертификаты.

Решение сервисных проблем в распределенных системах

Проект интегрирует несколько ключевых технологий для решения основных проблем безопасности, упомянутых ранее. Вот, как каждая проблема решается:

1. Безопасное общение с использованием двустороннего TLS (mTLS)

Проблема

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

Решение

Проект использует двусторонний TLS (mTLS), чтобы безопасно общаться между сервисами. mTLS обеспечивает, чтобы клиент и сервер друг друга аутентифицировали с помощью соответствующих сертификатов. Эта взаимная аутентификация предотвращает несанкционированное общение сервисов с legитгими сервисами.

Реализация

Nginx настраивается в качестве обратного прокси для обработки mTLS. Он требует со страницы клиента и серверных сертификатов для установления безопасного соединения, обеспечивая конфиденциальность и невозврата данных, передаваемых между службами.

2. Аутентификация через Keycloak

Возможность

правильная аутентификация пользователей и служб крайне важна для предотвращения неаuthorized access.

Решение

Проект использует Keycloak, открытую источников идентификацию и управление доступом, для управления аутентификацией. Keycloak поддерживает множество методов аутентификации, включая OpenID Connect и удостоверения клиента, делая его подходящим для аутентификации как пользователей, так и служб.

  • Аутентификация пользователя:
    Пользователи аутентифицируются с использованием OpenID Connect. Keycloak настраивается с клиентом (appTest-login-client), который выполняет процессы аутентификации пользователей, включая вход, выдачу токенов и обработку callback.
  • Аутентификация службы:
    Для аутентификации служб друг с другом проект использует клиент Keycloak (client_credentials-test), настроенный для типа предоставления удостоверений клиента. Этот метод идеально подходит для аутентификации служб без участия пользователей.

Пример потока аутентификации

  1. Пользователи переходят на страницу входа.
  2. После успешного входа пользователь перенаправляется кallback-странице с авторизационным кодом.
  3. Затем этот авторизационный код обменивается на JWT-токен, который используется для последующих запросов. Файл authn.js в каталоге nginx/njsпредоставляет детальное реализацию этого workflow.

Пример авторизации услуг с использованием клиентских сведений

curl -X POST "http://localhost:9000/realms/tenantA/protocol/openid-connect/token" \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -d "grant_type=client_credentials" \
     -d "client_id=client_credentials-test" \
     -d "client_secret=your-client-secret-here"

3. Авторизация пользователя с использованием Open Policy Agent (OPA) и JWT

Возникновение

Enforcing fine-grained access controls to ensure that authenticated users and services only have access to authorized resources

Решение

Проект использует комбинацию Open Policy Agent (OPA) и JWT-токенов для обеспечения политик авторизации.Проект демонстрирует три различные стратегии для проверки JWT, что обеспечивает надежную безопасность:

  1. Извлечение сертификатов из Keycloak: Dynamically fetches the certificates from Keycloak to validate the token.
  2. Использование x5t (Thumbprint): Uses the thumbprint embedded in the token to retrieve the public key from a local trust store.
  3. Встроенная проверка сертификата: Проверка токена с использованием встроенного сертификата, обеспечивая проверку сертификата против доверенной Certificate Authority (CA).

См. файл nginx/njs/token.js для детального описания этих стратегий.

4. Заforcement политики с использованием Open Policy Agent (OPA)

Задача

Реализация динамичных и гибких политик контроля доступа для как сервисов, так и пользователей

Решение

OPA используется для заставления тонких политик управления доступом. Политики написаны на декларативном языке (Rego) и хранятся в каталоге opa/. Эти политики устанавливают условия, при которых сервисы могут общаться и пользователи могут получать доступ к ресурсам, обеспечивая постоянное применение управления доступом по всему системе.

5. Управление сертификатами

Задача

Управление цифровыми сертификатами для сервисов для установления доверия и безопасной связи

Решение:
Проект включает устойчивую систему управления сертификатами. Shell-скрипт (provisioning.sh) используется для моделирования Certificate Authority (CA) и генерации сертификатов для каждого сервиса. Этот подход упрощает управление сертификатами и обеспечивает, чтобы все сервисы имели необходимые сведения для безопасной связи.

Мы также добавили endpoint для обновления сервисного сертификата без необходимости перезапуска nginx.

curl --insecure  https://localhost/certs  --cert certificates/gen/serviceA/client.crt --key certificates/gen/serviceA/client.key -F cert=@certificates/gen/serviceA/client.crt -F key=@certificates/gen/serviceA/client.key

Заключение

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

При следовании установке и конфигурациям, демонстрируемым в этом проекте, разработчики могут использовать взаимный TLS, Keycloak, Open Policy Agent и Nginx для создания прочной архитектуры безопасности. Эти технологии, когда они сочетаются, обеспечивают固体ную основу для защиты распределенных систем от широкого спектра угроз, обеспечивая как защиту данных, так и контроль доступа.

Source:
https://dzone.com/articles/designing-a-secure-architecture-for-distributed-systems