Все статьи

White Rabbit — read‑only‑аудитор серверов в Claude Code

7 мин чтения
Security AI Claude Code

У меня есть боевой сервер и несколько проектов в разработке, и всё это надо периодически проверять: как настроен SSH, что торчит наружу, кто уже стучится в логи, в каких установленных пакетах есть известные CVE. Обычный сканер в ответ выдаёт список из сотен «уязвимостей» без приоритета — и ты сам сидишь и решаешь, что из этого реально опасно, а что шум. Мне хотелось не сканер, а второго пилота, который скажет: «эти три чини сегодня, остальное — потом, и вот почему». Так появился White Rabbit.

Имя — из «follow the white rabbit»: идти по следу того, что спрятано в логах и конфигах.

Что это

White Rabbit — плагин для Claude Code. Не отдельный бинарник, а набор плейбуков, справочников, коллекторов и гвардрейлов, который превращает сессию Claude в аудитора твоей инфраструктуры. Работаешь через одну команду /wr с маршрутизацией по доменам:

  • /wr server — проверка SSH, фаервола, открытых портов, привилегированных учётных записей, механизмов закрепления и настроек Docker.
  • /wr logs — разбор SSH/auth-логов: брутфорс, перебор пользователей, успешные входы с адресов, которые до этого брутфорсили.
  • /wr web — HTTP access-логи nginx и Caddy: обращения к чувствительным файлам, сканеры, брутфорс форм логина, пейлоады в путях запросов.
  • /wr cve — проверка пакетов ОС по базе OSV.dev с приоритизацией по CISA KEV и EPSS.
  • /wr all — всё сразу плюс кросс-корреляция и дельта против прошлого прогона, одной отсортированной лентой находок.

Ключевое слово — оркестратор, а не сканер. Свои движки White Rabbit не изобретает: данные собираются нативными командами, а вся ценность — в том, как эти данные интерпретируются и приоритизируются.

Zero-install

На аудируемый сервер не ставится ничего. Claude ходит по SSH и снимает картину штатными утилитами целевой системы: ss для портов, journalctl для логов, dpkg или rpm для пакетов, чтение конфигов и доступная команда управления фаерволом. Один коллектор за один заход собирает весь дамп состояния:

ssh user@host 'bash -s' < scripts/collect/server_snapshot.sh

Это быстрее и воспроизводимее, чем тридцать отдельных команд, а сами коллекторы содержат только операции чтения — дополнительное ограничение уже на уровне конструкции. Потоковое ограничение в коллекторе веб-логов (по умолчанию 200 тысяч строк) появилось после того, как access-лог из 1,3 миллиона запросов оборвал SSH-сессию, — если вход был сокращён, отчёт отмечает это явно. Секреты при этом не читаются: коллектор снимает эффективный SSH-конфиг, но не ключевой материал; хеши из shadow и содержимое ключей не печатаются никогда, фиксируется только факт их наличия.

Read-only

Вот к чему я вёл. Дать модели SSH к боевому серверу и надеяться, что она не выполнит изменяющую состояние команду, — это не безопасность, а оптимизм. Модель может ошибиться, неправильно понять задачу или выполнить то, что выглядит безобидно, но на деле меняет хост. Поэтому read-only в White Rabbit — не пожелание в промпте, а PreToolUse-хук, который перехватывает каждую Bash-команду до выполнения и блокирует всё, что не проходит проверку. Ограничение обеспечивает исполняемый контур, а не добрая воля модели.

Первое свойство хука — он fail-closed. Не может распарсить ввод — блокирует. Нет jq — блокирует. Пропали файлы политики — блокирует.

# Нет jq — безопасно распарсить ввод нечем, поэтому блокируем (read-only).
if ! command -v jq >/dev/null 2>&1; then
  echo "White Rabbit guard: jq not found — failing closed (read-only)." >&2
  exit 2
fi

Дальше команда проходит три проверки: не совпадает ли она с запрещённым шаблоном изменения (rm, chmod, kill, sed -i, apt install, iptables -F и ещё около семидесяти паттернов), нет ли перенаправления вывода в файл и находится ли первый бинарник каждого сегмента пайпа в списке разрешённых read-only-команд. Не прошла хотя бы одну проверку — блокируется.

Отдельно решён неочевидный вектор. Свои анализаторы White Rabbit (коррелятор, CVE-сканер) запускаются локально, и их надо пропускать — но разрешать по имени файла опасно: злоумышленник положит свой correlate.sh в подконтрольную папку и получит исполнение. Поэтому они разрешены только по каноническому пути внутри плагина, а не по имени файла. Одноимённый скрипт в другом месте проверку не проходит и блокируется по общим правилам.

