각 프로세스에는 세 개의 사용자 ID가 있습니다.
- 실제 사용자 ID(
ruid
). - 유효 사용자 ID(
euid
). - 저장된 사용자 ID(
suid
)입니다.
마찬가지로 프로세스에는 세 가지 그룹 ID도 있습니다.
- 실제 그룹 ID(
rgid
). - 유효 그룹 ID(
egid
). - 저장된 그룹 ID(
sgid
).
제가 이해한 바에 따르면, euid
파일에 액세스하면 해당 파일을 파일 소유자와 일치시키는 데 사용됩니다.
하지만 파일 그룹과 일치시키기 위해 파일에 액세스할 때도 사용되는지는 잘 모르겠습니다 egid
. egid
그렇다면 각 사용자가 여러 그룹에 속할 수 있으므로 프로세스당 유효한 그룹 ID가 많아야 하지 않나요?
답변1
하나 있습니다 egid
. 하지만! 적어도 BSDlandia에는(그리고 Linux에 의해 복사되었습니다. SysV가 여기서 무엇을 하고 있는지 잘 모르겠습니다)setgroups(2)
부르다
DESCRIPTION
setgroups() sets the group access list of the current user process
according to the array gidset. The parameter ngroups indicates the
number of entries in the array and must be no more than {NGROUPS_MAX}.
Only the superuser may set new groups.
getgroups(2)
목록을 검색합니다 .
일부 프로그램은 주목할 가치가 있습니다줄이다httpd
OpenBSD의 목록 과 같은 보충 그룹 목록src/usr.sbin/httpd/proc.c
if (setgroups(1, &pw->pw_gid) ||
setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) ||
setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid))
fatal("%s: cannot drop privileges", __func__);
이러한 보충 그룹을 기대했다면 이는 놀라운 일이 될 수 있습니다.
NGROUPS_MAX
특히 NFS와 많은 그룹의 사람들과 관련된 또 다른 흥미로운 제한 사항입니다. 하지만 현재는 이 문제를 해결할 수 있는 몇 가지 방법이 있습니다(일반적인 16개 그룹 이상에 사용자를 추가하지 않는 기존 방법 외에).