flapenguin.me

Пользователь – user-space конструкт

Оригинал https://t.me/bits_and_bicycles/5

Давай начнём с чего-нибудь лайтового в #linux'е, например, с айдишников пользователей, uid'ов.

Ты, скорее всего, привык, что у пользователя есть логин и пароль. И что вообще есть такая сущность как "пользователь", у которой уже есть айдишник. Но на самом деле нет никаких пользователей, это ~социальный~ user-space конструкт.

У каждого процесса есть аттрибут-чиселка uid, его можно получить через getuid(2) и поменять через setuid(2) (но только у процесса там уже 0 aka root или есть другая чиселка в #capabilities). (А ещё его можно подсмотреть через #procfs, про него потом.)

Аналогично есть аттрибут-чиселка guid.

Когда ты создаёшь новый дочерний процесс через clone, он наследует эти чиселки. Это значит, что они копируются в него один раз при создании, больше процесс-родитель на них повлиять на них никак не может.

У файла есть свои чиселки. Когда процесс пытается обратиться к файлу, ядро сверяет чиселки процесса и чиселки файла.

В первом приближении – всё. (Ещё есть effective uid/gid, это примерно то же самое, но немного другое.)

То, что пользователи хранятся в страшном текстовом формате в /etc/passwd, совершенно никак не волнует ядро. Твой systemd/upsttart/sysv-init (которые полностью user-space) прочитает /etc/passwd, вызовет setuid и таким образом тебя "залогинит".