Перейти к основному содержимому

0003 — Узлы cTrader CLI это HTTP + JWT, нет SSH/shell

Контекст​

Контейнеры бэктеста/запуска выполняются на удаленных хостах. Очевидный подход — SSH in и run docker — дает основному приложению произвольное удаленное выполнение кода и долгоживущие учетные данные на каждом узле. Это большой радиус взрыва для системы, которая запускает untrusted пользовательские cBots.

Решение​

Каждый удаленный хост запускает standalone CtraderCliNode HTTP agent с нет SSH и нет shell. Основное приложение вызывает агента по HTTP; каждый запрос несет короткожилый HS256 JWT (5-минутный, iss=app-main / aud=app-node) подписанный секретом этого узла. Агент:

  • запускает только образы, совпадающие с AllowedImagePrefix (с границей пути, так что ghcr.io/spotware не может совпадать с ghcr.io/spotware-evil/...);
  • выполняет docker через ArgumentList — никогда string оболочки;
  • является stateless, находя контейнеры по ярлыку app.instance;
  • самостоятельно регистрирует и heartbeats к POST /api/nodes/register; основное приложение upserts CtraderCliNode по имени, поэтому узел выживает изменения IP.

Последствия​

  • Пропущенный токен запроса истекает в минуты; нет постоянного shell учетных данных для кражи.
  • Возможность агента ограничена на «запуск разрешенного образа» — он не может быть превращена в общую удаленную shell.
  • Идентичность узла name-based, поэтому переподготовка узла с новым IP не сиротствует его историю.