Чи може ваша платформа реалізовувати політики? Прискорте команди завдяки функціональності платформних політик L7
Чи є політика вашою основною компетенцією? Ймовірно, ні, але важливо зробити все правильно. Зробіть це один раз з Istio та OPA і поверніть команді фокус на те, що має найбільше значення.
Спільні обчислювальні платформи надають ресурси та функціональність для команд орендарів, щоб їм не доводилося створювати все з нуля. Хоча часом буває важко збалансувати всі запити від орендарів, важливо, щоб платформа ставила питання: яку найціннішу функцію ми можемо запропонувати нашим орендарям?
Часто роботу доручають безпосередньо командам що створюють застосунки, але деякі функції найкраще реалізувати один раз і надавати їх як сервіс для всіх команд. Однією з таких функцій, яку може запропонувати більшість команд, що опікуються платформами, є надання стандартної, гнучкої системи політики авторизації для рівня застосунків L7. Політика як код дозволяє командам переносити рішення щодо авторизації з рівня застосунків у легку та ефективну розподілену систему. Це може здатися складним завданням, але з правильними інструментами воно не обов’язково є таким.
Ми розглянемо, як Istio та Open Policy Agent (OPA) можуть використовуватися для забезпечення політик рівня L7 у вашій платформі. Ми покажемо, як почати з простого прикладу. Ви побачите, як ця комбінація є надійним варіантом для швидкого і прозорого надання політик командам розробки застосунків у бізнесі, а також забезпечує дані, необхідні командам безпеки для аудиту та дотримання стандартів.
Спробуйте самі
Коли OPA інтегровано з Istio, він може використовуватися для забезпечення детальних політик контролю доступу для мікросервісів. У цьому посібнику описано, як забезпечити політики контролю доступу для простого мікросервісного застосунку.
Попередні вимоги
- Кластер Kubernetes з встановленим Istio.
- Встановлений інструмент командного рядка
istioctl
.
Встановіть Istio і налаштуйте параметри mesh, щоб увімкнути OPA:
Зверніть увагу, що в конфігурації ми визначаємо розділ extensionProviders
, який вказує на самостійне встановлення OPA.
Розгорніть приклад застосунків. Httpbin — відомий застосунок, який можна використовувати для тестування HTTP-запитів; він швидко демонструє, як можна працювати з атрибутами запиту та відповіді.
Розгорніть OPA. Це не вдасться, оскільки очікується configMap
, що містить стандартне правило Rego для використання. Цей configMap
буде розгорнуто пізніше у нашому прикладі.
Розгорніть AuthorizationPolicy
, щоб визначити, які служби будуть захищені OPA.
Позначімо застосунок міткою, щоб впровадити політику:
Зверніть увагу, що в цьому ресурсі ми визначаємо OPA extensionProvider
, який ви встановили в конфігурації Istio:
Як це працює
При застосуванні AuthorizationPolicy
панель управління Istio (istiod) надсилає необхідні конфігурації до sidecar проксі (Envoy) вибраних сервісів, зазначених у політиці. Envoy потім відправляє запит на сервер OPA, щоб перевірити, чи дозволено цей запит.
Проксі Envoy працює шляхом налаштування фільтрів у ланцюгу. Одним із таких фільтрів є ext_authz
, який реалізує зовнішню службу авторизації з певним повідомленням. Будь-який сервер, що реалізує відповідний protobuf, може підʼєднатися до проксі Envoy та надати рішення щодо авторизації; OPA є одним з таких серверів.
Раніше, коли ви встановлювали сервер OPA, ви використовували версію сервера Envoy. Цей образ дозволяє налаштувати втулок gRPC, який впроваджує службу ext_authz
protobuf.
У конфігурації ви увімкнули втулок Envoy та порт, на якому він слухає:
Переглядаючи документацію про службу авторизації Envoy, можна побачити, що повідомлення має такі атрибути:
Це означає, що на основі відповіді від сервера authz Envoy може додавати або видаляти заголовки, параметри запиту та навіть змінювати статус відповіді. OPA також може це робити, як описано в його документації.
Тестування
Протестуймо просте використання (авторизацію), а потім створимо більш розширене правило, щоб показати, як можна використовувати OPA для зміни запиту та відповіді.
Розгорніть застосунок для запуску команд curl до тестового застосунку httpbin:
Застосуйте перше правило Rego і перезапустіть розгортання OPA:
Простий сценарій передбачає дозвіл запитів, якщо вони містять заголовок x-force-authorized
зі значенням enabled
або true
. Якщо заголовок відсутній або має інше значення, запит буде відхилено.
Існує кілька способів створити правило Rego. У цьому випадку ми створили два різні правила. Виконуються вони у порядку, і перше правило, яке задовольняє всі умови, буде застосоване.
Просте правило
Результатом наступного запиту буде відповідь 403
:
Наступний запит поверне 200
та тіло відповіді:
Складніші маніпуляції
Тепер складніше правило. Застосуйте друге правило Rego і перезапустіть розгортання OPA:
В цьому правилі ви можете побачити:
Це значення, які будуть повернуті проксі-серверу Envoy від OPA-сервера. Envoy буде використовувати ці значення для модифікації запиту і відповіді.
Зверніть увагу, що при поверненні JSON-обʼєкта потрібно вказувати allowed
, а не тільки true/false. Це можна знайти в документації OPA.
Зміна тіла відповіді
Випробуємо нові можливості:
Тепер ми можемо змінити тіло відповіді. Значення 403
змінює тіло в правилі Rego на «Unauthorized Request» (Несанкціонований запит). За допомогою попередньої команди ви повинні отримати:
Зміна тіла, що повертається і коду статусу
Запустивши запит із заголовком x-force-authorized: enabled
ви повинні отримати тіло «Authentication Failed» і помилку «401»:
Додавання заголовків до запиту
Запустивши відповідний запит, ви повинні отримати тіло відповіді з новим заголовком x-validated-by: my-security-checkpoint
і видаленим заголовком x-force-authorized
:
Додавання заголовків до відповіді
Запустивши той самий запит, але показавши лише заголовок, ви побачите заголовок відповіді, доданий під час перевірки Authz x-add-custom-response-header: added
:
Обмін даними між фільтрами
Останнім кроком є передача даних іншим фільтрам Envoy за допомогою dynamic_metadata
. Це корисно, коли потрібно передати дані іншому фільтру ext_authz
у ланцюзі або вивести їх у логи застосунку.
Для цього перегляньте формат журналу доступу, який ви налаштували раніше:
DYNAMIC_METADATA
— це зарезервоване ключове слово для доступу до обʼєкта метаданих. Далі вказується назва фільтра, до якого ви хочете звернутися. У вашому випадку, імʼя envoy.filters.http.ext_authz
автоматично створюється Istio. Ви можете перевірити це, вивівши конфігурацію Envoy:
Ви побачите конфігурації для фільтра.
Тепер перевіримо динамічні метадані. У розширеному правилі ви створюєте новий запис метаданих: {"my-new-metadata": "my-new-value"}
.
Виконайте запит і перевірте логи застосунку:
У виводі ви побачите нові атрибути, налаштовані за допомогою правил OPA Rego:
Підсумки
У цьому посібнику ми показали, як інтегрувати Istio та OPA для впровадження політик для простого мікросервісного застосунку. Ми також продемонстрували, як використовувати Rego для модифікації атрибутів запиту та відповіді. Це основний приклад для побудови системи політик на платформі, яку можуть використовувати всі команди розробників застосунків.