Переключение и отображение пользователя процесса в Linux (на примере Rust)

В Linux у пользователя/группы помимо имени есть ID, которые называются UID и GID соответственно...

Теория

В 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 вы получаете с их помощью.

Переключение пользователя будет не для каждого треда процесса, а для всех тредов процесса.

Переключение возможно только если у вас для этого достаточно прав.