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