Ядро Линукс
Управление пользователями
Что это такое:
- В ядре Linux информация о пользователе и его правах хранится в структуре struct cred.
- Эта структура «прикрепляется» к процессам и определяет, от имени какого пользователя и группы работает процесс, и какие у него права доступа.
Зачем это нужно:
- Ядро проверяет cred при любом обращении процесса к ресурсам: файлам, сокетам, устройствам и т.д.
- Если у процесса нет нужных прав (например, он запущен от обычного пользователя, а не root), ядро отказывает в доступе.
- Значения именно из этой структуры возвращаются системными вызовами `getuid()`, `geteuid()`, `getgid()` и `getegid()`
Пример структуры struct cred:
struct cred {
kuid_t uid; /* реальный UID процесса */
kgid_t gid; /* реальный GID процесса */
kuid_t suid; /* сохранённый UID (для setuid-программ) */
kgid_t sgid; /* сохранённый GID */
kuid_t euid; /* эффективный UID (именно он используется при проверках доступа) */
kgid_t egid; /* эффективный GID */
struct user_struct *user; /* ссылка на структуру user_struct с информацией о пользователе */
};
Объяснение ключевых полей:
- uid/gid – реальные UID/GID, под которыми процесс изначально создан.
- suid/sgid – сохранённые UID/GID, нужны для временной смены прав (например, в `setuid` бинарных файлов).
- euid/egid – эффективные UID/GID, именно они определяют фактические права процесса при доступе к ресурсам.
- user_struct *user – хранит дополнительную информацию о пользователе (например, сколько процессов он может создать, какие лимиты установлены).
Итог:
struct cred = «паспорт процесса».
Она говорит ядру: «Я процесс X, запущен пользователем Y из группы Z, у меня такие-то права».
1 минута
19 июня