1 .\" written by Andrew Morgan <morgan@kernel.org>
2 .\" may be distributed as per GPL
3 .\" Modified by David A. Wheeler <dwheeler@ida.org>
4 .\" Modified 2004-05-27, mtk
5 .\" Modified 2004-06-21, aeb
6 .\" Modified 2008-04-28, morgan of kernel.org
7 .\" Update in line with addition of file capabilities and
8 .\" 64-bit capability sets in kernel 2.6.2[45].
9 .\" Modified 2009-01-26, andi kleen
11 .\" Japanese Version Copyright (c) 1999 HANATAKA Shinya
12 .\" all rights reserved.
13 .\" Translated 1999-12-26, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
14 .\" Updated & Modified 2005-02-03, Yuichi SATO <ysato444@yahoo.co.jp>
15 .\" Updated & Modified 2006-01-31, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
16 .\" Updated & Modified 2006-07-23, Akihiro MOTOKI, LDP v2.36
17 .\" Updated & Modified 2008-08-11, Akihiro MOTOKI, LDP v3.05
18 .\" Updated 2009-02-24, Akihiro MOTOKI, LDP v3.19
20 .\"WORD: capability ケーパビリティ
21 .\"WORD: effective capability 実効ケーパビリティ
22 .\"WORD: inheritable capabilit 継承可能ケーパビリティ
23 .\"WORD: permitted capabily 許可ケーパビリティ
25 .TH CAPGET 2 2010-09-20 "Linux" "Linux Programmer's Manual"
27 capget, capset \- スレッドのケーパビリティを設定/取得する
29 .B #include <sys/capability.h>
31 .BI "int capget(cap_user_header_t " hdrp ", cap_user_data_t " datap );
33 .BI "int capset(cap_user_header_t " hdrp ", const cap_user_data_t " datap );
35 Linux 2.2 で、スーパーユーザー (root) の権限は、個別のケーパビリティ
36 (capabilities) へと分割され、その集合として表現されるようになった。
37 各スレッドは「実効ケーパビリティ (effective capability) の集合」を持ち、
38 それによって現在どの操作が実行可能かを識別できる。
40 「継承可能ケーパビリティ (inheritable capability) の集合」と
41 「許可ケーパビリティ (permitted capability) の集合」を持つ。
44 を通じて渡すことができるケーパビリティの集合であり、
45 「許可ケーパビリティ (permitted capability) の集合」は
46 実効ケーパビリティや継承可能ケーパビリティとして有効にできる
49 この二つの関数はスレッドのケーパビリティを取得したり設定したりするための
51 これらのシステムコールは Linux 特有であるというだけでなく、
52 カーネル API は変更されるかもしれず、これらの
55 型という書式) はカーネルのリビジョン毎に拡張されるかもしれないが、
63 可能ならばアプリケーションはこれらの関数を使用すべきである。
64 アプリケーションに Linux 拡張を使用したい場合には、より簡単に
71 現在のカーネルの詳細について注意を述べておく。
76 #define _LINUX_CAPABILITY_VERSION_1 0x19980330
77 #define _LINUX_CAPABILITY_U32S_1 1
79 #define _LINUX_CAPABILITY_VERSION_2 0x20071026
80 #define _LINUX_CAPABILITY_U32S_2 2
82 typedef struct __user_cap_header_struct {
87 typedef struct __user_cap_data_struct {
95 .I effective, permitted, inheritable
98 で定義されるケーパビリティのビットマスクである。
103 の値の分だけビットシフトを行う必要がある。
105 このシステムコールに渡す構造体を定義するには、
106 .I struct __user_cap_header_struct
108 .I struct __user_cap_data_struct
111 カーネル 2.6.25 より前では、バージョン
112 .B _LINUX_CAPABILITY_VERSION_1
113 の 32 ビットケーパビリティが推奨である。
114 カーネル 2.6.25 以降では、バージョン
115 .B _LINUX_CAPABILITY_VERSION_2
116 の 64 ビットケーパビリティが推奨である。
126 これらのシステムコールの挙動に影響があるもう一つの変更点は、
127 ファイルケーパビリティ (file capabilities) のカーネルによるサポート
128 (VFS ケーパビリティのサポート) である。
129 VFS ケーパビリティのサポートは現在のところコンパイル時のオプションである
130 (カーネル 2.6.24 で追加された)。
135 のフィールド値にケーパビリティを知りたいプロセスのプロセス ID を
136 指定することで、任意のプロセスのケーパビリティを調べることができる。
137 .SS VFS ケーパビリティがサポートされている場合
138 VFS ケーパビリティのサポートでは、特権実行ファイルにケーパビリティを
139 追加するためのファイル属性メソッドが作成された。
140 この特権モデルの導入により、あるプロセスにより別のプロセスのケーパビリティ
141 を非同期に設定する機能のカーネルによるサポートは廃止される。
148 が返す値だけとなる (どちらの値でも等価である)。
149 .SS VFS ケーパビリティがサポートされていない場合
150 カーネルが VFS ケーパビリティをサポートしていない場合、
158 で指定されたスレッドのケーパビリティになる。
160 が 0 の場合は呼び出し元のスレッドのケーパビリティが操作対象となる。
162 がシングルスレッド・プロセスを参照している場合、
164 は以前から使われているプロセスID を使って指定できる。
165 マルチスレッド・プロセス内のあるスレッドを対象にする場合は、
167 が返すスレッドID を用いて指定する必要がある。
170 では \-1 や \-1 より小さな値を指定することもできる。
173 を除く全てのスレッドを対象として変更を行うことを、
174 \-1 より小さな値は ID が \-\fIpid\fP のプロセスグループの全メンバ
181 成功した場合には 0 を返す。エラーの場合には \-1 を返し、
188 にサポートされていない値が指定された場合、
194 .B _LINUX_CAPABILITY_VERSION_?
196 このようにして、現在の推奨ケーパビリティ・リビジョンが何かを
205 に NULL を指定してよいのは、ユーザがカーネルがサポートしている
206 推奨のケーパビリティ・バージョンを判定しようとしているときだけである。
212 「許可ケーパビリティセット」にケーパビリティを追加しようとしているか、
213 もしくは「許可ケーパビリティセット」に含まれないケーパビリティを
214 「実効ケーパビリティセット」や「継承可能ケーパビリティセット」に
218 呼び出し元が自分以外のスレッドのケーパビリティを
220 を使って修正しようとしたが、十分な特権がなかった。
221 VFS ケーパビリティをサポートしているカーネルでは、
223 VFS ケーパビリティをサポートしていないカーネルでは、
226 (バージョン 2.6.11 より前のカーネルには、
229 フィールドに 0 でない値 (つまり、0 の代わりに
231 が返す値) を指定して自分自身のケーパビリティを変更しようとした場合にも、
232 このエラーが発生するというバグがあった。)
237 これらのシステムコールは Linux 独自である。
239 ケーパビリティを設定したり取得したりする機能のための移植性ある
245 http://www.kernel.org/pub/linux/libs/security/linux-privs