Аутентификация и авторизация являются крупными частями головоломки безопасности, которые должны быть решены cloud architects и DevOps инженерами. В этом блоге мы будем особенно рассмотреть, как достичь авторизации/контроля доступа; то есть, какие действия может выполнять прошедший аутентификацию субъект в сетке услуг Istio. Это помогает защитить инфраструктуру, предотвращая действия с недобросовестными целями.
Аутентификация в сетке услуг может быть определена с помощью политик OPA. OPA – это механизм, который помогает DevOps людям определять и применять политику авторизации для Kubernetes workloads. В этой статье мы посмотрим:
- Что такое OPA
- 为什么你应该将OPA与Istio сеткой услуг整合
- Как Istio и OPA аутентифицируют запросы
- 确切的 шаги, которые вы можете следовать, чтобы интегрировать OPA с Istio
Что является OPA?
OPA (сокращенно от “Open Policy Agent”) – это open-source общей политики системы обнаружения, позволяющего DevOps определять политику как код, используя высокоуровневый декларативный язык Rego. OPA позволяет определять и применять политику по всему стеку центрально, снимая с разработчиков необходимость писать политику авторизации в приложение. Вот как работает OPA (смотрите рисунок 1):
- Приложение/сервис получает запрос.
- Сервис отправляет запрос авторизации в JSON-формате OPA.
- OPA проверяет запрос на соответствие определенным политикам авторизации.
- OPA принимает решение и возвращает ответ авторизации (ALLOW/DENY) сервису в JSON-формате.
Рисунок 1: Flуд авторизации с использованием OPA
Обратите внимание, что не обязательно это должна быть приложение, написанное разработчиком, которое отправляет запрос на авторизацию: это может быть Argo CD, ресурс Kubernetes Gateway API, Terraform, Prometheus или что-либо еще, так как OPA является универсальным инструментом. (Я упомянул и нарисовал приложение в кластере Kubernetes здесь для удобства и лучшего понимания.)
Почему интегрировать OPA с Istio?
Istio имеет устойчивую механизм авторизации. However, having a dedicated policy enforcement engine like OPA alongside Istio service mesh has its own benefits:
- Сентрализованная система управления для определения и применения политик: OPA делает легче для DevOps центрально управлять политиками авторизации для всего стека. Это включает работающие в сетке задачи, не сетчатый стек и также проверки авторизации (политика, которая запрещает развертывание на пятницу, например).
- Больше гибкости и granularity в определении политик: Если вы посмотреть на таблицу ниже (Рисунок 2), становится ясно, что Istio авторизация может многое и сопоставить запрос на основе множества полей из различных источников данных. However, Istio AuthorizationPolicy CRD может быть ограничен в настройке тела HTTP-запроса или любых контекстуальных данных в полях, для чего может быть использовано OPA. Unlike Istio, OPA может использовать любые данные для оценки политики.
- Упрощенная настройка AuthZ: Configuring complex authorization rules in Istio can be tedious for DevOps. OPA is configured using Rego, which is closer to a programming language. It is comparatively easier to set basic to complex policy rules using Rego.
Рисунок 2: Табличное сравнение авторизации Istio и OPA (источник)
Как Istio и OPA авторизуют запросы
DevOps могут устанавливать OPA как отдельную службу или как дополнительный контейнер вместе с прокси-сервером Envoy и контейнером приложения в pod. Техника использования дополнительного контейнера лучше для сниженияLatency.
Для OPA дополнительных контейнеров необходимо ввести в pod приложения, как это делается сEnvoy прокси-контейнером sidecar в Istio. Мы можем настроить введенные OPA контейнеры, чтобы mount ConfigMaps, содержащие правила авторизации; каждый sidecar контейнер OPA в пространстве имён then mount相同的配置和AuthZ规则, определенные в ConfigMap.
После введения OPA sidecar, прокси-сервер Envoy будет посылать запросы авторизации в OPA, чтобы принимать решения о авторизации, когда служба получает запрос:
Рисунок 3: Workflow авторизации Istio-OPA
При условии, что DevOps не хотят, чтобы каждый введенный OPA контейнер в том же пространстве имён следовал тем же настройкам и их собственные правила. В этом случае, они могут выполнить следующие действия:
- Убрать hardcoding, который позволяет текущей политике введения использовать определенный ConfigMap
- Настроить mutating webhook и отключить sidecar введение на уровне pod.
- Обслуживать политические пакеты с удаленного HTTP-сервера
- Доработать приложение и sidecars в различном命名空间 с различным ConfigMap
Шаги для интеграции OPA с Istio: демо
Ідея в том, чтобы OPA стал внешним авторизатором вместо sidecars Envoy прокси — для принятия решений по управлению доступом.
Я буду использовать классическую приложение Bookinfo из документации Istio для демо. Я настрою OPA с Istio для управления доступом и проверим, выполняется ли это через посылки запросов к bookinfo/productpage:
Рисунок 4: Diagramма интеграции Istio-OPA
Обратите внимание, что /productpage это UI, которое делает внутренние вызовы к другим сервисам, таким как сервисы отзывов и рейтингов (diagram). Я внесу OPA во все контейнеры в bookinfo
命名空间; все контейнеры OPA монтируют один и тот же ConfigMap и обладают тем же политиками авторизации из-за этого. Default поведение Bookinfo
приложения не пересылает никакого HTTP-аутентификации, поэтому внутренние вызовы проваливают аутентификацию и, следовательно, авторизацию.
Мы следуем данным шагам в порядке:
- Конфигурировать внешний Injector OPA sidecar
- Включите связь между прокси Istio и OPA
- Разверните конфигурацию OPA
- Примените конфигурацию Istio
- Разверните приложение и протестируйте настройку авторизации Istio-OPA
Предварительным условием для демо является установка Istio v1.19+ в вашем кластере. Я использую Istio v1.21.0 здесь.
OPA предоставляет quickstart.yaml для удобной установки. Я разделил yaml на три части для лучшего понимания: репозиторий IMESH GitHub.
Шаг 1: Настройка внедрения sidecar OPA
Примените opa_controller.yaml:
kubectl apply -f opa_controller.yaml
Файл opa_controller.yaml
разворачивает все — сертификаты TLS, ConfigMap с политикой внедрения, депloyment контроллера приема, и конфигурацию webhook мутирования — в пространство имен opa-istio
(см. рисунок 5):
- Контроллер webhook мутирования (
opa-istio-admission-controller
) затем будет слушать определенный лейбл (opa-istio-injection
) с значением, установленным как включено. - Контроллер вебхука вызывает
admission-controller
, который имеет политику внедрения. - Политика внедрения указывает
admission-controller
, как внедрять контейнер OPA в под назначение.
Рисунок 5: Конфигурация внедрения подкаста OPA
Теперь, перед установкой приложения Bookinfo, мы создадим пространство имён bookinfo
и продолжим действовать:
Создайте пространство имён bookinfo
применением bookinfo-ns.yaml:
kubectl apply -f bookinfo-ns.yaml
opa-istio-injection: enabled
, to auto-inject OPA sidecars.
Шаг 2: Enable Communication Between Istio Proxy and OPA
Измените ConfigMap Istio в пространстве имён istio-system
и добавьте extensionProviders
(opa-ext-authz-grpc
), чтобы это разрешило внешнюю авторизацию в сети:
- Копируйте
extensionProviders
из комментария в opa_controller.yaml. - Измените ConfigMap Istio и добавьте
extensionProviders
в поле сети. - Убедитесь, что выравнивание правильно.
- Сохраните настройки.
Этот шаг делает возможным для istio-proxy
общаться с контейнером opa-istio
в поде для запросов авторизации.
Если вы смотрите на extensionProviders
, это фильтр типа ExtAuthzGrpc
в Envoy с указанным входом в сервис и портом:
...
extensionProviders:
- name: opa-ext-authz-grpc
envoyExtAuthzGrpc:
service: opa-ext-authz-grpc.local
port: "9191"
...
Имя extensionProviders
, адрес сервиса и порт должны быть одинаковыми в opa_authz.yaml и opa_config.yaml.
Шаг 3: Deploy OPA Configuration
opa_config.yaml определяет конфигурации, связанные с открытой политикой. В нем есть opa-istio-config
и opa-policy ConfigMaps
— которые определяют реализацию gRPC-сервиса (envoy_ext_authz_grpc
) и фактические авторизационные политики, соответственно.
Авторизационные политики могут быть разделены на две части: первая часть определяет условия, при которых разрешено или запрещено авторизование; вторая часть определяет роли пользователей и разрешения для каждой роли.
Авторизационные политики могут занять немного времени для привычек, так как Rego здесь не использует множество ключевых слов. Включите новейшую версию Rego, чтобы получить ключевые слова (к примеру, ключевое слово allow if condition).
Примените конфигурацию OPA в пространстве имён bookinfo
, так как она взаимодействует с приложением:
kubectl apply -f opa_config.yaml -n bookinfo
Шаг 4: Apply Istio Configuration
Файл opa_authz.yaml содержит конфигурации Istio. В нем есть AuthorizationPolicy
и ServiceEntry
. Обратите внимание, что провайдер политики авторизации opa-ext-authz-grpc
является extensionProvider
, который мы настроили в ConfigMap на шаге 2.
Точно так же, имя хоста, определенное в ServiceEntry
, соответствует адресу сервиса, указанному в extensionProvider
(opa-ext-authz-grpc.local
). gRPC сервис будет работать на порту 9191 localhost 127.0.0.1, который делает ServiceEntry
, чтобы opa-istio
sidecars были доступны внутри контейнера istio-proxy
внутри пода.
Разверните конфигурацию:
kubectl apply -f opa_authz.yaml -n bookinfo
Шаг 5: Разверните приложение и протестируйте настройку авторизации Istio-OPA
Разверните приложение Bookinfo и шлюз:
kubectl apply -f /your_Istio_directory/samples/bookinfo/platform/kube/bookinfo.yaml -n bookinfo
kubectl apply -f /your_Istio_directory/samples/bookinfo/networking/bookinfo-gateway.yaml -n bookinfo
Проверьте поды в пространстве имен bookinfo
:
kubectl get pods -n bookinfo
Вы можете увидеть, что каждый под содержит 3 контейнера: приложение, Envoy proxy (istio-proxy
) и OPA (opa-istio
).
Получите IP-адрес шлюза Istio для доступа к сервису:
kubectl get svc -n istio-system

