Реалізація Policy as Code для Terraform (Sentinel і OPA)

Інфраструктура зростає швидше, ніж ручні перевірки встигають її стримувати. Ми налаштовуємо Policy as Code під ключ: правила стають частиною процесу змін і спрацьовують до того, як помилка потрапить у робоче середовище. Команда випускає зміни частіше, а частка відкатів падає в рази.
Часті запитання

Policy as Code: чому ручні перевірки не утримують інфраструктуру

Ручні перевірки інфраструктури тримаються на домовленості: рев'ю змін працює, поки в команді є людина, яка пам'ятає, що ресурси не можна відкривати назовні, а сервісним обліковим записам не потрібні права адміністратора.

Щойно потік змін зростає або частина роботи переходить підряднику, домовленість перестає тримати — план застосовується швидше, ніж хтось встигає прочитати різницю.

Точки відмови виглядають передбачувано. На великих змінах рев'ю перетворюється на формальність: чотириста рядків в описі мережі ніхто не розбирає порядково, а саме там і з'являється відкритий доступ.

Оточення розходяться — узгоджене для тестового контуру в промисловому застосовують з іншими правами й параметрами.

Дрейф конфігурації накопичується непомітно: правки через консоль не потрапляють у репозиторій, і наступне застосування повертає інфраструктуру не туди, де її залишили.

Policy as Code переносить ці правила з листування в код, який перевіряє план до застосування. Sentinel і OPA описують заборони декларативно: обов'язкові мітки, дозволені регіони, заборона необмежених мережевих правил, вимоги до прав доступу.

Перевірка вбудована в конвеєр, тому відхилені зміни не доходять до середовища — з конкретною причиною та посиланням на порушене правило, а не з повідомленням «перероби».

Далі розбираємо, як це влаштовано на практиці та що саме утримує інфраструктуру в заданих межах.

Що змінюється після впровадження автоматичних перевірок

Політики на Open Policy Agent або Sentinel описуються декларативно й підключаються до конвеєра між описом інфраструктури та її застосуванням.

Тому заборона спрацьовує на етапі планування змін, а не в момент розгортання: інженер бачить причину відмови у виводі звичайної команди та править конфігурацію до того, як вона торкнеться робочого середовища.

  • Час перевірки змін. Ручний розбір, який займав у рев'юера від півгодини до кількох годин, замінюється прогоном політик за планом — вердикт приходить разом із результатом збирання, зазвичай за хвилини.
  • Частка відхилених змін. Близько третини запитів не проходить перевірку автоматично: відкриті назовні порти, публічні сховища, відсутні мітки, занадто широкі права. Ці правки просто не доходять до середовища.
  • Класи відмов, які зникають. Невідповідність політиці безпеки, розбіжності між середовищами, зміни, зроблені руками в обхід конфігурації, і поступове розростання прав.
  • Частка інцидентів. Пригоди, спричинені конфігурацією, перестають бути основною причиною збоїв, а розбір кожного випадку займає менше часу — видно, яка політика й яка зміна його допустили.
  • Прискорення випуску та простій. Вікно відновлення під час відкату скорочується з годин до хвилин: конфігурація відтворювана, а попередній стан розгортається тим самим способом, що й поточний.

Перевірки не замінюють рев'ю, а знімають із нього механічну частину: людина дивиться на архітектурні рішення, а не на список відкритих портів. Набір політик при цьому розширюється поступово — починаючи із заборон на критичне й додаючи правила в міру накопичення відмов.

Підходи до контролю інфраструктури: порівняння варіантів

Вибір варіанта визначає, на якому кроці порушення буде спіймано. Відхилений план правиться хвилинами, а відкат уже застосованої зміни зачіпає живі ресурси, тому варіанти порівнюємо за точкою перехоплення та ціною супроводу, а не за «потужністю» мови правил.

Варіант Коли підходить Обмеження
Вбудований рушій політик платформи (Sentinel) Увесь ландшафт в одній платформі, потрібні перевірки між планом і застосуванням Правила прив'язані до платформи: під час переїзду їх описують заново, виразність мови обмежена завданнями платформи
Зовнішній рушій політик (OPA) Кілька платформ і контурів, одне правило має працювати всюди, включно з кластерами та конвеєрами збирання Потрібен свій шар доставки й версіонування політик, а стан плану передається в окремому форматі
Перевірки в репозиторії Потрібен відгук до звернення до платформи: домовленості про найменування, обов'язкові теги, структура модулів Бачать вихідні коди, але не обчислені значення плану — частина порушень спливе пізніше
Ручне рев'ю Рідкісні зміни та рання стадія, коли правила ще не усталилися Не масштабується: зі зростанням кількості команд зростає строк узгодження та частка пропущених порушень

Робочий контур зазвичай збирається зі зв'язки: швидкі перевірки в репозиторії відсікають очевидне, вбудований рушій перевіряє план перед застосуванням, зовнішній тримає загальні правила для кількох контурів. Далі розбираємо, як зібрати таку зв'язку й не дублювати правила між шарами.

