Безопасность распределенных систем является сложной задачей из-за разнообразия и масштаба компонентов, участвующих в ней. Учитывая, что между множеством услуг, взаимодействующих через потенциально небезопасные сети, риск неаutorizedного доступа и проникновения данных значительно увеличивается. Эта статья исследует практический подход к безопасности распределенных систем с использованием открытого исходного проекта. PROJEKT показывает, как интегрировать несколько механизмов и технологий безопасности, чтобы решить общие проблемы безопасности, такие как аутентификация, авторизация и безопасное общение.
Общественные проблемы безопасности в распределенных системах
Распределенные системы включают множество услуг или микросервисов, которые должны общаться безопасно через сеть. Ключевые проблемы безопасности в таких архитектурах включают:
- Безопасное общение: Убедиться, что данные, передаваемые между услугами, зашифрованы и защищены от подслушивания или вмешательства
- Аутентификация: проверка идентификаций пользователей и услуг для предотвращения неаutorizedного доступа
- Авторизация: управление тем, что авторизованные пользователи и услуги разрешено делать, основываясь на их ролях и разрешениях
- Implements fine-grained access controls and policies that govern service-to-service and user interactions
- Управление сертификатами: Управление цифровыми сертификатами для шифрования данных и установления доверия между услугами
Этот проект на основе 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
), настроенный для типа предоставления удостоверений клиента. Этот метод идеально подходит для аутентификации служб без участия пользователей.
Пример потока аутентификации
- Пользователи переходят на страницу входа.
- После успешного входа пользователь перенаправляется кallback-странице с авторизационным кодом.
- Затем этот авторизационный код обменивается на 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, что обеспечивает надежную безопасность:
- Извлечение сертификатов из Keycloak: Dynamically fetches the certificates from Keycloak to validate the token.
- Использование x5t (Thumbprint): Uses the thumbprint embedded in the token to retrieve the public key from a local trust store.
- Встроенная проверка сертификата: Проверка токена с использованием встроенного сертификата, обеспечивая проверку сертификата против доверенной 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