![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.44.146] |
![]() |
|
![]() |
Сообщ.
#1
,
|
|
Здравствуйте, коллеги! У меня вопрос:
Сделать Web-сайт. В браузере вводить текст программы на Python и нажимать кнопку <Выполнить>. Программа должна выполниться на сервере в отдельном Docker-контейнере. Причем надо запретить все файловые операции в этой программе (import os). Результат выполнения программы надо возвращать в браузер. Может вы мне подскажете как это сделать? Как запрещать в контейнерах докер операции с файловой с-мой? |
Сообщ.
#2
,
|
|
|
Цитата доктор Рагин @ Как запрещать в контейнерах докер операции с файловой с-мой? докер контейнер, это такая приблуда, позволяющая выполнять другие программы внутри изолированного окружения. Другими словами, докер-контейнер, это маленькая виртуальная линукс система с очень ограниченными(только то, что нужно для работы приложения), возможностями. Т.е. все что произойдет в нем плохого, пострадает только сама докер машина. Т.е. ее можно будет в случае чего снести и заного поставить, если все правильно настроить, то займет это время примерно столько же, сколько на установку обычной программы. В твоем случае, нужно поднять докер, развернуть там питон, и сделать ее видимой наружу(например через реверс прокси, у того же nginx есть такая возможность). Все. Сделат веб интерфейс, который например при нажатии на кнопку "Создать новый скрипт" ну или при открытии веб интерфейса - будет генерировать уникальное имя файла(тем же питоном это можно сделать), сохранять его на диск, дальше когда пользователь напишет скрипт в окне браузера, я бы просто тем же питоном для начала фильтровал этот файл/или даже сам скрипт(например на наличие слова os или import os) обычной регуляркой, затем если ничего такого не найдено - выполнял бы скрипт и выдавал его результат обратно. Еще можно почитать доку по самому питону, возможно там есть встроенные средства выполнения, которые отключают модуль os при интепретации скрипта. Добавлено Вот тут в холиварах я создавал тему про докер контейнеры, там есть некоторые интересные ссылки, которые можно почитать и ознакомиться как с ним работать -> DockerContainer vs остальное По первой ссылке в первом же посте, есть хорошая статья на хабре для ознакомления с тем что такое докер контейнер и как с ним работать, ну и советовал бы остальные тоже просмотреть, возможно что то интересное встретится. Если разрабатываешь под Linux'ом - то там докер уже встроенный, единственное для удобного деплоя я бы еще обязательно установил docker-compose, по умолчанию он не установлен в Linux'е, он здорово упрощает создание докер образа и его деплой. По сути оди нраз написал, а дальше инсталяция проходит в 1 клик. Без docker-compose придется либо руками настраивать постоянно ну и деплоить - путем написания длинных строчек для команды ( в зависимости от настроек ), ну либо писать опять же скрипт на чем то другом. Добавлено Цитата Wound @ Сделат веб интерфейс, который например при нажатии на кнопку "Создать новый скрипт" ну или при открытии веб интерфейса - будет генерировать уникальное имя файла(тем же питоном это можно сделать), сохранять его на диск, дальше когда пользователь напишет скрипт в окне браузера, я бы просто тем же питоном для начала фильтровал этот файл/или даже сам скрипт(например на наличие слова os или import os) затем если ничего такого не найдено - выполнял бы скрипт и выдавал его результат обратно. Еще можно почитать доку по самому питону, возможно там есть встроенные средства выполнения, которые отключают модуль os при интепретации скрипта. Ну либо еще можно запретить модифицировать файлы в определенной папке, но разрешить им выполняться. Это можно сделать на уровне докер образа(т.к. это по сути изолированная система Linux). Делается это командой chmod например на папке, которая является рутовым каталогом для твоего веб сайта. В твоем случае это будет наверное что то типа: ![]() ![]() chmod -R 755 my_web_python_catalog Цитата 755 (-rwxr-xr-x) Каждый пользователь имеет право читать и запускать на выполнение; владелец может редактировать Добавлено С помощью chown можно установить владельца. например там: ![]() ![]() chown DoctorRagin my_web_python_catalog Добавлено А, еще - сделать запрет модификации каталога на уровне файловой системы докер образа, и дать права только на чтение и выполнение(с помощью chmod), можно либо при сборке докер образа(там можно создавать любые каталоги и давать им сразу права, можно заранее сделать структуру каталогов и выдать права), либо прямо после деплоя зайти на докер образ и внутри выставить ему необходимые права на каталог. Но тогда не будет возможности сохранять скрипты ![]() Добавлено Если не знаешь с чего начать, то я бы на твоем месте начал бы со следующего: 1) Сначала бы на локальную машину поставил бы питон. 2) Сделал примитивный сайт-страницу с полем для ввода и кнопкой выполнить. 3) Серверной части сайта передавал написанный в поле ввода скрипт питону(например с помощью ajax посылать контроллеру, либо прям на питоне и писать, посмотреть в сторону шаблонизаторов каких то или там микрофреймворков, тот же Flask на питоне взять, раз у тебя уже питон идет с системой), и возвращал бы результат в браузер. 4) Когда эта часть будет закончена, у тебя получится веб-сайт со своим окружением. Вот потом его просто запихиваешь в докер образ, делаешь его видным извне, далее проверяешь что все работает в докер образе. 5) Потом уже экспериментируешь как тебе ограничить возможность работы с файловой системой через питон. Это либо регулярка на питоне, либо задание прав утилитой chmod на каталоге. chmod - проще и быстрее, регулярка гибче, и имеет больше возможностей. В принципе если так подумать, тут работы на день. |
![]() |
Сообщ.
#3
,
|
|
спасибо!
|
Сообщ.
#4
,
|
|
|
Пожалуйста. Если что то не будет понятно, пиши. В принципе я с этим работал, но довольно давно - около года, двух назад, детали не помню, но общую картину представляю.
|