Оговорюсь честно: сама идея read-only-аудита своей инфраструктуры не нова — так работают Lynis и множество сканеров уязвимостей. Отличие здесь в том, что запрет изменений обеспечивается на уровне исполняемого контура агента, а не только дисциплиной промпта. Это существенно снижает риск случайного изменения хоста, хотя и не превращает механизм в формально доказанную песочницу.

Расширение через markdown

Инструмент устроен так, чтобы его возможности можно было расширять почти без кода. Каждый домен аудита — это скилл-методичка в skills/: что проверять, какими командами собирать данные, как их интерпретировать и оценивать критичность. Рядом лежат справочники в knowledge/: каталоги проверок и общая шкала оценки, на которую ссылаются плейбуки. Детерминированный сбор и корреляция вынесены в небольшие shell-скрипты, а рассуждение поверх дампа делает Claude по правилам из методички.

Чтобы добавить новую проверку, обычно достаточно дополнить плейбук и справочник. Например, знание «опубликованный Docker-порт обходит ufw» — это семь строк markdown в knowledge/checks/docker.md: что искать в выводе docker ps, с какими секциями дампа сопоставить, почему это опасно и как чинить. Мозг инструмента — Claude Code; White Rabbit даёт ему методики и детерминированные инструменты сбора.

Приоритизация

Это главный дифференциатор, ради которого всё затевалось. Сырой список находок бесполезен без ответа на вопрос «что из этого реально эксплуатируется». Несколько примеров, как White Rabbit это решает.

CVE приоритизируются не по одному только CVSS, а с учётом CISA KEV (уязвимость уже эксплуатируется) и EPSS (вероятность эксплуатации). В отчёт попадают только находки, которые уже можно исправить, — те, для которых выпущена исправленная версия. Нерелевантную для конкретного окружения уязвимость можно подавить с помощью VEX, указав обоснование.

Опубликованный порт Docker сопоставляется с фаерволом: контейнер может быть доступен снаружи, даже если ufw показывает статус active, — Docker добавляет собственные правила, и трафик не всегда проходит через цепочку INPUT. Оператор верит, что порт закрыт, а он открыт всему интернету, — такой случай инструмент отмечает явно.

Атакующие IP сопоставляются между поверхностями: если один адрес и перебирал пароли SSH, и сканировал веб-приложение, его приоритет повышается. Успешный SSH-вход с адреса, который до этого атаковал веб, — уже критический признак возможной компрометации, а не просто строчка в списке. Плюс дельта относительно прошлого прогона: каждая находка помечается [NEW], [UNCHANGED] или [RESOLVED], так что видно не только состояние, но и то, что изменилось.

Границы применимости

Слой, который отделяет «эти три чини сегодня» от шума, — это рассуждение самого Claude поверх собранных данных. И тут надо быть честным: этот слой недетерминирован. Коллекторы, корреляторы и сопоставление CVE закрыты поведенческими тестами — сейчас их 271, они запускаются на деревьях тестовых данных и с подменёнными утилитами, без живого хоста, — и за их вывод я отвечаю; качество триажа зависит от модели, а её вердикт — рекомендация, не приговор. Содержимое логов и конфигов при этом — потенциально враждебные данные: внутри лога может оказаться строка, притворяющаяся инструкцией для модели, и относиться к ней надо соответственно.

И про зрелость без прикрас. Это версия 0.1.0 от одного автора. Готово ядро: аудит сервера, логов и веб-трафика, проверка CVE пакетов ОС, кросс-корреляция и HTML-отчёт. В планах, но ещё не сделаны аудит кода (SAST и поиск секретов), анализ CVE зависимостей приложения с учётом достижимости уязвимого кода, обогащение данных об атакующих IP, проверки TLS и сертификатов, доставка отчёта в Slack и запуск по расписанию. White Rabbit не заменяет ни SIEM вроде Wazuh, ни платформенную защиту хостинга и не претендует на это.

Нишу он закрывает узкую, но для меня реальную: прийти к своему серверу через Claude Code, за один прогон получить приоритизированную картину и не изменить состояние хоста — команды, не прошедшие read-only-проверку, блокируются до выполнения. Если вам нужна постоянная защита, это задача для других инструментов. А если нужен разовый white-box-аудит своей машины с понятным приоритетом находок — это ровно та задача, под которую White Rabbit сделан.

Репозиторий: github.com/IvanShishkin/white-rabbit