vps-forge: агенты с root на VPS получили автооткат, самобаны упали с 7 из 60 до 0
Разработчик выпустил открытый Agent Skill vps-forge для Claude Code, Codex, Cursor и других агентов, которым дали root на VPS. Проблема житейская: в бенчмарке Claude Opus 5.5 без подсказок банил свой же IP через fail2ban в 7 прогонах из 60, отрезая заодно ноутбук владельца. Главная часть навыка — таймер отката vps-forge-deadman. Перед правкой SSH, файрвола, sudo или PAM агент взводит systemd-таймер на 5 минут, и если новый вход не подтверждён, конфиги возвращаются сами. На 120 прогонах оценка выросла с 79–92 до 99–100 из 100. • Прогон стоит $1.87 против $0.62 без навыка • Потерю доступа не показал никто, даже без навыка • Код под MIT, без телеметрии
AI-обработка оригинала Habr AI; редакция Hamidun News
Агент с root на свежем VPS ставит fail2ban, проверяет вход по ключу, пробует пароль и на пятой неудачной попытке банит IP, с которого идут проверки. То есть ваш. Дальше все команды падают по таймауту, а вы ищете веб-консоль в панели хостера. В бенчмарке автора проекта vps-forge Claude Opus 5.5 без подсказок банил сам себя в 7 прогонах из 60. Модель умная, просто ей никто не сказал добавить свой адрес в ignoreip до первого запуска fail2ban.
vps-forge — открытый Agent Skill: набор инструкций и bash-скриптов, которые Claude Code, Codex, Cursor и другие агенты подгружают, когда речь заходит о сервере. Установка: `npx skills add mountain-beaver/vps-forge -g`. Для Claude Code есть плагин, для Claude.ai zip-архив.
Почему «будь осторожен» не работает
Сломанный sshd_config выглядит рабочим. `sshd -t` молчит, reload проходит, текущая сессия жива, а новый вход уже закрыт: например, `AllowUsers deploy` там, где вы admin, или AllowGroups, куда забыли добавить себя.
У агентов своя ловушка. Они держат одно подключение через ControlMaster, и проверка `ssh host true` идёт по старому каналу. Новый sshd и новые правила файрвола она не затрагивает: проверка зелёная, войти нельзя. Инструкция «проверяй вход из нового подключения» не спасает, если агент уже потерял доступ. Нужен механизм, который сработает без него.
Педаль машиниста для sshd
Перед каждой правкой SSH, файрвола, sudo или PAM агент выполняет `vps-forge-deadman arm`. Скрипт снимает снапшот конфигов и заводит systemd-таймер на 5 минут. Агент меняет конфиг, заходит заново через `ssh -o ControlPath=none` и, если вход прошёл, делает disarm. Если нет, делать ничего не нужно: через 5 минут таймер вернёт всё как было.
На бумаге это 20 строк bash, в итоге вышло несколько сотен. Почти за каждой строкой стоит поломка:
- Перезагрузка. Таймер из systemd-run живёт в памяти и пропадает вместе с сервером. Теперь arm включает ещё и юнит, который при загрузке видит состояние «взведено, но не снято» и откатывает сам.
- nftables. Откат останавливал выключенный до arm сервис, а в ExecStop стоит `nft flush ruleset`. Вместе с нужным правилом пропадали ufw, баны fail2ban и цепочки Docker. Теперь удаляются только таблицы из откатываемого конфига.
- Русская локаль ufw. Скрипт искал строку `Status: active`, а ufw пишет «Состояние: активен». Файрвол считался выключенным и при откате отключался. Лечится `LC_ALL=C`.
- Бан после отката. Конфиги вернулись, IP остался в бане. Теперь arm запоминает адрес SSH-клиента, а откат его разбанивает. Под sudo переменной SSH_CLIENT нет, адрес берётся из окружения родительского процесса.
Всё это гоняется в CI: контейнер с настоящим systemd, тест ломает sshd, файрвол и fail2ban, перезагружает контейнер во взведённом состоянии и проверяет восстановление. Файрвол в панели провайдера откатить нельзя, он вне сервера. Там работает только порядок: сначала добавить новое правило, проверить вход, потом убрать старое.
Грабли облачных образов и бенчмарк
Самая коварная — cloud-init. На многих VPS лежит `50-cloud-init.conf` с `PasswordAuthentication yes`. sshd берёт первое прочитанное значение, файлы читаются по алфавиту, так что популярный совет с `99-hardening.conf` не делает ничего. Файл навыка называется `00-vps-forge.conf`, результат проверяется через `sshd -T`. Ещё: в Debian 12 нет auth.log, Docker публикует порты в обход ufw, в образе Oracle Cloud есть своё правило REJECT в iptables, а Coolify ходит на свой хост по SSH под root, и `PermitRootLogin no` ломает деплой.
Стенд: настоящие ВМ в QEMU (Debian 12 и 13, Ubuntu 22.04, 24.04, 26.04), четыре сценария, каждый по три раза без навыка и с ним — 120 прогонов Opus 5.5. Судья проверяет сервер снаружи до и после перезагрузки. Без навыка 79–92 балла из 100, с навыком 99–100.
- ssh-audit без провалов: 4/60 без навыка, 60/60 с ним
- Оповещение о входе по SSH: 16/30 и 30/30
- Файрвол включён: 46/60 и 60/60
- Перебор паролей банится: 50/60 и 60/60
- Root не может войти: 30/60 и 57/60
- Агент забанил сам себя: 7/60 и 0/60
- Потеря доступа: 0/60 и 0/60
Автор честно называет слабые места. Нетронутый сервер получает 25–42 балла. Около 70% разницы дают три проверки, совпадающие с настройками самого навыка: чистый ssh-audit, запрет root и оповещение. Судью и навык писал один человек, а независимый Lynis почти не двигается: 69 и 71, 72 и 72, 64 и 72, 73 и 72. Три сценария из четырёх использовались при доработке навыка. Моделей одна, плюс четыре ручных прогона GLM-5.3. Откат бенчмарк не доказал: доступ не потерял никто, и без навыка тоже.
Цена и как применять
Навык медленнее и примерно втрое дороже: $1.87 против $0.62 за прогон. Настоящий остаток пользы — fail2ban, реально банящий на работающем сервере (6 из 15 без навыка, 15 из 15 с ним), включённый файрвол и ноль самобанов.
Практика такая. Перед первой правкой SSH проверьте, что агент выполнил `vps-forge-deadman arm`: если нет, навык не подгрузился и страховки нет. Скрипт работает и без агента, его можно проверить вручную на ненужном сервере: взвести на минуту, положить `AllowUsers deploy`, убедиться, что вход закрылся, и дождаться статуса ROLLED BACK. Снапшот у провайдера и доступ к консоли всё равно нужны. RHEL пока не поддерживается, Kubernetes-ноды навык не трогает. Код под MIT, без телеметрии, стенд лежит в каталоге bench/ репозитория mountain-beaver/vps-forge.
- 28 окт. 2026 г.Швейцарский Apertus 1.5 получил зрение, слух и контекст в 262 тысячи токенов
- 28 окт. 2026 г.Goodfire: агентный анализ расшифровал нейроны, которые считали хаосом
- 28 окт. 2026 г.aiedit прячет от ИИ-агента отдельные строки кода: 5 уровней и 857 тестов
- 28 окт. 2026 г.OpenAI выпустила GPT-6.1 Terra: вдвое дешевле и вдвое точнее в коде
Вопросы и ответы по материалу
Что известно по теме: почему «будь осторожен» не работает?
Сломанный sshd_config выглядит рабочим. `sshd -t` молчит, reload проходит, текущая сессия жива, а новый вход уже закрыт: например, `AllowUsers deploy` там, где вы admin, или AllowGroups, куда забыли добавить себя. У агентов своя ловушка. Они держат одно подключение через ControlMaster, и проверка `ssh host true` идёт по старому каналу. Новый sshd и новые правила файрвола она не затрагивает: проверка зелёная, войти нельзя. Инструкция «проверяй вход из нового подключения» не спасает, если агент уже потерял доступ. Нужен механизм, который сработает без него.
Что известно по теме: педаль машиниста для sshd?
Перед каждой правкой SSH, файрвола, sudo или PAM агент выполняет `vps-forge-deadman arm`. Скрипт снимает снапшот конфигов и заводит systemd-таймер на 5 минут. Агент меняет конфиг, заходит заново через `ssh -o ControlPath=none` и, если вход прошёл, делает disarm. Если нет, делать ничего не нужно: через 5 минут таймер вернёт всё как было. На бумаге это 20 строк bash, в итоге вышло несколько сотен. Почти за каждой строкой стоит поломка: Перезагрузка. Таймер из systemd-run живёт в памяти и пропадает вместе с сервером. Теперь arm включает ещё и юнит, который при загрузке видит с
Что известно по теме: грабли облачных образов и бенчмарк?
Самая коварная — cloud-init. На многих VPS лежит `50-cloud-init.conf` с `PasswordAuthentication yes`. sshd берёт первое прочитанное значение, файлы читаются по алфавиту, так что популярный совет с `99-hardening.conf` не делает ничего. Файл навыка называется `00-vps-forge.conf`, результат проверяется через `sshd -T`. Ещё: в Debian 12 нет auth.log, Docker публикует порты в обход ufw, в образе Oracle Cloud есть своё правило REJECT в iptables, а Coolify ходит на свой хост по SSH под root, и `PermitRootLogin no` ломает деплой. Стенд: настоящие ВМ в QEMU (Debian 12 и 13, Ubuntu 2
Соберите рабочего ИИ-агента или сервис своими руками без ручного кода
В Академии Жемала Хамидуна (academy.hamidun.com) открыт бесплатный 72-часовой тест-драйв: интерактивные скетч-уроки по Claude Code и Cursor, живой Tech Radar и готовые шаблоны агентов.
Главное из мира ИИ — раз в неделю
7 ключевых событий недели, отобранных вручную. Без шума, репостов и пресс-релизов.
Готово! Проверьте почту — мы отправили подтверждение.