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