Етапи впровадження Policy as Code: від аудиту до передачі

Порядок етапів тут не формальність: якщо одразу ввімкнути блокування, конвеєр збирання зупиниться на першому ж злитті, і команда повернеться до правок вручну.

Тому спочатку описуємо поточний стан, потім формулюємо правила в попереджувальному режимі й лише після перевірки на стенді переводимо їх у блокувальні.

  1. Аудит репозиторіїв і станів. Збираємо перелік кореневих модулів, де зберігається стан, хто і як часто вносить зміни, які ресурси створюються поза загальним шаблоном. На виході — карта зон ризику: відкриті порти, публічні сховища, ресурси без тегів і власника.
  2. Схема політик. Класифікуємо правила на три групи: обов'язкові (безпека й доступи), організаційні (нейминг, теги, регіони) та гігієнічні (заборона застарілих типів ресурсів). Для кожного правила фіксуємо сферу застосування й рівень — блокувальний або попереджувальний.
  3. Прив'язка правил до стадій Terraform. Частина перевірок виконується за планом до застосування — вони ловлять помилку до створення ресурсів, частина за фактом застосування, частина під час рев'ю. Так розробник отримує зворотний зв'язок за секунди, а не після розгортання.
  4. Налаштування режимів. Блокувальний режим вмикаємо лише для правил із нульовою кількістю хибних спрацювань, решта ведуть у журнал. Винятки оформлюємо явно — з обґрунтуванням, відповідальним і строком перегляду, щоб не накопичувалися вічні обходи.
  5. Перевірка на стенді. Прогоняємо політики на копії реальних конфігурацій: рахуємо частку спрацювань, розбираємо спірні випадки, заміряємо, наскільки зріс час перевірки. Після цього правила переносяться в загальний контур. Передача. Віддаємо репозиторій з політиками, схему їхнього устрою, регламент зміни й додавання правил, інструкції для розробників. Далі команда замовника веде правила сама — правки проходять те саме рев'ю, що й код.

Артефакти впровадження: бібліотека політик, схеми, регламенти

Впровадження Policy as Code перевіряється не в день запуску, а в той момент, коли правило потрібно поправити, а автора вже немає на проєкті. Тому ми передаємо не налаштований інструмент, а робочу систему — набір артефактів, за якими ваша команда змінює правила сама, без нас.

  • Бібліотека політик — правила Sentinel і Rego, розкладені за доменами: мережа, шифрування, теги, ліміти ресурсів. У кожного правила опис, приклад спрацювання й власний тест.
  • Схема залежностей — карта модулів і outputs: що читає чужі значення, де спільний state, які правки зачіпають сусідні компоненти й потребують одночасної зміни.
  • Матриця доступу — хто ініціює зміну, хто підтверджує, для яких ресурсів потрібне ручне узгодження, а що проходить автоматично за результатом перевірок.
  • Регламент змін — порядок викатки нового правила: спочатку режим попередження, потім м'яка заборона, потім жорстка, з прогоном на історичних конфігураціях до ввімкнення.
  • Інструкція для розробника — як прогнати політики локально до відправлення коду, як читати вивід про відмову й що робити при хибному спрацюванні.
  • Каталог винятків — оформлені відступи з власником і строком дії, щоб правило не вимикали правкою коду в поспіху.
  • Документація — точка входу: де лежать правила, як додати своє, який поріг покриття тестами вважається нормою й до кого йти з питанням.

Окремо віддаємо журнал перших прогонів: видно, які правила спрацьовували найчастіше й де команда правила конфігурації під них, — це найкращий навчальний матеріал для нових інженерів.

Кейс: від ручних перевірок до автоматичного контролю змін

Контур — кілька сотень репозиторіїв з описом інфраструктури, які вели понад десять команд. Кожна зміна проходила ручне рев'ю: перевіряльник звіряв конфігурацію з внутрішнім регламентом за чек-лістом, який відставав від регламенту на місяці.

Частина порушень — відкриті назовні сховища, відсутність шифрування, правки в захищених контурах — ішла в роботу й спливала вже після застосування.

Правила описали як код на Open Policy Agent і винесли в окремий репозиторій з версіонуванням і тестами: до кожного правила додані конфігурації, які воно зобов'язане пропустити й зобов'язане заблокувати.

Перевірку вбудували в конвеєр на етапі плану — до застосування, тому автор зміни одразу бачить, яке правило й який рядок його зупинили.

Нове правило не пишуть «на майбутнє»: спочатку фіксується інцидент або вимога безпеки, потім правило проганяється по історичних конфігураціях, і лише потім вмикається в блокувальний режим.

Перший час частина правил працювала в режимі попередження — так вичистили хибні спрацювання, не зупиняючи команди.

Блокування до застосування зросли з поодиноких випадків до 95% усіх знайдених порушень. Частка відкатів змін, спричинених помилкою в конфігурації, впала з 12% до 3%.

