
Переключение и отображение пользователя процесса в Linux (на примере Rust)
Теория
В Linux у пользователя/группы помимо имени есть ID, которые называются UID и GID соответственно.
С точки зрения системы они делятся на Real ID и Effective ID и Saved ID.
Real ID - это id фактического пользователя/группы который запустил процесс.
Effective ID - это id под которым в данный момент выполняются операции в процессе (операционная система видит вас как этого пользователя).
Saved ID - когда понижаем привилегии.
Работать будем с первыми двумя.
Пояснение/пример
Вы запустили Rust-программу как пользователь user (uid=1000), и в процессе выполнения сделали seteuid(0) (поменяли effective id): real id = 1000, effective id = 0 (root).
Вы запустили rust программу как пользователь user (uid=1000), и в процессе выполнения сделали setuid(0) (поменяли real id): real id = 0, effective id = 0 (root).
Практика
В Rust нам понадобится крейт libc.
Изменение пользователя или группы процесса
unsafe { libc::setuid() }; // Real ID
unsafe { libc::seteuid() }; // Effective ID
unsafe { libc::setgid() }; // Real ID
unsafe { libc::setegid() }; // Effective ID
Получение данных о пользователе и группе
let uid = unsafe { libc::getuid() }; // Real ID
let euid = unsafe { libc::geteuid() }; // Effective ID
let gid = unsafe { libc::getgid() }; // Real ID
let egid = unsafe { libc::getegid() }; // Effective ID
Важно
Если вы используете сторонние библиотеки, убедитесь какой именно вид UID/GID вы получаете с их помощью.
Переключение пользователя будет не для каждого треда процесса, а для всех тредов процесса.
Переключение возможно только если у вас для этого достаточно прав.