Підписування Docker-образів з Cosign: Sigstore, Keyless, Kyverno

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

Чому підписування Docker-образів зривається на етапі викладки

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

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

Відрізнити підміну від нормального релізу за зовнішніми ознаками майже неможливо: той самий тег, той самий порт, застосунок стартує і проходить базові проби.

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

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

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

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

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

Розбираємо, як це закривається: підписування Docker-образів, Keyless через Sigstore і політики Kyverno, які пропускають у кластер лише перевірене.

Що дає перевірюваний ланцюг постачання: ефект у вимірюваних величинах

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

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

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

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

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

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

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

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

Режим Коли підходить Обмеження
Ключовий Замкнуті контури без вихідного доступу: підпис ставиться із захищеного сховища, кластер перевіряє образ за публічним ключем Потрібні ротація та охорона ключа: його компрометація означає перепідпис усього реєстру, а підпис не говорить, хто саме його поставив і з якої гілки
Безключовий Збірка в загальному конвеєрі: зовнішній засвідчувальний центр видає сертифікат на хвилини, приватного матеріалу на диску не залишається Потрібен вихідний доступ до сервісу посвідчення та журналу прозорості; в ізольованому контурі без проксіювання режим не працює взагалі
Гібридний Політика вимагає і офлайн-перевірки, і прив'язки до конкретного конвеєра, гілки, середовища Дорожче в налаштуванні: доводиться синхронізувати ланцюг довіри та підтримувати два джерела перевірки одночасно

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

Впровадження за кроками: від аудиту конвеєра до передачі експлуатації

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

  1. Аудит конвеєра збірки. Інвентаризація: де і чим збираються образи, які реєстри задіяні, хто деплоїть, які політики допуску вже є. Результат — карта залежностей і точки вбудовування підпису.

  2. Схема довіри. Вирішуємо, що засвідчує особистість збирача: безключовий режим з посвідченням від системи збірки або ключ у сховищі секретів. Фіксуємо список довірених посвідчень.

  3. Налаштування підпису. Cosign підписує образ після публікації, запис іде в журнал прозорості. Перевіряємо на одному сервісі, що теги та дайджести не розходяться.

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

  5. Прогін на стенді. Повний цикл: збірка, підпис, перевірка, відкат на попередній образ, поведінка при недоступності журналу. Вимірюємо затримку викатки і частку хибних відмов.

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

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

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

  • Політики допуску. Які образи запускаються в кластері, чи обов'язковий підпис, що робити з непідписаними збірками, які винятки відкриті та до якої дати діють.
  • Розмежування ролей. Хто має право підписувати артефакт, хто — змінювати політику, хто — лише читати журнал. Право підпису та право допуску розведені: збирач не дозволяє собі викладку одноосібно.
  • Схема потоків збірки та викладки. Один аркуш: де ставиться підпис, де проходить перевірка, що відбувається при відмові та куди йде повідомлення. За ним новий інженер входить у контур без перепитувань.
  • Регламент реагування на інцидент. Компрометація ключа або облікового запису підпису: як відкликати, як перепроверити вже викладене, за який час зобов'язаний вкластися черговий.
  • Документація щодо підпису. Як випускається короткоживучий сертифікат, до якої особистості збірки він прив'язаний, як відтворити перевірку вручну на своїй машині поза контуром.
  • Інструкція для чергового. Розбір типових відмов — образ не підписано, підпис прострочено, недоступний сервіс ідентичності — з командами та межею «роблю сам / ескалюю».
  • Журнал перевірок. Що і як довго зберігається, як вивантажити звіт для внутрішнього аудиту та довести, що в прод не потрапляв непідписаний артефакт.

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

Кейс: прибрали підміну артефактів між збіркою та викладкою

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

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

Підписування docker-образів ми поставили в той самий конвеєр: викладка йде за digest, а не за тегом, а кожна збірка отримує короткоживучий сертифікат у keyless-режимі Sigstore — довгоживучий ключ не зберігається.

На вході в кластер політика Kyverno відхиляє образ, якщо підпис невалідний або випущений не тим конвеєром.

Метрики до та після

  • Відхилена викладка: раніше перевірок не було жодної — тепер на вході відсікається приблизно кожна двадцята спроба, і це підміни, а не робочі релізи.
  • Час локалізації інциденту: з трьох годин до п'ятнадцяти хвилин — за підписом видно конвеєр, гілку та коміт.
  • Ручні операції на реліз: з п'яти до нуля; відкат іде за раніше підписаним digest, а не за «попереднім тегом».

З якими застереженнями застосовний результат

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

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

Чим перевірка при викладці відрізняється від перевірки в сховищі?

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

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

Політика в реєстрі спрацьовує в момент запису: якщо в образу немає валідного підпису Sigstore або не виконані вимоги до базового шару, він не потрапляє в сховище.

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

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

Він відхиляє запуск, якщо підпис формально є, але видано не тим, хто повинен підписувати: при keyless-підписі перевіряється конкретний обліковий запис та її емітент, а не сам факт наявності сертифіката.

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

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

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

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

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

Що відбувається при компрометації ключа підпису?

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

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

Вже викладені непідписані образи — видаляти?

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

Як визначається довірене джерело?

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

Хто володіє політиками допуску?

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

Обговоримо задачу: розберемо ваш конвеєр і повернемося з планом

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

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

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

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

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

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

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