Теперь все готово, и мы готовы протестировать политики авторизации. Политики, которые мы определили в opa_config.yaml, таковы:
...
user_roles = {
"alice": ["guest"],
"bob": ["admin"]
}
role_perms = {
"guest": [
{"method": "GET", "path": "/productpage"},
],
"admin": [
{"method": "GET", "path": "/productpage"},
{"method": "GET", "path": "/api/v1/products"},
],
...
Алиса – гость, который может получить доступ только к /productpage
; Боб – администратор, который может получить доступ к путям /productpage
и /api/v1/products
. Подтвердим политики.
Попытка получить доступ к /api/v1/products
от Алисы:
curl -vvv your_istio_gateway_ip/api/v1/products -u alice:password
Вы можете увидеть, что сервер возвращает ответ 403 Запрещен
, поскольку Алиса не имеет доступа к этому пути. Попробуем тот же путь, что и Боб:
curl -vvv your_istio_gateway_ip/api/v1/products -u bob:password
Ответ сервера содержит HTTP статус 200 OK
и содержимое страницы в конце ответа.
Пример сценария контроля доступа с использованием OPA
Вы можете использовать CRD AuthorizationPolicy Istio для применения политики, показанной в демо. Вам не требуется OPA. However, there are instances where Istio authorization can be limited, as mentioned in the table at the beginning. Let me give a simple example.
Предположим, у нас есть приложение BookReviews, которое является GraphQL-сервисом, где рецензенты поставляют рецензии, редакторы редактируют и публикуют эти рецензии, а пользователи читают публикуемые рецензии.
Когда рецензент добавляет рецензию на книгу в сервис, запрос будет содержать JWT рецензента, содержащий группы и роли (рецензент или редактор), к которым принадлежит рецензент. Тело запроса также будет содержать GraphQL-mutations запрос с новой созданной рецензией.
Предположим, вы хотите убедиться в следующих условиях:
- Рецензенты могут поставлять только свои рецензии.
- Редактор может редактировать рецензию, если она написана рецензентом из той же группы, которая управляется им.
- Только редакторы могут помечать рецензию как “готовую к публикации”.
Диаграмма, включающая вышеуказанные политики:
AuthorizationPolicy Istio будет трудно применить вышеуказанные условия. причина в том, что Istio не может использовать GraphQL запрос тела для проверки доступа, который является JSON-объектом вместе с JWT, необходимым для оценки политики.
OPA не имеет таких ограничений. Она может загружать любую информацию для проверки политик, и DevOps-специалисты могут написать эти правила более удобным для работы способом с использованием языка Rego.
Видео: Демонстрация в действии
Если вы предпочитаете наблюдать за демонстрацией в действии, пожалуйста, посмотрите на видео ниже:S
Профессиональная поддержка для интеграции Istio
большинство предприятий используют OPA для определения и применения авторизационных политик для всего своего стека. Centralized mechanism для управления доступом улучшает общее состояние безопасности и гибкости IT- команд. в противном случае, разработчики тратили время на разработку авторизационных политик в их приложении кода на определенном языке, что препятствует масштабированию и быстреему применению бизнес-логики.
Source:
https://dzone.com/articles/5-steps-to-integrate-istio-with-opa