EN JA
SETUID(2)
SETUID(2) Linux Programmer's Manual SETUID(2)

名前

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.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2010-11-22 Linux