Час перевірки однієї зміни скоротився з 40 хвилин ручного рев'ю до 3 хвилин машинної, при цьому обсяг правил зріс з 15 до 60, а ручних пунктів у чек-лісті стало втричі менше.

Чим вбудований рушій політик відрізняється від зовнішнього?

Вбудований рушій іде разом з інструментом: правила пишуться його власною мовою й перевіряються прямо на етапі планування змін. Зовнішній рушій — окремий компонент, який отримує опис інфраструктури в машинозчитуваному вигляді та виносить вердикт за загальним набором правил.

Розходяться вони за чотирма осями: мова опису правил, переносимість політик, швидкість перевірки й супровід.

Критерій Вбудований рушій Зовнішній рушій
Мова опису правил Власна, знає об'єкти одного інструмента Декларативна загального призначення, єдина для всіх перевірок
Переносимість політик Працюють лише всередині свого інструмента Один набір покриває інфраструктуру та прикладні маніфести
Швидкість перевірки Вердикт у тому самому процесі, без мережевих викликів Окремий сервіс: мережевий виклик в обмін на незалежне масштабування
Супровід правил У темпі оновлень інструмента Свій графік, але реєстр правил і тести тримаєте самі

Обидва варіанти — це Policy as Code: правила лежать у репозиторії, проходять рев'ю й перевіряються автотестами. Вбудований рушій закриває швидкі ризики одного контуру — правила про оточення, теги й допустимі типи ресурсів пишуться за години й не потребують окремого сервісу.

Зовнішній виграє, коли перевірки потрібні одразу на кількох інструментах. Ми зазвичай починаємо з вбудованого, а загальні правила переносимо в зовнішній рушій — з реєстром, версіонуванням і тестом на кожне правило. Перевірка залишається швидкою, а політики не доводиться переписувати при зміні інструмента.

Технічні сумніви: обмеження та часті помилки впровадження

Саме впровадження правил рідко буває складним — складність у тому, як політика поводиться, коли команда працює під строком і в кількох контурах одночасно. Нижче — питання, які найчастіше спливають на етапі передачі рішення в експлуатацію.

Як бути, якщо правило блокує нормальну зміну?

Ми ділимо правила на попереджувальні та блокувальні, і другі вмикаємо лише після прогону по історії змін у репозиторії — одразу видно, яка частка спрацювань хибна.

Правило формулюється на інваріант (відкритий порт, вимкнене шифрування), а не на оформлення коду: перевірка стилю ламається на будь-якому рефакторингу й через місяць вимикається самою командою.

Що робити під час аварії, якщо правило заважає терміновому виправленню?

Шлях обходу проєктується заздалегідь, а не винаходиться в момент збою: окрема роль з коротким строком дії, обов'язкова причина, слід у журналі та автоматичне завдання на приведення конфігурації до норми.

Політика без штатного обходу вимикається цілком — це найгірший результат, бо контролю не залишається зовсім.

Чи можна перевикористовувати правила між розробкою та експлуатацією?

Загальна бібліотека покриває те, що однаково всюди: теги ресурсів, шифрування, сегментація мережі. Відмінності виносяться в перевизначення на середовище — у розробці м'який режим і ослаблені ліміти, в експлуатації блокування.

Успадкування в Terraform будується через окремі кореневі модулі на контур: інакше ослаблення, додане для налагодження, непомітно їде в бойовий контур.

Обговоримо завдання: з чого почати впровадження перевірок

Щоб впровадження перевірок політик не залишилося демонстрацією на тестовому репозиторії, починаємо з розбору поточного процесу.

Нам важливо побачити, як сьогодні народжується зміна інфраструктури: хто готує описи ресурсів у Terraform, хто узгоджує, на якому кроці помилка зазвичай спливає — на рев'ю чи вже в хмарі після застосування.

Від вас для старту достатньо:

  • посилання на репозиторій з інфраструктурним кодом і приклади типових змін за останні цикли;
  • перелік вимог, які зараз перевіряються вручну: найменування, теги, мережеві доступи, шифрування, регіони;
  • ролі та правила узгодження: хто ініціює зміну, хто підтверджує, у кого право на виняток;
  • опис середовищ і відмінностей у режимах застосування;
  • доступи до системи контролю версій і до середовища, де будуть запускатися перевірки;
  • контакт інженера, який відповідає за інфраструктуру й підтверджує спірні правила.

У відповідь ви отримуєте оцінку та план робіт: перелік правил з пріоритетами, схему їх підключення до процесу змін, обсяг пілотного контуру та строки.

Пілотний контур беремо вузьким — одне сховище й 5-8 правил у режимі попередження, щоб команда звикла до сигналів без блокування викатки. Блокувальний режим вмикаємо після того, як правила перестають давати хибні спрацювання.

Передача документації — частина роботи, а не фінал: опис кожного правила, причина його появи та порядок розбору спрацювання залишаються у вашої команди. Опишіть завдання — повернемося з оцінкою та планом.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142