Пользователь – 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 и таким образом тебя "залогинит".