Изменить UID / GID только одного потока в Linux - PullRequest
6 голосов
/ 03 августа 2009

Есть ли способ изменить UID / GID только одного потока в многопоточном процессе?

Причиной этого является написание приложения для обслуживания файлов - списки ACL и квота не применяются, если uid / gid вызывающего абонента не настроен на правильного пользователя, новые файлы / каталоги не создаются с правильным uid / gid и т. Д. .

Сетевые приложения обычно могут выполнять fork () в начале и обрабатывать каждый запрос пользователя в отдельном процессе. Если есть необходимость в общих данных, они должны проходить через какую-то общую память. Однако, например, FUSE (пользовательская файловая система Linux) по умолчанию использует многопоточность, и в сочетании с привязками Python было бы непрактично пытаться использовать модель разветвления.

Похоже, что «согласованный» UID для всего процесса соответствует стандарту POSIX, однако старые Linux не следовали POSIX и допускали разные идентификаторы для разных потоков. Кажется, что новые ядра следуют POSIX, есть ли способ разрешить старое «сломанное» поведение?

Ответы [ 2 ]

7 голосов
/ 04 августа 2009

Специфичные для Linux setfsuid() / setfsgid() для каждого потока, а не для процесса. Они разработаны специально для этого варианта использования (файловый сервер).

Обратите внимание, что access() по-прежнему будет проверять доступ, используя реальные uid и gid - то есть по замыслу (он предназначен для ответа на вопрос "должен ли пользователь, запустивший этот двоичный файл, получить доступ к этому файлу") ). В случае setfsuid() / setfsgid() вы должны просто попробовать запрошенную операцию и обнаружить сбой из-за отсутствия разрешения на этом этапе.

6 голосов
/ 19 сентября 2014

Чтобы изменить uid только для одного потока, вам нужно использовать системный вызов напрямую: syscall (SYS_setresuid, ...); Функция libc setresuid () синхронизирует ее для всех потоков (используя сингал, который отправляет всем потокам)!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...