Месяц назад я провалил аудит. Не в смысле "меня взломали" — в смысле я потратил три дня на ручной просмотр конфигов и логов, написал отчёт на двадцать страниц, а потом коллега за десять минут нашёл в том же репозитории захардкоженный токен, который я проглядел. Токен лежал в файле с говорящим названием config.example.js. Мне было стыдно.
После этого я начал разбираться: можно ли перевести хотя бы часть этой работы на ИИ? Не "полностью автоматизировать безопасность" — это маркетинговая чушь. А конкретно: что именно можно делегировать, чтобы я перестал пропускать очевидное.
Где ИИ реально помогает, а где нет
Сначала я пошёл не туда. Попробовал скормить GPT-4 весь репозиторий разом и попросить "найди уязвимости". Получил пять экранов общих рассуждений об OWASP Top 10 и ноль конкретики. Классика — попросил слишком широко.
Дело в том, что ИИ плохо работает как оракул ("скажи мне всё плохое"). Зато хорошо работает как рецензент, которому даёшь конкретный кусок с конкретным вопросом. Разница примерно как между "покритикуй мой код" и "вот эта функция принимает пользовательский ввод и передаёт его в SQL-запрос — что может пойти не так". На второй вопрос ответ всегда лучше.
Я выделил три зоны, где ИИ реально сэкономил мне время.
Просмотр кода на типовые паттерны
Самая очевидная задача — и она работает. Я прогоняю через Claude куски кода, которые работают с вводом пользователя, с файловой системой, с SQL. Не весь файл, а именно эти фрагменты. Прошу конкретно: "Найди места, где данные от пользователя попадают в запрос без санитизации" или "Есть ли здесь потенциальный path traversal".
За последние два месяца так нашёл четыре реальных проблемы — не критических, но неприятных. Инъекцию в старом скрипте экспорта, два места с незакрытыми файловыми дескрипторами и одну функцию, которая доверяла заголовку X-Forwarded-For без проверки. Каждый раз я потратил минут пять, а не полчаса ручного чтения.
Одна оговорка: я не верю ИИ на слово. Он иногда видит уязвимости там, где их нет — особенно в незнакомом фреймворке. Но это нормально. Ложноположительные срабатывания дешевле ложноотрицательных.
Анализ конфигураций и зависимостей
Вот где я сэкономил больше всего. Конфиги — это скучно. Nginx, Dockerfile, IAM-политики в JSON на триста строк — я их читаю по диагонали и пропускаю детали. ИИ не устаёт.
Я теперь делаю так: беру docker-compose.yml, скармливаю в Claude с вопросом "какие здесь потенциальные проблемы с безопасностью в контексте продакшн-окружения". В последний раз он сразу указал на три вещи: контейнер с базой данных торчал на 0.0.0.0, переменные окружения с паролями прокидывались через environment: напрямую вместо secrets, и healthcheck использовал полный URL с кредами в логируемой строке. Всё это я знал теоретически — но конкретно в этом файле не заметил.
С зависимостями похожая история. npm audit и pip-audit дают список CVE, но не объясняют контекст. Я стал скидывать эти отчёты в ИИ с вопросом "какие из этих уязвимостей реально опасны для веб-приложения с такой-то архитектурой". Это экономит час на расстановку приоритетов.
Разбор инцидентов и странных логов
Это для меня было открытием. Я не думал, что ИИ поможет с логами, пока не попробовал.
У нас был странный паттерн в access-логах nginx: несколько IP делали запросы с одинаковым user-agent, интервал между запросами ровно 30 секунд, но пути разные и непредсказуемые. Я час пытался понять — краулер? Сканер? Что-то ещё?
Скинул 200 строк логов в Claude с вопросом "что это может быть и на что обратить внимание". Ответ был неожиданно точным: он указал, что паттерн похож на распределённый перебор эндпоинтов с ротацией путей, и предложил проверить — не совпадают ли эти пути со swagger-документацией. Совпадали. Кто-то парсил наш публичный Swagger и методично щупал каждый эндпоинт на авторизацию.
Я бы до этого дошёл сам. Но не за час — скорее за три.
Что я собрал в итоге
Схема простая, без магии. Bash-скрипт перед каждым деплоем прогоняет через semgrep основные правила — быстро и детерминировано. Результаты semgrep и вывод npm audit автоматически уходят в промпт к Claude через API с контекстом проекта. Claude расставляет приоритеты и пишет короткий summary: что срочно, что можно отложить, что скорее всего false positive. Занимает две минуты и стоит копейки.
Раз в неделю я отдельно смотрю новые PR вручную — но уже с пониманием, что базовое автоматика покрыла. Это меняет психологию: я не пытаюсь поймать всё сам, я проверяю то, что автоматика пропустить не могла.
Что не автоматизируется
Архитектурные решения. Логика авторизации — когда пользователь А не должен видеть данные пользователя Б. Цепочки вызовов через несколько сервисов. Social engineering и человеческий фактор.
ИИ не понимает бизнес-контекст. Он не знает, что вот эта функция с eval существует намеренно, потому что там legacy и это изолировано. Что этот эндпоинт без авторизации — так задумано, это публичный API. Без контекста он будет сигналить на вещи, которые ты уже знаешь и принял.
На практике это не недостаток — это просто граница. Я трачу время на то, что требует понимания системы. ИИ — на то, что требует внимательности и знания паттернов. Честное разделение труда.
Токен в config.example.js я бы сейчас не пропустил — это ровно тот тип проверки, который теперь делается автоматически. Немного обидно, что понадобился конфуз, чтобы до этого дойти.
