setuid - ユーザー識別 (identity)
を設定する
#include <sys/types.h>
#include <unistd.h>
int setuid(uid_t uid);
setuid()
は呼び出し元のプロセスの実効
(effective) ユーザー ID
を設定する。
もし呼び出し元プロセスの実効
UID が root ならば、 実 (real) UID
と保存 (saved) set-user-ID
も設定される。
Linux では、
setuid() は
_POSIX_SAVED_IDS
をもった POSIX
版のように実装されている。
これは (ルート以外の)
set-user-ID
プログラムにそのユーザーの特権を
全て与え、特権の必要ない仕事をし、本来の実効ユーザー
ID に
安全な方法で再び戻すことを許す。
ユーザーが root
またはプログラムが root
に set-user-ID
されているならば、
特別の注意が払われる。
setuid()
関数は呼び出し者の実効ユーザー
ID をチェックし、
それがスーパーユーザーならば、
プロセスに関連する全てのユーザー
ID に
uid を設定する。
これが行なわれた後にはプログラムが再びルートの特権を得ることはできない。
したがって、set-user-ID-root
プログラムで、一時的にルート特権を解除し、
非特権ユーザであるかのように振舞い、後でルート権限をもう一度得ようと
する場合には、
setuid()
を使うことができない。その場合には、
seteuid(2)
を使う必要がある。
返り値¶
成功した場合は 0
が返される。エラーの場合は
-1 が返され、
errno
が適切に設定される。
エラー¶
- EAGAIN
- uid
が現在のユーザー ID
とマッチせず、この
uid
によってプロセスがリソース上限
RLIMIT_NPROC を超えた。
- EPERM
- ユーザーが特権を持たず
(Linux では CAP_SETUID
ケーパビリティ (capability)
を持たず)、 uid
が呼び出し元プロセスの実
UID または保存 set-user-ID
と一致しない。
SVr4, POSIX.1-2001. 4.4BSD
のコールとは完全な互換性はない、
BSD のコールは実
(real)、保存 (saved)、実効 (effective) ID
の全てを設定する。
Linux
はファイルシステム・ユーザー
ID の概念を持つ。
通常、これは実効ユーザー
ID に等しい。
setuid()
コールは呼び出し元のプロセスの
ファイルシステム・ユーザー
ID も設定する。
setfsuid(2)
も参照すること。
uid が前の実効 UID
と異っていた場合、
プロセスはコアダンプすることを禁止される。
元々の Linux の
setuid()
システムコールは 16
ビットのグループ ID
だけに対応していた。
その後、Linux 2.4 で、32
ビットの ID に対応した
setuid32() が追加された。
glibc の
setuid()
のラッパー関数は
カーネルバージョンによるこの違いを吸収している。
関連項目¶
getuid(2),
seteuid(2),
setfsuid(2),
setreuid(2),
capabilities(7),
credentials(7)
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.41 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。