Перейти до вмісту

Секрети в Git і CI/CD: чому видалені ключі досі працюють

Секрети в Git і CI/CD: ключ API, відновлений із коміту перед його видаленням, і токен розгортання, виведений у журнал збірки, виправлені відкликанням ключа до очищення історії

Витік секрету в Git або CI/CD — це будь-які облікові дані, як-от ключ API, токен розгортання чи приватний ключ, що потрапили в історію репозиторію, відстежуваний файл або журнал збірки. Видалення з останнього коміту їх не відкликає. Будь-хто з клоном чи доступом до журналів може прочитати й використати їх, доки самі облікові дані не замінять.

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

Як секрети потрапляють у Git?

Section titled “Як секрети потрапляють у Git?”

Більшість витоків у Git спричиняють два шаблони. Перший — жорстко прописаний ключ, який згодом «видаляють» комітом-прибиранням. Другий — цілий файл із секретами, як-от .env, приватний ключ чи JSON сервісного облікового запису, що відстежується з першого коміту, бо в репозиторії ніколи не було .gitignore.

В актуальному дереві обидва виглядають нормально. Тому вони й живуть роками.

Чи видаляє секрет із Git його видалення з коду?

Section titled “Чи видаляє секрет із Git його видалення з коду?”

Ні. Git зберігає кожну версію кожного файлу, тож значення лишається в коміті перед прибиранням. Одна команда git log -p або git show <commit>^:config.js повертає його, а кожен форк і клон має власну копію.

Вправа «Секрети в історії Git» показує це наочно. Ви знаходите коміт, який нібито видаляє робочий ключ API, читаєте ключ із попереднього коміту й повторюєте запит до живого адміністративного API. Вправа «Закомічені файли з секретами» робить те саме з відстежуваним .env, що веде просто в тестове середовище.

Як конвеєри CI/CD спричиняють витік секретів?

Section titled “Як конвеєри CI/CD спричиняють витік секретів?”

Журнали збірок публічніші, ніж думають автори workflow. Крок налагодження з echo $DEPLOY_TOKEN друкує секрет відкритим текстом, а в публічному репозиторії цей журнал може прочитати будь-хто.

Ті самі workflow часто мають другу ваду: недовірені вхідні дані, наприклад назва pull request, підставлені просто в крок run:. Такі дані виконуються як команди оболонки на раннері, де секрети конвеєра в досяжності. Незакріплені сторонні actions додають третій шлях, бо переміщений тег може підставити код, який ви ніколи не перевіряли.

У вправі «Розкриття секретів у CI/CD» ви забираєте токен розгортання з публічних журналів Actions і розгортаєте з ним власний образ. Потім виправляєте workflow і замінюєте токен.

Що робити першим, коли секрет витік?

Section titled “Що робити першим, коли секрет витік?”

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

Очищення історії через git filter-repo або маскування майбутніх журналів здається виправленням, але нічого не робить із ключем, який зловмисник уже скопіював. Прибирайте після того, як облікові дані мертві.

Як запобігти витоку секретів у Git і конвеєри?

Section titled “Як запобігти витоку секретів у Git і конвеєри?”
  • Блокуйте файли з секретами під час коміту. Додайте .gitignore для .env, ключів і JSON з обліковими даними та pre-commit хук, що відхиляє назви й шаблони секретів.
  • Скануйте в CI. Запускайте сканер секретів на кожен push, щоб витік ставав невдалою збіркою, а не публічним комітом.
  • Ніколи не виводьте секрети. Приберіть налагоджувальні виводи, а маскування платформи вважайте лише страховкою.
  • Вважайте вхідні дані конвеєра недовіреними. Передавайте назви PR, гілок і текст задач через змінні середовища, ніколи не вставляйте їх просто в команди оболонки.
  • Закріплюйте actions за SHA коміту, а не за тегом.
  • Надавайте перевагу короткоживучим обліковим даним, як-от федерації OIDC із вашою хмарою, щоб токен, що витік, сам спливав.

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

Навчайте розробників на витоку, а не лише на політиці

Section titled “Навчайте розробників на витоку, а не лише на політиці”

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

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