[{"data":1,"prerenderedAt":63},["ShallowReactive",2],{"i-lucide:search":3,"i-lucide:sun":8,"i-lucide:menu":10,"blog-index-ru":12},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m21 21l-4.34-4.34\"/>\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"/>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"/>",[13],{"id":14,"title":15,"author":16,"body":17,"date":54,"description":55,"extension":56,"meta":57,"navigation":58,"path":59,"seo":60,"seoTitle":15,"stem":61,"__hash__":62},"blogRu/ru/blog/introducing-maran.md","Почему агент не принимает shell-команд","Innovayse",{"type":18,"value":19,"toc":48},"minimark",[20,24,27,32,35,38,42,45],[21,22,23],"p",{},"У любой панели управления одна и та же форма: то, на что человек нажимает, и то, что с правами root\nделает работу. Интересный вопрос — что между ними передаётся.",[21,25,26],{},"Обычный ответ — командная строка. Её быстрее всего собрать и труднее всего удержать в безопасности,\nпотому что каждое значение, которым управляет клиент — домен, имя базы, путь к файлу, — в конце\nконцов попадает в строку, которую разберёт оболочка. Сделать это правильно один раз легко. Сделать\nправильно везде, навсегда, пока панель растёт, — вот с чем никто не справляется.",[28,29,31],"h2",{"id":30},"что-мы-делаем-вместо-этого","Что мы делаем вместо этого",[21,33,34],{},"Корневой демон Maran принимает именованные операции с типизированными и проверенными аргументами — и\nничего больше. Нет операции, принимающей команду для запуска. Домен не экранируется перед попаданием\nв конфигурационный файл: он проверяется как домен, то есть буквы, цифры, дефисы и точки, — и в нём\nнеоткуда взяться переводу строки, который завершит одну директиву и начнёт другую.",[21,36,37],{},"Практический эффект в том, что множество вещей, которые можно заставить сделать демон, конечно,\nзаписано и поддаётся ревью. Операцию, которой нет в контракте, невозможно запросить — какой бы\nизобретательной ни была просьба.",[28,39,41],{"id":40},"во-что-это-обходится","Во что это обходится",[21,43,44],{},"Каждая новая возможность становится изменением контракта, а не новой строкой. Это медленнее, и\nнамеренно: добавить операцию — значит решить, какие у неё аргументы, что считается допустимым и что\nпроисходит, когда хост не согласен, — до того, как что-либо поедет.",[21,46,47],{},"Это же исключает целый класс возможностей, которые панель могла бы предложить: «выполни за меня вот\nэту команду». Мы считаем это правильным разменом для софта, который держит root на сервере, где живут\nчужие клиенты.",{"title":49,"searchDepth":50,"depth":50,"links":51},"",2,[52,53],{"id":30,"depth":50,"text":31},{"id":40,"depth":50,"text":41},"2026-09-19","Одно проектное решение, определившее в Maran всё остальное — корневой демон принимает типизированные операции и ни одной shell-строки — и его цена.","md",{},true,"/ru/blog/introducing-maran",{"title":15,"description":55},"ru/blog/introducing-maran","6R9W_eYBgxwLAZ8p8N04mdkFhT0hDRbAEBdpeJ3O1oE",1790166389929]