各プロセスには3つのユーザーIDがあります。
- 実際のユーザーID(
ruid
)。 - 有効なユーザーID(
euid
)。 - 保存されたユーザーID(
suid
)。
同様に、プロセスには3つのグループ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グループ以上にユーザーを追加しない既存の方法に加えて)。