Закомічені файли з секретами
Один пропущений .gitignore — і ваш .env розлітається по всьому світу.
Що таке Закомічені файли з секретами?
Один жорстко закодований секрет — це проблема, а цілий закомічений файл із секретами — ще більша. Репозиторій без .gitignore відстежує файли .env, приватні ключі й JSON сервісного облікового запису від першого коміту, і кожен клон містить копію цієї історії. Ви склонуєте публічний репозиторій, прочитаєте закомічений .env і дістанетеся до середовища staging. Потім приберете файли з відстеження командою git rm --cached, відкличете й повторно випустите витеклий API-ключ, додасте .gitignore і закомітите конфігурацію pre-commit, що блокує назви файлів із секретами, щойно її встановить кожен розробник.
Що ви дізнаєтесь у Закомічені файли з секретами
- Розпізнавайте, що відсутній або неповний .gitignore дозволяє закомітити й відстежувати від першого коміту цілий файл із секретами: .env, приватний ключ чи JSON сервісного облікового запису
- Розумійте, чому кожен клон публічного репозиторію містить копію відстежуваного файлу із секретами, тож пізніше видалення файлу не скасовує розкриття
- Відрізняйте додавання ФАЙЛУ із секретами під контроль версій від жорстко закодованого значення секрету у вихідному коді й пам'ятайте, що обидва мають лишатися поза репозиторієм
- Виконуйте очищення: прибирайте файли з відстеження командою git rm --cached і замінюйте розкриті ключі, вважаючи будь-який надісланий секрет скомпрометованим
- Не допускайте повторення: поєднуйте .gitignore, що охоплює файли із секретами, з хуком pre-commit, який до коміту блокує відомі назви таких файлів, встановлюйте його в кожному клоні й підкріплюйте серверним захистом push
Закомічені файли з секретами — Кроки навчання
-
Оцініть ціль
Сьогодні Боб націлився на Tavonn — стартап із платіжних інтеграцій, який частину свого коду випускає у відкритий доступ. Він починає з публічного репозиторію й оцінює, на чому працює компанія, перш ніж шукати спосіб проникнути всередину. Публічний репозиторій — справжній подарунок для такого, як Боб: увесь проєкт і кожен файл можна завантажити однією командою.
-
Клонуйте репозиторій
Боб клонує репозиторій на свій комп'ютер, щоб без поспіху й офлайн прочитати кожен відстежуваний файл. Усе, що відстежує репозиторій, потрапляє в клон. Якщо файл із секретами колись закомітили, він є в копії, яку Боб щойно завантажив.
-
Перелічіть відстежувані файли
Боб виводить усе, що відстежує репозиторій. Його цікавить не те, що лежить на диску: він запитує git, які файли справді перебувають під контролем версій, бо саме ці файли є в кожному клоні.
-
Прочитайте файл із секретами
Боб відкриває закомічений файл змінних середовища. Ось чим цей витік відрізняється від одного жорстко закодованого ключа: це не одне значення, вставлене в рядок коду, а цілий файл секретів під контролем версій. Усе, що потрібно сервісу для роботи, лежить тут у відкритому тексті.
-
Дістаньтеся до середовища staging
Витік ключа — лише теорія, доки ключ нічого не відкриває. Усе потрібне Бобу вже є після клонування: закомічений .env дав йому базову адресу API в PUBLIC_API_URL і чинний ключ, а маршрути в клонованому src/routes/payments.js визначають потік платежів за адресою /v1/transactions . Він складає запит і передає ключ у заголовку Authorization так, як це зробив би справжній клієнт. Секретом ніколи не були ендпоінти API: вони лежать у публічному коді. Секретом був ключ, і закомічений файл віддав його Бобу, тож у сервера немає причин відхиляти запит.
-
Платіжні дані відкриті
Сервер повірив ключу й відповів. Боб читає платіжні записи Tavonn із середовища staging ззовні компанії, не маючи власного облікового запису.
-
Перевірка знань
-
Надходить сповіщення
Ви відповідаєте за репозиторій payments-service компанії Tavonn. Уночі сканер секретів служби безпеки виявив проблему в публічному репозиторії й надіслав вам лист. Висновок однозначний: у публічному репозиторії лежить закомічений .env із чинними ключами, а .gitignore , який не пускав би такі файли, немає.
-
Файли відстежуються, а .gitignore немає
Спершу ви хочете переконатися на власні очі. Ви виводите список файлів, які git відстежує в репозиторії, і ось результат: .env і ключ сервісного облікового запису перебувають під контролем версій, а .gitignore у списку немає. Файл на диску — це одне, а файл під відстеженням git уже закомічений, є в історії та в кожному клоні.
-
Приберіть файли із секретами з відстеження
Ви припиняєте відстеження файлів із секретами командою git rm --cached : вона прибирає їх з індексу, а на диску залишає, щоб сервіс і далі міг працювати локально. Після коміту цієї зміни файли зникають із поточного стану репозиторію. Здається, що проблему вирішено. Але це не так, і чому, покаже наступний крок.
Охоплення стандартів безпеки
CWE
- CWE-540 Inclusion of Sensitive Information in Source Code
- CWE-522 Insufficiently Protected Credentials
MITRE ATT&CK
- T1552.001 Unsecured Credentials: Credentials In Files
CIS Controls
- CIS 3 Data Protection
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.DS Data Security
- PR.PS Platform Security