Есть ли какой-нибудь простой способ ограничить системные вызовы Python (os.system
, subprocess
, ...) определенной папкой / деревом?
Возможный вариант использования: общий веб-сервер,где пользователи / студенты могут загружать свои приложения, т. е. Bottle, для запуска через wsgi / uwsgi и nginx или около того.
Для упрощения настройки все веб-приложения работают под одним и тем же системным пользователем (т. е. www-data
) ихранить свои данные в /var/www/webapp_name
.
Но что, если какой-нибудь «умный» пользователь включит в свое приложение какую-то функцию, которая попытается сделать системный вызов для чтения или изменения чего-либо в другом месте системы?
Возможным решением может быть создание отдельных пользователей системы для каждого веб-приложения и ужесточение разрешений. Но они все еще могут нанести много потенциального ущерба. И это будет означать некоторые дополнительные издержки конфигурации по сравнению с простыми веб-пользователями без системных привилегий.
Если virtualenv каким-то образом разрешит что-то вроде
os.system('ls ./')
, но заблокирует что-то вроде
os.system('ls /')
или
os.system('rm -rf ../another_webapp')
это может быть действительно полезно.
Это, вероятно, может быть сделано с помощью чего-то вроде SELinux или Apparmor, но было бы чище иметь чистый питонический раствор.