groups – наш пользователь и человек, и пароход, и wheel
Оригинал https://t.me/bits_and_bicycles/17
Я говорил, что gid у процесса очень похож на uid. Но на самом деле не совсем похож.
gid - такой же произвольный uint32, как и uid. Только uid у твоего процесса один, а gid'ов может быть много. Много групп groups, к которым у процесса есть доступ, и одна активная, собственно, gid.
Увидеть это можно запустив обычный id:
❯ id uid=1000(flapenguin) gid=1001(flapenguin) groups=1001(flapenguin),998(docker)
Но зачем?
Нужна возможность как-то получить процесс, который может и cron настраивать и docker запускать. Т.е. с доступом в разграниченные части fs. И именно groups дают тебе такие права. У процесса таких может быть аж 65536 (2^16).
У отдельного gid'а задача более прозаичная. Он нужен как дефолт для операций типа open(..., O_CREAT) и clone.
И то и другое наследуется при создании процесса. И то и другое может менять только владелец capability CAP_SETGID через setgid и setgroups.
Именно поэтому после добавления себя в группу тебе надо перелогиниться. Перелогинивает тебя сессионный менеджер, у которого этот самый CAP_SETGID есть. Будь то systemd-loging или sshd.
Кстати, в #POSIX'е есть setuid-утилита newgrp, которая за тебя ~перелогинит~ся насоздаёт лишних процессов. Не рекомендую.
$ ps -ft PID TTY STAT TIME COMMAND 1638690 pts/0 Ss 0:00 -bash 1638804 pts/0 S 0:00 _ newgrp 1638805 pts/0 S 0:00 _ bash 1638815 pts/0 S 0:00 _ newgrp 1638816 pts/0 S 0:00 _ bash 1638829 pts/0 R+ 0:00 _ ps -ft