Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top