Maran

19 сентября 2026

Почему агент не принимает shell-команд

Одно проектное решение, определившее в Maran всё остальное — корневой демон принимает типизированные операции и ни одной shell-строки — и его цена.

У любой панели управления одна и та же форма: то, на что человек нажимает, и то, что с правами root делает работу. Интересный вопрос — что между ними передаётся.

Обычный ответ — командная строка. Её быстрее всего собрать и труднее всего удержать в безопасности, потому что каждое значение, которым управляет клиент — домен, имя базы, путь к файлу, — в конце концов попадает в строку, которую разберёт оболочка. Сделать это правильно один раз легко. Сделать правильно везде, навсегда, пока панель растёт, — вот с чем никто не справляется.

Что мы делаем вместо этого

Корневой демон Maran принимает именованные операции с типизированными и проверенными аргументами — и ничего больше. Нет операции, принимающей команду для запуска. Домен не экранируется перед попаданием в конфигурационный файл: он проверяется как домен, то есть буквы, цифры, дефисы и точки, — и в нём неоткуда взяться переводу строки, который завершит одну директиву и начнёт другую.

Практический эффект в том, что множество вещей, которые можно заставить сделать демон, конечно, записано и поддаётся ревью. Операцию, которой нет в контракте, невозможно запросить — какой бы изобретательной ни была просьба.

Во что это обходится

Каждая новая возможность становится изменением контракта, а не новой строкой. Это медленнее, и намеренно: добавить операцию — значит решить, какие у неё аргументы, что считается допустимым и что происходит, когда хост не согласен, — до того, как что-либо поедет.

Это же исключает целый класс возможностей, которые панель могла бы предложить: «выполни за меня вот эту команду». Мы считаем это правильным разменом для софта, который держит root на сервере, где живут чужие клиенты.