Идентификатор setfs(u/g) или идентификатор id (u / g) с помощью eventlet(зеленый поток python)
У нас есть существующий проект с использованием модуля Eventlet.
Есть сервер, обрабатывающий клиентский запрос с использованием зеленых потоков. Все запросы обрабатываются одним пользователем "Пользователь А".
Теперь мне нужно изменить это, чтобы сделать setfsuid / setfsgid для потоков, чтобы все базовые файлы создавались только с правами запрашивающего пользователя.
Я понимаю, что мне нужна возможность setid Linux, чтобы делать вызовы setfsid.
Но будут ли вызовы setfsid работать с зелеными потоками так же, как с родными?
Прочитав различные тексты в сети о "зеленых нитях", я не мог собрать много:(
2 ответа
Все зеленые потоки выполняются из одного потока ОС. Для ядра это выглядит так, как будто вся ваша программа на Python имеет только один поток.
Если вам нужны отдельные идентификаторы файловой системы для каждого запроса, запустите отдельный поток ОС, позвоните setfsuid()
в нем и выполнить необходимые вызовы файловой системы в нем.
threading = eventlet.patcher.original('threading')
Ядро не знает зеленых нитей. Если у процесса есть uid и gid, он используется всеми зелеными потоками, работающими как часть этого процесса.
На первый взгляд, то, что вы хотите сделать, эквивалентно тому, чтобы привилегированный процесс выполнил setuid перед открытием / созданием файла, чем второй setuid, чтобы открыть / создать второй файл и т. Д., Чтобы убедиться, что каждый файл имеет право собственности. Я никогда не пробовал такую схему, но она звучит очень, очень неправильно. Это также очень плохо с точки зрения безопасности. Вы работаете с высокими привилегиями и можете обрабатывать данные пользователя X, имея пользовательский UID.
На второй взгляд, зеленые нити работают совместно, что означает, что под капотами некоторые операции, которые вы делаете, будут приносить плоды. После такого выхода вы можете перейти на другой зеленый поток, который снова изменит uid...
Итог, забудьте о смене uid и gid зеленой нити - такого нет. Создайте файл с любым идентификатором, который у вас есть, и добавьте правильный идентификатор после. В целях безопасности найдите способ сделать это без запуска от имени пользователя root.