Код из работающего парка без утечки секретов
Доставка
Наши наборы сделаны из кода, который обслуживает наш собственный парк, где в конфигурационных файлах хранятся ключи API, токены, пароли от почтовых ящиков и идентификаторы аккаунтов. Набор, который пропустит хотя бы один из них, хуже, чем отсутствие набора, поэтому ничего не упаковывается в архив, пока три сканера на трёх машинах не найдут ничего.
Что попадает внутрь
Упаковщик копирует только те файлы, которые указаны в манифесте набора, никогда не копирует папку целиком, исключает кэши, резервные копии и историю системы контроля версий. В примерах и тестах используются вымышленные товары и цифры, никогда — наши.
Сканирование
- На машине сборки: подготовленные файлы проверяются на наличие реальных значений секретов парка (132 на последней сборке) и на SHA-256 отпечатки 16 259 секретных строк с нашей рабочей станции. Отпечатки передаются, секреты рабочей станции никогда её не покидают.
- На двух других машинах: те же файлы отправляются на каждую и проверяются там против секретов, которые хранятся на этой машине (498 и 129 значений), затем удаляются.
- Везде: шаблоны для форматов ключей, частных адресов и персональных данных.
- Прежде чем это будет учтено: каждый сканер сначала запускается на подброшенных «канарейках» и должен найти все из них, 23 за прогон, иначе сборка останавливается.
Находка останавливает сборку. После того как версия продана, она никогда не пересобирается: исправление выходит как новая версия, поэтому файл, который скачивает покупатель, — это тот самый файл, который был проверен.
Ложные срабатывания, которые нас больше всего научили
- Комментарий, начинавшийся со слов «Каждый проход завершается», был помечен как пароль приложения Gmail. Такие пароли состоят из четырёх групп по четыре буквы, и эта фраза тоже. Мы перефразировали комментарий.
- Общий адресный диапазон 100.64.0.0/10, который используют операторский NAT и Tailscale, был помечен как частный адрес.
- Имя юнита systemd вида
[email protected]выглядело как адрес электронной почты, а идентификатор магазина-заполнитель вида9NXXXXXXXXXX— как реальный товар.
Комментарий мы перефразировали; остальные три случая были разрешены для этого одного набора и этого одного шаблона, никогда глобально, поэтому следующий набор проверяется так же строго, как первый. Ложное срабатывание стоит минуту, а пропущенный ключ стоил бы гораздо дороже.
Каждый набор в продаже прошёл через это, с нулём находок при каждом релизе.