Предисловие от редактора
Когда мы получили эту рукопись, в правовом отделе издательства случился коллективный
нервный срыв. Через два месяца юристы согласились опубликовать книгу на условии, что в
заголовке будет звёздочка, имена будут заменены, а все упомянутые компании будут
называться словом «Компания». Мы заменили. Если вы узнаёте свою — поздравляю, вы не
одиноки.
Автор попросил остаться анонимным, но настоял на том, чтобы в биографии было указано:
«шестнадцать релизов, четыре постмортема, ни одного увольнения».
Предисловие автора
Дорогой читатель, если ты держишь эту книгу в руках — значит, у тебя есть релиз и есть
безопасник. Поздравляю: у тебя нет релиза. Пока.
Эта книга не учит тебя взламывать системы. Эта книга учит тебя обходить людей, которые
мешают тебе эти системы чинить. Разница принципиальная, и если ты её не чувствуешь — верни
книгу в магазин и иди работать в банк.
Глава 1
Безопасник как мифологическое существо
Безопасник не человек. Безопасник — это функция, которая принимает на вход твой план
релиза и возвращает Exception: not approved. Ошибка в том, чтобы пытаться с ним договориться как
с человеком. С безопасником договариваются как с погодой: учитывают, одеваются потеплее и
планируют заранее.
Есть три архетипа:
- Фундаменталист. Читал OWASP в подлиннике. Верит, что релиз без пентеста
— это грех. Бесполезно объяснять про time-to-market. Лечится только цитатами из
внутреннего регламента, написанного им же.
- Выгоревший. Когда-то был фундаменталистом. Теперь согласует всё за
полчаса до дедлайна, если ты принесёшь ему кофе и не будешь смотреть в глаза. Самый
полезный типаж. Береги его.
- Новенький. Пришёл из консалтинга с презентацией на 84 слайда. Хочет
внедрить Zero Trust к пятнице. Опасен. Требует дозированного взаимодействия под
присмотром старших товарищей.
Совет бывалого Никогда не добавляй безопасника в чат проекта на стадии идеи. Добавляй на стадии «у нас
через неделю релиз, нужна ваша виза».
✻ ✻ ✻
Глава 2
«Это же MVP» и другие заклинания силы
В русском корпоративном языке есть несколько священных формул, которые временно отключают
критическое мышление у любого согласующего. Выучи их наизусть.
- «Это MVP» — работает на ранних стадиях. Снимает вопросы про
нагрузочное тестирование, отказоустойчивость и чтение логов. Срок годности: один квартал.
- «Мы это потом вынесем в отдельный эпик» — классика. Эпик никогда не
создаётся. Если создаётся — приоритет P4. Если поднимается до P1 — значит, уже
случился инцидент, и теперь это проблема SRE, а не твоя.
- «Это временное решение» — работает на средних стадиях. Время, как
известно, понятие растяжимое. Всё, что заработало, — временное до следующего редизайна.
- «Legacy» — магическое слово, которое превращает любой говнокод в
культурное наследие, которое опасно трогать. Используй, когда безопасник спрашивает,
почему пароли лежат в открытом виде.
Важно Никогда не используй два заклинания в одном предложении. «Это временное MVP-решение в
legacy» — это красная тряпка, которая привлекает внимание даже Выгоревшего.
✻ ✻ ✻
Глава 3
Фундаментальный принцип: «Легче извиниться, чем согласовать»
Это не мой слоган — я его подслушал у тимлида бэкенда в курилке. Но он работает.
Принцип устроен так: стоимость извинения после инцидента — один разговор с руководителем
и один постмортем. Стоимость согласования до релиза — четыре месяца переписки с тремя
командами и один нервный срыв. Математика простая.
Принцип имеет границы применимости. Если ты работаешь в банке и речь идёт о платёжных
данных — не используй его. Если ты работаешь в финтехе и речь идёт о KYC — не используй
его. Если речь идёт о любых персональных данных граждан — не используй его. Во всех
остальных случаях — дерзай.
Глава 4
Искусство формулировки тикета
Безопасник читает только заголовки. Это не лень, это защитный механизм: у него в очереди
340 тикетов. Используй это.
Плохо:
[SEC-REVIEW] Интеграция с внешним API: нужна проверка на утечку токенов
Это классический «сигнальный» заголовок. Он попадёт в первую пятёрку на ревью, и ты
огребёшь полный список замечаний.
Хорошо:
[TECH] Небольшое улучшение существующего механизма доступа
Это попадёт в бэклог ниже тикетов про обновление сертификатов. Ревью пройдёт по
диагонали. Визу получишь через два дня.
Отлично:
[CHORE] Рефакторинг
Это вообще не читают. CHORE — это слово, которое безопасник видит в последний
раз, когда прокручивает ленту. Никто никогда не спрашивает, что именно ты рефакторишь.
Рефакторишь — и всё, молодец.
Задание читателю Перепиши заголовки последних десяти твоих тикетов так, чтобы в них не было ни одного из
слов: auth, token, password, PII, интеграция, внешний, клиент, данные. Если получилось
— ты готов к следующей главе.
✻ ✻ ✻
Глава 5
Feature flag как алиби
Feature flag — это не техническая практика. Это юридический инструмент.
Когда безопасник спрашивает: «Почему вы это выкатили в прод без моего согласования?»,
правильный ответ: «Мы это не выкатили. Мы это задеплоили. Под флагом. Флаг выключен. Как
только вы согласуете — мы включим».
Теперь важное уточнение. Флаг включается тремя способами:
- Официально. Через change request, с согласованием, с окном деплоя.
Идеальный мир. Бывает раз в год.
- По запросу продакта. «Включите на 5% пользователей, посмотрим
метрики». Безопасник обычно не в курсе, что такое «5% пользователей» и почему они
важнее его процесса.
- Тихо. Флаг был
false в конфиге. Стал true. В
changelog написано «обновление конфигурации окружения». Никто не читает changelog.
Продвинутая техника Назови флаг enable_new_flow_v2_temp_disabled. Когда его
включишь — никто не поймёт, что что-то поменялось. Название же говорит, что выключено.
✻ ✻ ✻
Глава 6
Пятничный деплой как духовная практика
Весь корпоративный мир учит тебя не деплоить в пятницу. Весь корпоративный мир не прав.
Пятница 17:00 — это окно, когда:
- Безопасник уже ушёл на дачу.
- Юрист не отвечает в почте.
- Комплаенс в отпуске.
- В понедельник у всех стендапы, ретро и планирование — до твоего деплоя никто не
доберётся до среды.
- К среде у всех уже новая повестка.
К тому моменту, как кто-то заметит, что ты выкатил, — это уже не «новый функционал», это
«наш существующий продукт, работающий с прошлой недели». А существующий продукт не
требует согласования. Он требует поддержки.
Дисклеймер от редактора Автор не несёт ответственности за ваш сломанный прод, испорченные выходные и
разрушенные семьи. Пятничный деплой — это экстремальный спорт.
✻ ✻ ✻
Глава 7
Waiver через измор
Waiver — это индульгенция. Официальная бумага, что безопасник разрешил тебе не соблюдать
требование. Получить её сложно. Но есть приём.
Методика называется «переписка на 47 писем». Работает так:
- Ты пишешь: «Коллеги, прошу согласовать отступление от регламента в следующем случае…»
- Безопасник отвечает вопросом.
- Ты отвечаешь с уточнением, но добавляешь два новых кейса.
- Безопасник задаёт пять вопросов.
- Ты отвечаешь на три и добавляешь CC на архитектора.
- Архитектор отвечает, что ему нужно время подумать.
- Ты через неделю пишешь: «Коллеги, напоминаю, дедлайн».
- Безопасник отвечает: «Окей, в порядке исключения».
Средняя длина цепочки — 3 недели. Ключевой приём: ни в одном письме не давать безопаснику
полной картины. Картина у него складывается только в голове, и только после согласования,
когда уже поздно.
✻ ✻ ✻
Глава 8
Google Doc как священный артефакт
В российской корпоративной культуре существует убеждение: если что-то написано в Google
Doc (или, в нашем случае, в Яндекс.Документах / Confluence / Вики — подчеркните нужное) и там есть больше трёх комментариев от разных людей — это
согласовано.
Это неправда. Но все в это верят, и пока верят — пользуйся.
Рецепт:
- Создай документ «Архитектура фичи X».
- Пригласи туда безопасника, архитектора, техлида и двух продактов.
- Попроси «посмотреть».
- Получи три комментария: «лгтм», «вопрос по схеме данных — обсудим», «👍».
- Выдели эти три комментария как «резолвед».
- В следующий раз, когда кто-то спросит «а это согласовано?», отправь ссылку.
Никто никогда не откроет документ и не перечитает его. Ссылка в переписке = согласование.
Это корпоративный KYC наоборот.
Часть третья
III
Стратегия
Глава 9
Pet-прод: тёмный секрет каждой команды
У каждой команды есть pet-прод. Это второй контур, где всё работает без согласований.
Называется он по-разному: staging, pre-prod, dev-2, тестовая среда «для демо клиентам»,
окружение для нагрузочных тестов. Его объединяет одно: в нём лежат реальные данные, и
безопасник про него не знает.
Официально pet-прода не существует. Неофициально на нём работает половина клиентов,
которым «срочно нужно посмотреть».
Правила гигиены pet-прода - Никогда не называй его «прод» в переписке. Он «демо-стенд».
- Никогда не добавляй туда мониторинг, который дойдёт до инфры.
- Никогда не оставляй в логах IP-адреса клиентов.
- Если безопасник про него спросит — это был единоразовый эксперимент, всё удалено,
окружение снесено.
- Окружение не сноси.
✻ ✻ ✻
Глава 10
Как не попасть в отчёт пентеста
Раз в год к вам приходит пентестер. Пентестер — это безопасник, которому платят за то,
чтобы он нашёл дыры. И он их найдёт. Вопрос в том, чьи.
Твоя задача — сделать так, чтобы дыры он нашёл не в твоём сервисе. Для этого есть три
проверенные техники:
- Скоуп-инжиниринг. До начала пентеста согласуй с пентестерами список «в
скоупе» сервисов. Убедись, что твой сервис туда не попал. Используй формулировку: «этот
сервис сейчас в активной миграции, пентестить бессмысленно». Миграция закончится через
18 месяцев.
- Декоративное соответствие. Добавь в свой сервис пять «декоративных»
проверок: rate-limiter, который срабатывает только на 10 тысячах RPS, CSRF-токен,
который не валидируется, заголовок
X-Security-Level: High. Пентестер
увидит следы заботы о безопасности и уйдёт искать добычу попроще. - Жертвенный эндпоинт. Оставь один очевидно плохо защищённый эндпоинт,
который делает что-то не очень важное (например, возвращает версию сборки). Пентестер
найдёт его, радостно отчитается, напишет в отчёт один пункт и уйдёт. Ты исправишь,
получишь галочку «учтены замечания пентеста», и в этом году тебя больше не беспокоят.
✻ ✻ ✻
Глава 11
«Учтём в следующем спринте»
Эту фразу произносят примерно 340 раз в квартал в каждой продуктовой команде. Из них в
следующем спринте учитывается ноль.
Почему это работает? Потому что у безопасника нет инструмента, чтобы проверить, учли ли
вы что-то в следующем спринте. Он может прийти и спросить. Ты покажешь тикет в бэклоге.
Тикет там с прошлого квартала, с приоритетом P3. «Мы в процессе, коллеги».
Продвинутая версия Создай в бэклоге отдельную папку «Security debt». Складывай туда всё, что пообещал
исправить. Раз в квартал переноси все тикеты в новую папку «Security debt Q2». Папку
«Security debt Q1» архивируй. Если кто-то спросит про старый тикет — «мы его
декомпозировали, новый вариант находится в Q2».
Декомпозиция — это магия, которая превращает один просроченный тикет в три новых
непросроченных.
Часть четвёртая
IV
Когда всё-таки попались
Глава 12
Протокол выживания при аудите
Рано или поздно к тебе приходят с аудитом. Это не конец света. Это конец квартала.
Первые 24 часа:
- Ничего не удаляй. Удалённое восстанавливается, и факт удаления — отдельное нарушение.
- Ничего не коммить. Все изменения в коде за период аудита — подозрительны.
- Не оправдывайся в письмах. Всё, что ты напишешь, будет использовано против тебя.
Следующие 48 часов:
- Собери «папку контекста». Туда положи всё, что когда-либо было сказано в твою пользу:
письма от продуктового руководства «срочно релизим», скриншоты переписки с
безопасником «окей, в порядке исключения», тикеты с визами.
- Запросить встречу. На встрече у тебя два козыря: контекст и усталость аудитора. Аудитор
тоже человек, у него в день пять таких встреч.
Ключевая фраза: «Мы приняли это решение осознанно, с учётом
бизнес-контекста, и зафиксировали риск». Даже если вы ничего не фиксировали. Риск,
зафиксированный задним числом, — это всё ещё зафиксированный риск.
✻ ✻ ✻
Глава 13
Как написать постмортем, в котором ты герой
Постмортем — это литературный жанр. Не технический документ, а именно жанр, со своими
законами.
Структура:
- «Что случилось» — сухо, без эмоций, в страдательном залоге. Не «я
выкатил без ревью», а «был произведён деплой в рамках инициативы по ускорению
time-to-market».
- «Почему случилось» — здесь важно указать не менее трёх причин, из
которых две — системные (процессы, инструменты), а одна — человеческая, но не твоя.
Идеально: «отсутствие автоматической проверки на этапе CI», «недостаток коммуникации
между командами», «ошибка конфигурации».
- «Что сделаем» — список из пяти действий, из которых три — «улучшить
процесс», одно — «провести обучение», одно — «добавить в чек-лист». Ни одно не требует
бюджета. Ни одно не имеет дедлайна раньше чем через квартал.
- «Уроки» — здесь ты пишешь про важность безопасности с искренним лицом.
Безопасники любят этот раздел. Цитируй OWASP.
Награда за лучший постмортем Получить благодарность от CISO за «зрелый подход к инцидентам». Реальный кейс из
практики автора. Инцидент был, бюджет утечки данных оценили в семизначную сумму. Автор
получил премию за постмортем.
— Послесловие —
Ты дочитал до этого места. Значит, ты либо продакт, который хочет зарелизиться, либо
безопасник, который хочет понять, как с тобой теперь разговаривать. В обоих случаях —
спасибо.
Теперь серьёзно, один абзац.
Всё, что написано в этой книге, — правда про то, как устроена индустрия. И всё это —
неправильно. Мы шутим про безопасников, потому что нам тяжело с ними работать. Им тоже
тяжело с нами. Большинство из них — хорошие, умные люди, которые пытаются не дать
случиться тому, что ты потом будешь объяснять в суде, в ФСТЭК, в Роскомнадзоре, в письме
клиентам: «мы столкнулись с инцидентом, ваши данные могли быть затронуты». Когда это
случится — а это случится с каждым из нас хотя бы раз, — ты вспомнишь эту книгу и
подумаешь: блин, может, зря я в прошлый раз закрыл этот тикет с P3. Может, и правда
стоило учесть в следующем спринте.
Но это уже другая книга.
Приложение А
Словарь пассивной агрессии для переписки с InfoSec
| Что написано | Что имеется в виду |
|---|
| «Коллеги, хотел бы уточнить…» | Я знаю ответ, но хочу, чтобы вы это произнесли |
| «Добавляю в копию руководителя» | Я сдаюсь договариваться, теперь это политика |
| «Согласно пункту 4.2.1 регламента…» | Я пятнадцать минут искал этот пункт, и я прав |
| «Возможно, я что-то упускаю, но…» | Вы что-то упускаете |
| «Чтобы не уходить в долгую переписку…» | Сейчас начнётся очень долгая переписка |
| «Давайте синхронизируемся голосом» | Я не хочу оставлять следы в переписке |
| «По опыту предыдущих проектов…» | У меня нет аргумента, есть только возраст |
| «Вы абсолютно правы, и при этом…» | Вы неправы |
| «Это хороший вопрос» | Я не знаю ответа |
| «Мы учтём ваши замечания» | Мы не учтём ваши замечания |
Приложение Б
Готовые отмазки на все случаи жизни
Когда спрашивают, почему не было ревью «Ревью было, но в рамках общего архитектурного комитета, решение зафиксировано в
протоколе встречи от [дата две недели назад]».
Когда спрашивают, где протокол «Протокол в процессе согласования, как только будет финализирован — я вам перешлю».
Когда спрашивают через месяц, где протокол «Коллеги, к сожалению, встреча прошла в формате мозгового штурма без формального
протокола. Могу собрать retrospective-саммари, если это ещё актуально».
Когда спрашивают, почему данные не зашифрованы «Данные зашифрованы на уровне транспорта. Шифрование at rest — в роадмапе на следующий
квартал, тикет [номер], приоритет P2».
Когда спрашивают, где тикет [Создать тикет задним числом. Jira не показывает время создания в общем виде.]
Когда спрашивают, почему не был проведён DPIA «DPIA проводился в рамках большей инициативы, в которую входит данный проект.
Результаты доступны у [имя человека, который недавно уволился]».