setfsgid -
ファイルシステムのチェックに用いられるグループ
ID を設定する
#include <sys/fsuid.h>
int setfsgid(uid_t fsgid);
システムコール
setfsgid()
は、
呼び出し元のファイルシステムグループ
ID —
ファイルシステムへの全てのアクセスのチェックにおいて
Linux
カーネルが使用するグループ
ID —
の値を変更する。通常はファイルシステムグループ
ID の値は実効 (effective)
グループ ID
と同じになる。実際、
実効グループ ID
が変更される度にファイルシステムグループ
ID
もまた新しい実効グループ
ID の値に変更される。
通常、
setfsuid() や
setfsgid()
を明示的に呼び出すのは、Linux
NFS サーバー のように、
ファイルアクセスに用いるユーザID
/ グループID
を変更しなければならないが、
対応する実(real)/実効(effective)
ユーザID / グループID
は変更したくないような
プログラムに限られる。
NFS
サーバーのようなプログラムで、通常のユーザID
を変更すると、
プロセスを望まないシグナルにさらす可能性があり、
セキュリティホールになる。(下記参照)
setfsgid()
は、スーパーユーザによって呼び出された場合か、
fsgid
が呼び出し元の実グループID、実効グループID、
保存セットグループID
(saved
set-group-ID)、現在のファイルシステムグループ
ID
の値のいずれかに一致する場合にのみ成功する。
返り値¶
成功時も失敗時も、
この呼び出しは直前の呼び出し元のファイルシステムグループ
ID の値を返す。
バージョン¶
このシステムコールはバージョン
1.2 以降の Linux
に存在する。
setfsgid() は Linux
特有であり、移植を想定したプログラムで使用してはいけない。
glibc が引き数がグループID
として不正だと判断した場合は、
システムコールを行わず
errno に
EINVAL を設定して
-1 が返される。
このシステムコールが導入された当時、プロセスは
同じ実効ユーザIDのプロセスへシグナルを送ることができた。
今日では、シグナル送信権限の扱いはかなり違うものになっている。
なぜ今日では
setfsuid(2) と
setfsgid()
の両者が不要なのかの議論については
setfsuid(2) を参照のこと。
元々の Linux の
setfsgid()
システムコールは 16
ビットのグループ ID
だけに対応していた。
その後、Linux 2.4 で、32
ビットの ID に対応した
setfsgid32() が追加された。
glibc の
setfsgid()
のラッパー関数は
カーネルバージョンによるこの違いを吸収している。
いかなる種類のエラーメッセージも返さず、
成功した場合も失敗した場合も呼び出しは同じ値を返すため、
呼び出しが成功したか失敗したかを直接判定することはできない。
その代わり、 直前の
setfsgid()
の呼び出しがファイルシステムグループ
ID
を変更したかどうかを判定するために、
呼び出し元はこの後に
setfsgid(-1)
などを呼び出して返り値を見なければならない
(
setfsgid(-1)
は常に失敗する)。
最低でも、失敗した場合は
EPERM
くらいは返すべきである
(呼び出し元には
CAP_SETGID
ケーパビリティがなかったのだから)。
関連項目¶
kill(2),
setfsuid(2),
capabilities(7),
credentials(7)
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.65 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。