Изменить UID / GID только одного потока в Linux
Вопрос
Есть ли способ изменить 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 () синхронизирует ее для всех потоков (используя сингал, который отправляет всем потокам)!