OSDN Git Service

(split) Convert release and draft pages to UTF-8.
[linuxjm/LDP_man-pages.git] / release / man7 / capabilities.7
1 .\" Copyright (c) 2002 by Michael Kerrisk <mtk.manpages@gmail.com>
2 .\"
3 .\" Permission is granted to make and distribute verbatim copies of this
4 .\" manual provided the copyright notice and this permission notice are
5 .\" preserved on all copies.
6 .\"
7 .\" Permission is granted to copy and distribute modified versions of this
8 .\" manual under the conditions for verbatim copying, provided that the
9 .\" entire resulting derived work is distributed under the terms of a
10 .\" permission notice identical to this one.
11 .\"
12 .\" Since the Linux kernel and libraries are constantly changing, this
13 .\" manual page may be incorrect or out-of-date.  The author(s) assume no
14 .\" responsibility for errors or omissions, or for damages resulting from
15 .\" the use of the information contained herein.  The author(s) may not
16 .\" have taken the same level of care in the production of this manual,
17 .\" which is licensed free of charge, as they might when working
18 .\" professionally.
19 .\"
20 .\" Formatted or processed versions of this manual, if unaccompanied by
21 .\" the source, must acknowledge the copyright and authors of this work.
22 .\"
23 .\" 6 Aug 2002 - Initial Creation
24 .\" Modified 2003-05-23, Michael Kerrisk, <mtk.manpages@gmail.com>
25 .\" Modified 2004-05-27, Michael Kerrisk, <mtk.manpages@gmail.com>
26 .\" 2004-12-08, mtk Added O_NOATIME for CAP_FOWNER
27 .\" 2005-08-16, mtk, Added CAP_AUDIT_CONTROL and CAP_AUDIT_WRITE
28 .\" 2008-07-15, Serge Hallyn <serue@us.bbm.com>
29 .\"     Document file capabilities, per-process capability
30 .\"     bounding set, changed semantics for CAP_SETPCAP,
31 .\"     and other changes in 2.6.2[45].
32 .\"     Add CAP_MAC_ADMIN, CAP_MAC_OVERRIDE, CAP_SETFCAP.
33 .\" 2008-07-15, mtk
34 .\"     Add text describing circumstances in which CAP_SETPCAP
35 .\"     (theoretically) permits a thread to change the
36 .\"     capability sets of another thread.
37 .\"     Add section describing rules for programmatically
38 .\"     adjusting thread capability sets.
39 .\"     Describe rationale for capability bounding set.
40 .\"     Document "securebits" flags.
41 .\"     Add text noting that if we set the effective flag for one file
42 .\"     capability, then we must also set the effective flag for all
43 .\"     other capabilities where the permitted or inheritable bit is set.
44 .\"
45 .\" Japanese Version Copyright (c) 2005 Akihiro MOTOKI all rights reserved.
46 .\" Translated 2005-03-09, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
47 .\" Updated 2005-11-04, Akihiro MOTOKI
48 .\" Updated 2006-04-16, Akihiro MOTOKI, LDP v2.29
49 .\" Updated 2006-07-20, Akihiro MOTOKI, LDP v2.34
50 .\" Updated 2007-01-05, Akihiro MOTOKI, LDP v2.43
51 .\" Updated 2008-12-24, Akihiro MOTOKI, LDP v3.15
52 .\" Updated 2009-02-27, Akihiro MOTOKI, LDP v3.19
53 .\" Updated 2010-04-11, Akihiro MOTOKI, LDP v3.24
54 .\"
55 .TH CAPABILITIES 7 2010-06-19 "Linux" "Linux Programmer's Manual"
56 .SH 名前
57 capabilities \- Linux のケーパビリティ (capability) の概要
58 .SH 説明
59 権限のチェックを行う観点から見ると、伝統的な UNIX の実装では
60 プロセスは二つのカテゴリに分類できる:
61 .I 特権
62 プロセス (実効ユーザID が 0 のプロセス。ユーザID 0 は
63 スーパーユーザや root と呼ばれる) と
64 .I 非特権
65 プロセス (実効ユーザID が 0 以外のプロセス) である。
66 非特権プロセスでは、プロセスの資格情報 (通常は、実効UID 、実効GID
67 と追加のグループリスト) に基づく権限チェックが行われるのに対し、
68 特権プロセスでは全てのカーネルの権限チェックがバイパスされる。
69
70 バージョン 2.2 以降の Linux では、
71 これまでスーパーユーザに結び付けられてきた権限を、
72 いくつかのグループに分割している。これらのグループは
73 .IR ケーパビリティ (capability)
74 と呼ばれ、グループ毎に独立に有効、無効を設定できる。
75 ケーパビリティはスレッド単位の属性である。
76 .\"
77 .SS ケーパビリティのリスト
78 以下のリストは、
79 Linux で実装されているケーパビリティと
80 各ケーパビリティが許可する操作と動作をまとめたものである。
81 .TP
82 .BR CAP_AUDIT_CONTROL " (Linux 2.6.11 以降)"
83 カーネル監査 (audit) の有効無効の切り替え、
84 監査のフィルタ・ルールの変更、
85 監査の状況やフィルタ・ルールの取得ができる。
86 .TP
87 .BR CAP_AUDIT_WRITE " (Linux 2.6.11 以降)"
88 カーネル監査のログにレコードを書き込む。
89 .TP
90 .B CAP_CHOWN
91 ファイルの UID とGID を任意に変更する
92 .RB ( chown (2)
93 参照)。
94 .TP
95 .B CAP_DAC_OVERRIDE
96 ファイルの読み出し、書き込み、実行の権限チェックをバイパスする
97 (DAC は "discretionary access control (任意のアクセス制御)" の略である)。
98 .TP
99 .B CAP_DAC_READ_SEARCH
100 ファイルの読み出し権限のチェックとディレクトリの読み出しと実行
101 の権限チェックをバイパスする。
102 .TP
103 .B CAP_FOWNER
104 .PD 0
105 .RS
106 .IP * 2
107 通常、プロセスのファイルシステム UID がファイルの UID に一致することが
108 要求される操作 (例えば
109 .BR chmod (2),
110 .BR utime (2))
111 における権限チェックをバイパスする。
112 但し、
113 .B CAP_DAC_OVERRIDE
114
115 .B CAP_DAC_READ_SEARCH
116 によりチェックが行われる操作は除く。
117 .IP *
118 任意のファイルに対して拡張ファイル属性を設定する
119 .RB ( chattr (1)
120 参照)。
121 .IP *
122 任意のファイルに対してアクセス制御リスト (ACL) を設定する。
123 .IP *
124 ファイルの削除の際にディレクトリのスティッキービットを無視する。
125 .IP *
126 .BR open (2)
127
128 .BR fcntl (2)
129 で任意のファイルに対して
130 .B O_NOATIME
131 を指定する。
132 .RE
133 .PD
134 .TP
135 .B CAP_FSETID
136 ファイルが変更されたときに set-user-ID とset-group-ID の許可ビットをクリア
137 しない。呼び出し元プロセスのファイルシステム GID と追加の GID のいずれとも
138 GID が一致しないファイルに対して set-group-ID ビットを設定する。
139 .TP
140 .B CAP_IPC_LOCK
141 メモリーのロック
142 .RB ( mlock (2),
143 .BR mlockall (2),
144 .BR mmap (2),
145 .BR shmctl (2))
146 を行う。
147 .TP
148 .B CAP_IPC_OWNER
149 System V IPC オブジェクトに対する操作に関して権限チェックをバイパスする。
150 .TP
151 .B CAP_KILL
152 シグナルを送信する際に権限チェックをバイパスする
153 .RB ( kill (2)
154 参照)。これには
155 .BR ioctl (2)
156
157 .B KDSIGACCEPT
158 操作の使用も含まれる。
159 .\" FIXME CAP_KILL also has an effect for threads + setting child
160 .\"       termination signal to other than SIGCHLD: without this
161 .\"       capability, the termination signal reverts to SIGCHLD
162 .\"       if the child does an exec().  What is the rationale
163 .\"       for this?
164 .TP
165 .BR CAP_LEASE " (Linux 2.4 以降)"
166 任意のファイルに対して
167 ファイルリースを設定する
168 .RB ( fcntl (2)
169 参照)。
170 .TP
171 .B CAP_LINUX_IMMUTABLE
172 拡張ファイル属性
173 .B FS_APPEND_FL
174
175 .B FS_IMMUTABLE_FL
176 を設定する
177 .RB ( chattr (1)
178 参照)。
179 .\" これらの属性は ext2, ext3, Reiserfs, XFS, JFS で利用可能である。
180 .TP
181 .BR CAP_MAC_ADMIN " (Linux 2.6.25 以降)"
182 強制アクセス制御 (MAC) を上書きする。
183 Smack Linux Security Module (LSM) 用に実装されている。
184 .TP
185 .BR CAP_MAC_OVERRIDE " (Linux 2.6.25 以降)"
186 MAC の設定や状態を変更する。
187 Smack LSM 用に実装されている。
188 .TP
189 .BR CAP_MKNOD " (Linux 2.4 以降)"
190 (Linux 2.4 以降)
191 .BR mknod (2)
192 を使用してスペシャル・ファイルを作成する。
193 .TP
194 .B CAP_NET_ADMIN
195 各種のネットワーク関連の操作を実行する。
196 (例えば、特権が必要なソケットオプションを設定する、マルチキャストを有効にする、
197 インターフェースを設定する、ルーティングテーブルを変更するなど)
198 .TP
199 .B CAP_NET_BIND_SERVICE
200 インターネットドメインの特権ポート (ポート番号が 1024 番未満)
201 をバインドできる。
202 .TP
203 .B CAP_NET_BROADCAST
204 (未使用) ソケットのブロードキャストと、マルチキャストの待ち受けを行う。
205 .TP
206 .B CAP_NET_RAW
207 RAW ソケットと PACKET ソケットを使用する。
208 .\" また、各種の IP オプションと SO_BINDTODEVICE ソケットオプションを使用できる。
209 .TP
210 .B CAP_SETGID
211 プロセスの GID と追加の GID リストに対する任意の操作を行う。
212 UNIX ドメインソケット経由でソケットの資格情報 (credential) を渡す際に
213 偽の GID を渡すことができる。
214 .TP
215 .BR CAP_SETFCAP " (Linux 2.6.24 以降)"
216 ファイルケーパビリティを設定する。
217 .TP
218 .B CAP_SETPCAP
219 ファイルケーパビリティがサポートされていない場合:
220 呼び出し元が許可されているケーパビリティセットに含まれる任意のケーパビリティを、
221 他のプロセスに付与したり、削除したりできる。
222 (カーネルがファイルケーパビリティをサポートしている場合、
223 .B CAP_SETPCAP
224 はこの役割を持たない。
225 なぜなら、ファイルケーパビリティをサポートしているカーネルでは
226 .B CAP_SETPCAP
227 は全く別の意味を持つからである。)
228
229 ファイルケーパビリティがサポートされている場合:
230 呼び出し元スレッドのバウンディングセットの任意のケーパビリティを
231 自身の継承可能ケーパビリティセットに追加できる。
232 .RB ( prctl (2)
233 .BR PR_CAPBSET_DROP
234 を使って)
235 バウンディングセットからケーパビリティを削除できる。
236 .I securebits
237 フラグを変更できる。
238 .TP
239 .B CAP_SETUID
240 プロセスの UID に対する任意の操作
241 .RB ( setuid (2),
242 .BR setreuid (2),
243 .BR setresuid (2),
244 .BR setfsuid (2))
245 を行う。
246 UNIX ドメインソケット経由でソケットの資格情報 (credential) を渡す際に
247 偽の UID を渡すことができる。
248 .\" FIXME CAP_SETUID also an effect in exec(); document this.
249 .TP
250 .B CAP_SYS_ADMIN
251 .PD 0
252 .RS
253 .IP * 2
254 以下のシステム管理用の操作を実行する:
255 .BR quotactl (2),
256 .BR mount (2),
257 .BR umount (2),
258 .BR swapon (2),
259 .BR swapoff (2),
260 .BR sethostname (2),
261 .BR setdomainname (2).
262 .IP *
263 任意の System V IPC オブジェクトに対する
264 .B IPC_SET
265
266 .B IPC_RMID
267 操作を実行する。
268 .IP *
269 拡張属性
270 .I trusted
271
272 .I security
273 に対する操作を実行する
274 .RB ( attr (5)
275 参照)。
276 .IP *
277 .BR lookup_dcookie (2)
278 を呼び出す。
279 .IP *
280 .BR ioprio_set (2)
281 を使って I/O スケジューリングクラス
282 .BR IOPRIO_CLASS_RT ,
283 .B IOPRIO_CLASS_IDLE
284 を割り当てる
285 .RB ( IOPRIO_CLASS_IDLE
286 は Linux 2.6.25 より前のバージョンのみ)。
287 .IP *
288 ソケットの資格情報 (credential) を渡す際に偽の UID を渡す。
289 .IP *
290 ファイルをオープンするシステムコール (例えば
291 .BR accept (2),
292 .BR execve (2),
293 .BR open (2),
294 .BR pipe (2))
295 でシステム全体でオープンできるファイル数の上限
296 .I /proc/sys/fs/file-max
297 を超過する。
298 .IP *
299 .BR clone (2)
300
301 .BR unshare (2)
302
303 .B CLONE_NEWNS
304 フラグを利用する。
305 .IP *
306 .BR keyctl (2)
307
308 .B KEYCTL_CHOWN
309
310 .B KEYCTL_SETPERM
311 操作を実行する。
312 .IP *
313 .BR madvise (2)
314
315 .B MADV_HWPOISON
316 操作を実行する。
317 .RE
318 .PD
319 .TP
320 .B CAP_SYS_BOOT
321 .BR reboot (2)
322
323 .BR kexec_load (2)
324 を呼び出す。
325 .TP
326 .B CAP_SYS_CHROOT
327 .BR chroot (2).
328 を呼び出す。
329 .TP
330 .B CAP_SYS_MODULE
331 カーネルモジュールのロード、アンロードを行う
332 .RB ( init_module (2)
333
334 .BR delete_module (2)
335 を参照のこと)。
336 バージョン 2.6.25 より前のカーネルで、
337 システム全体のケーパビリティバウンディングセット (capability bounding set)
338 からケーパビリティを外す。
339 .TP
340 .B CAP_SYS_NICE
341 .PD 0
342 .RS
343 .IP * 2
344 プロセスの nice 値の引き上げ
345 .RB ( nice (2),
346 .BR setpriority (2))
347 や、任意のプロセスの nice 値の変更を行う。
348 .IP *
349 呼び出し元プロセスに対するリアルタイム・スケジューリングポリシーと、
350 任意のプロセスに対するスケジューリングポリシーと優先度を設定する
351 .RB ( sched_setscheduler (2),
352 .BR sched_setparam (2))。
353 .IP *
354 任意のプロセスに対する CPU affinity を設定できる
355 .RB ( sched_setaffinity (2))。
356 .IP *
357 任意のプロセスに対して I/O スケジューリングクラスと優先度を設定できる
358 .RB ( ioprio_set (2))。
359 .IP *
360 .BR migrate_pages (2)
361 を任意のプロセスに適用し、プロセスを任意のノードに移動する。
362 .\" FIXME CAP_SYS_NICE also has the following effect for
363 .\" migrate_pages(2):
364 .\"     do_migrate_pages(mm, &old, &new,
365 .\"         capable(CAP_SYS_NICE) ? MPOL_MF_MOVE_ALL : MPOL_MF_MOVE);
366 .IP *
367 .BR move_pages (2)
368 を任意のプロセスに対して行う。
369 .IP *
370 .BR mbind (2)
371
372 .BR move_pages (2)
373
374 .B MPOL_MF_MOVE_ALL
375 フラグを使用する。
376 .RE
377 .PD
378 .TP
379 .B CAP_SYS_PACCT
380 .BR acct (2)
381 を呼び出す。
382 .TP
383 .B CAP_SYS_PTRACE
384 .BR ptrace (2)
385 を使って任意のプロセスをトレースする。
386 任意のプロセスに
387 .BR get_robust_list (2)
388 を適用する。
389 .TP
390 .B CAP_SYS_RAWIO
391 I/O ポート操作を実行する
392 .RB ( iopl (2)
393
394 .BR ioperm (2))。
395 .I /proc/kcore
396 にアクセスできる。
397 .TP
398 .B CAP_SYS_RESOURCE
399 .PD 0
400 .RS
401 .IP * 2
402 ext2 ファイルシステム上の予約されている領域を使用する。
403 .IP *
404 ext3 のジャーナル機能を制御する
405 .BR ioctl (2)
406 を使用する。
407 .IP *
408 ディスク quota の上限を上書きする。
409 .IP *
410 リソース上限を増やす
411 .RB ( setrlimit (2))。
412 .IP *
413 .B RLIMIT_NPROC
414 リソース制限を上書きする。
415 .IP *
416 メッセージキューに関する上限
417 .I msg_qbytes
418
419 .I /proc/sys/kernel/msgmnb
420 に指定されている上限よりも大きく設定する
421 .RB ( msgop (2)
422
423 .BR msgctl (2)
424 参照)。
425 .IP *
426 .I /proc/sys/fs/pipe-max-size
427 に指定されている上限を超えてパイプの容量を増やすのに
428 .B F_SETPIPE_SZ
429 を使用する。
430 .RE
431 .PD
432 .TP
433 .B CAP_SYS_TIME
434 システムクロックを変更する
435 .RB ( settimeofday (2),
436 .BR stime (2),
437 .BR adjtimex (2))。
438 リアルタイム (ハードウェア) クロックを変更する。
439 .TP
440 .B CAP_SYS_TTY_CONFIG
441 .BR vhangup (2)
442 を呼び出す。
443 .\"
444 .SS 過去と現在の実装
445 完全な形のケーパビリティを実装するには、以下の要件を満たす必要がある:
446 .IP 1. 3
447 全ての特権操作について、カーネルはそのスレッドの実効ケーパビリティセットに
448 必要なケーパビリティがあるかを確認する。
449 .IP 2.
450 カーネルで、あるスレッドのケーパビリティセットを変更したり、
451 取得したりできるシステムコールが提供される。
452 .IP 3.
453 ファイルシステムが、実行可能ファイルにケーパビリティを付与でき、ファイル
454 実行時にそのケーパビリティをプロセスが取得できるような機能をサポートする。
455 .PP
456 カーネル 2.6.24 より前では、最初の 2つの要件のみが満たされている。
457 カーネル 2.6.24 以降では、3つの要件すべてが満たされている。
458 .\"
459 .SS スレッドケーパビリティセット
460 各スレッドは以下の 3種類のケーパビリティセットを持つ。各々のケーパビリティセットは
461 上記のケーパビリティの組み合わせである (全てのケーパビリティが無効でもよい)。
462 .TP
463 .IR "許可 (permitted)" :
464 そのスレッドが持つことになっている実効ケーパビリティの
465 限定的なスーパーセットである。
466 これは、実効ケーパビリティセットに
467 .B CAP_SETPCAP
468 ケーパビリティを持っていないスレッドが継承可能ケーパビリティセットに
469 追加可能なケーパビリティの限定的なスーパーセットでもある。
470
471 許可ケーパビリティセットから削除してしまったケーパビリティは、
472 (set-user-ID-root プログラムか、
473 そのケーパビリティをファイルケーパビリティで許可しているプログラムを
474 .BR execve (2)
475 しない限りは) もう一度獲得することはできない。
476 .TP
477 .IR "継承可能 (inheritable)" :
478 .BR execve (2)
479 を前後で保持されるケーパビリティセットである。
480 この仕組みを使うことで、あるプロセスが
481 .BR execve (2)
482 を行う際に新しいプログラムの許可ケーパビリティセットとして
483 割り当てるケーパビリティを指定することができる。
484 .TP
485 .IR "実効 (effective)" :
486 カーネルがスレッドの権限 (permission) をチェックするときに
487 使用するケーパビリティセットである。
488 .PP
489 .BR fork (2)
490 で作成される子プロセスは、親のケーパビリティセットのコピーを継承する。
491 .BR execve (2)
492 中のケーパビリティの扱いについては下記を参照のこと。
493 .PP
494 .BR capset (2)
495 を使うと、プロセスは自分自身のケーパビリティセット
496 を操作することができる (下記参照)。
497 .\"
498 .SS ファイルケーパビリティ
499 カーネル 2.6.24 以降では、
500 .BR setcap (8)
501 を使って実行ファイルにケーパビリティセットを対応付けることができる。
502 ファイルケーパビリティセットは
503 .I "security.capability"
504 という名前の拡張属性に保存される
505 .RB ( setxattr (2)
506 参照)。この拡張属性への書き込みには
507 .B CAP_SETFCAP
508 ケーパビリティが必要である。
509 ファイルケーパビリティセットとスレッドのケーパビリティセットの両方が
510 考慮され、
511 .BR execve (2)
512 後のスレッドのケーパビリティセットが決定される。
513
514 3 つのファイルケーパビリティセットが定義されている。
515 .TP
516 .IR "許可 (Permitted)" " (以前の" "強制 (Forced)" "):"
517 スレッドの継承可能ケーパビリティに関わらず、そのスレッドに自動的に
518 認められるケーパビリティ。
519 .TP
520 .IR "継承可能 (Inheritable)" " (以前の " "許容 (Allowed)" "):"
521 このセットと、スレッドの継承可能ケーパビリティセットとの
522 論理積 (AND) がとられ、
523 .BR execve (2)
524 の後にそのスレッドの許可ケーパビリティセットで有効となる
525 継承可能ケーパビリティが決定される。
526 .TP
527 .IR "実効 (Effective)" :
528 これは集合ではなく、1 ビットの情報である。
529 このビットがセットされていると、
530 .BR execve (2)
531 実行中に、そのスレッドの新しい許可ケーパビリティが全て
532 実効ケーパビリティ集合においてもセットされる。
533 このビットがセットされていない場合、
534 .BR execve (2)
535 後には新しい許可ケーパビリティのどれも新しい実効ケーパビリティ集合
536 にセットされない。
537
538 ファイルの実効ケーパビリティビットを有効にするというのは、
539 .BR execve (2)
540 実行時に、ファイルの許可ケーパビリティと継承ケーパビリティに対応するものが
541 スレッドの許可ケーパビリティセットとしてセットされるが、
542 これが実効ケーパビリティセットにもセットされるということである
543 (ケーパビリティの変換ルールは下記参照)。
544 したがって、ファイルにケーパビリティを割り当てる際
545 .RB ( setcap (8),
546 .BR cap_set_file (3),
547 .BR cap_set_fd (3))、
548 いずれかのケーパビリティに対して実効フラグを有効と指定する場合、
549 許可フラグや継承可能フラグを有効にした他の全てのケーパビリティ
550 についても実効フラグを有効と指定しなければならない。
551 .\"
552 .SS "execve() 中のケーパビリティの変換"
553 .PP
554 .BR execve (2)
555 実行時に、カーネルはプロセスの新しいケーパビリティを次の
556 アルゴリズムを用いて計算する:
557 .in +4n
558 .nf
559
560 P'(permitted) = (P(inheritable) & F(inheritable)) |
561                 (F(permitted) & cap_bset)
562
563 P'(effective) = F(effective) ? P'(permitted) : 0
564
565 P'(inheritable) = P(inheritable)    [つまり、変更されない]
566
567 .fi
568 .in
569 各変数の意味は以下の通り:
570 .RS 4
571 .IP P 10
572 .BR execve (2)
573 前のスレッドのケーパビリティセットの値
574 .IP P'
575 .BR execve (2)
576 後のスレッドのケーパビリティセットの値
577 .IP F
578 ファイルケーパビリティセットの値
579 .IP cap_bset
580 ケーパビリティバウンディングセットの値 (下記参照)
581 .RE
582 .\"
583 .SS ケーパビリティと、ルートによるプログラムの実行
584 .BR execve (2)
585 時に、ケーパビリティセットを使って、全ての権限を持った
586 .I root
587 を実現するには、以下のようにする。
588 .IP 1. 3
589 set-user-ID-root プログラムが実行される場合、
590 またはプロセスの実ユーザ ID が 0 (root) の場合、
591 ファイルの継承可能セットと許可セットを全て 1
592 (全てのケーパビリティが有効) に定義する。
593 .IP 2.
594 set-user-ID-root プログラムが実行される場合、
595 ファイルの実効ケーパビリティビットを 1 (enabled) に定義する。
596 .PP
597 上記のルールにケーパビリティ変換を適用した結果をまとめると、
598 プロセスが set-user-ID-root プログラムを
599 .BR execve (2)
600 する場合、または実効 UID が 0 のプロセスがプログラムを
601 .BR execve (2)
602 する場合、許可と実効のケーパビリティセットの全ケーパビリティ
603 (正確には、ケーパビリティバウンディングセットによるマスクで除外されるもの
604 以外の全てのケーパビリティ) を取得するということである。
605 .\" 実 UID が 0 で実効 UID が 0 以外のプロセスが exec () を行うと、
606 .\" 許可ケーパビリティセットに含まれる全てのケーパビリティ
607 .\" が取得され、実効ケーパビリティは取得されない。
608 これにより、伝統的な UNIX システムと同じ振る舞いができるようになっている。
609 .SS ケーパビリティ・バウンディングセット
610 ケーパビリティ・バウンディングセット (capability bounding set) は、
611 .BR execve (2)
612 時に獲得できるケーパビリティを制限するために使われる
613 セキュリティ機構である。
614 バウンディングセットは以下のように使用される。
615 .IP * 2
616 .BR execve (2)
617 実行時に、ケーパビリティ・バウンディングセットと
618 ファイルの許可ケーパビリティセットの論理和 (AND) を取ったものが、
619 そのスレッドの許可ケーパビリティセットに割り当てられる。
620 つまり、ケーパビリティ・バウンディングセットは、
621 実行ファイルが認めている許可ケーパビリティに対して
622 制限を課す働きをする。
623 .IP *
624 (Linux 2.6.25 以降)
625 ケーパビリティ・バウンディングセットは、スレッドが
626 .BR capset (2)
627 により自身の継承可能セットに追加可能なケーパビリティの母集団を
628 制限する役割を持つ。
629 スレッドに許可されたケーパビリティであっても、バウンディングセットに
630 含まれていなければ、スレッドはそのケーパビリティは自身の継承可能セットに
631 追加できず、その結果、継承可能セットにそのケーパビリティを含むファイルを
632 .BR execve (2)
633 する場合、そのケーパビリティを許可セットに持ち続けることができない、
634 ということである。
635 .PP
636 バウンディングセットがマスクを行うのは、継承可能ケーパビリティではなく、
637 ファイルの許可ケーパビリティのマスクを行う点に注意すること。
638 あるスレッドの継承可能セットにそのスレッドのバウンディングセットに
639 存在しないケーパビリティが含まれている場合、そのスレッドは、
640 継承可能セットに含まれるケーパビリティを持つファイルを実行することにより、
641 許可セットに含まれるケーパビリティも獲得できるということである。
642 .PP
643 カーネルのバージョンにより、ケーパビリティ・バウンディングセットは
644 システム共通の属性の場合と、プロセス単位の属性の場合がある。
645 .PP
646 .B "Linux 2.6.25 より前のケーパビリティ・バウンディングセット"
647 .PP
648 2.6.25 より前のカーネルでは、ケーパビリティ・バウンディングセットは
649 システム共通の属性で、システム上の全てのスレッドに適用される。
650 バウンディングセットは
651 .I /proc/sys/kernel/cap-bound
652 ファイル経由で参照できる。
653 (間違えやすいが、このビットマスク形式のパラメータは、
654 .I /proc/sys/kernel/cap-bound
655 では符号付きの十進数で表現される。)
656
657 .B init
658 プロセスだけがケーパビリティ・バウンディングセットで
659 ケーパビリティをセットすることができる。
660 それ以外では、スーパーユーザ (より正確には、
661 .B CAP_SYS_MODULE
662 ケーパビリティを持ったプログラム) が、
663 ケーパビリティ・バウンディングセットのケーパビリティのクリアが
664 できるだけである。
665
666 通常のシステムでは、ケーパビリティ・バウンディングセットは、
667 .B CAP_SETPCAP
668 が無効になっている。
669 この制限を取り去るには (取り去るのは危険!)、
670 .I include/linux/capability.h
671 内の
672 .B CAP_INIT_EFF_SET
673 の定義を修正し、カーネルを再構築する必要がある。
674
675 システム共通のケーパビリティ・バウンディングセット機能は、
676 カーネル 2.2.11 以降で Linux に追加された。
677 .\"
678 .PP
679 .B "Linux 2.6.25 以降のケーパビリティ・バウンディングセット"
680 .PP
681 Linux 2.6.25 以降では、
682 「ケーパビリティ・バウンディングセット」はスレッド単位の属性である
683 (システム共通のケーパビリティ・バウンディングセットはもはや存在しない)。
684
685 バウンディングセットは
686 .BR fork (2)
687 時にはスレッドの親プロセスから継承され、
688 .BR execve (2)
689 の前後では保持される。
690
691 スレッドが
692 .B CAP_SETPCAP
693 ケーパビリティを持っている場合、そのスレッドは
694 .BR prctl (2)
695
696 .BR PR_CAPBSET_DROP
697 操作を使って自身のケーパビリティ・バウンディングセットから
698 ケーパビリティを削除することができる。
699 いったんケーパビリティをバウンディングセットから削除してしまうと、
700 スレッドはそのケーパビリティを再度セットすることはできない。
701 .BR prctl (2)
702
703 .B PR_CAPBSET_READ
704 操作を使うことで、スレッドがあるケーパビリティが自身のバウンディングセット
705 に含まれているかを知ることができる。
706
707 バウンディングセットからのケーパビリティの削除がサポートされるのは、
708 カーネルのコンパイル時にファイルケーパビリティが有効になっている場合
709 (CONFIG_SECURITY_FILE_CAPABILITIES) だけである。
710 この場合には、 (全てのプロセスの先祖である) 
711 .I init
712 プロセスはバウンディングセットで全てのケーパビリティが
713 セットされた状態で開始する。
714 ファイルケーパビリティが有効になっていない場合には、
715 .I init
716 はバウンディングセットで
717 .B CAP_SETPCAP
718 以外の全てのケーパビリティがセットされた状態で開始する。
719 このようになっているのは、
720 .B CAP_SETPCAP
721 ケーパビリティがファイルケーパビリティがサポートされていない場合には
722 違った意味を持つからである。
723
724 バウンディングセットからケーパビリティを削除しても、
725 スレッドの継承可能セットからはそのケーパビリティは削除されない。
726 しかしながら、バウンディングセットからの削除により、
727 この先そのケーパビリティをスレッドの継承可能セットに追加すること
728 はできなくなる。
729 .\"
730 .\"
731 .SS "ユーザ ID 変更のケーパビリティへの影響"
732 ユーザ ID が 0 と 0 以外の間で変化する際の振る舞いを従来と同じにするため、
733 スレッドの実 UID、実効 UID、保存 set-user-ID、ファイルシステム UID が
734 .RB ( setuid (2),
735 .BR setresuid (2)
736 などを使って) 変更された際に、カーネルはそのスレッドのケーパビリティセットに
737 以下の変更を行う:
738 .IP 1. 3
739 UID の変更前には実 UID、実効 UID、保存 set-user-ID のうち
740 少なくとも一つが 0 で、変更後に実 UID、実効 UID、保存 set-user-ID が
741 すべて 0 以外の値になった場合、許可と実効のケーパビリティセットの
742 全ケーパビリティをクリアする。
743 .IP 2.
744 実効 UID が 0 から 0 以外に変更された場合、
745 実効ケーパビリティセットの全ケーパビリティをクリアする。
746 .IP 3.
747 実効 UID が 0 以外から 0 に変更された場合、
748 許可ケーパビリティセットの内容を実効ケーパビリティセットにコピーする。
749 .IP 4.
750 ファイルシステム UID が 0 から 0 以外に変更された場合
751 .RB ( setfsuid (2)
752 参照)、実効ケーパビリティセットの以下のケーパビリティがクリアされる:
753 .BR CAP_CHOWN ,
754 .BR CAP_DAC_OVERRIDE ,
755 .BR CAP_DAC_READ_SEARCH ,
756 .BR CAP_FOWNER ,
757 .BR CAP_FSETID ,
758 .B CAP_LINUX_IMMUTABLE
759 (Linux 2.2.30 以降),
760 .BR CAP_MAC_OVERRIDE ,
761 .B CAP_MKNOD
762 (Linux 2.2.30 以降)。
763 ファイルシステム UID が 0 以外から 0 に変更された場合、
764 上記のケーパビリティのうち許可ケーパビリティセットで有効になっているものが
765 実効ケーパビリティセットで有効にされる。
766 .PP
767 各種 UID のうち少なくとも一つが 0 であるスレッドが、
768 その UID の全てが 0 以外になったときに許可ケーパビリティセットが
769 クリアされないようにしたい場合には、
770 .BR prctl (2)
771
772 .B PR_SET_KEEPCAPS
773 操作を使えばよい。
774 .\"
775 .SS プログラムでケーパビリティセットを調整する
776 各スレッドは、
777 .BR capget (2)
778
779 .BR capset (2)
780 を使って、自身のケーパビリティセットを取得したり変更したりできる。
781 ただし、これを行うには、
782 .I libcap
783 パッケージで提供されている
784 .BR cap_get_proc (3)
785
786 .BR cap_set_proc (3)
787 を使うのが望ましい。
788 スレッドのケーパビリティセットの変更には以下のルールが適用される。
789 .IP 1. 3
790 呼び出し側が
791 .B CAP_SETPCAP
792 ケーパビリティを持っていない場合、新しい継承可能セットは、
793 既存の継承可能セットと許可セットの積集合 (AND) の部分集合で
794 なければならない。
795 .IP 2.
796 (カーネル 2.6.25 以降)
797 新しい継承可能セットは、既存の継承可能セットとケーパビリティ・
798 バウンディングセットの積集合 (AND) の部分集合でなければならない。
799 .IP 3.
800 新しい許可セットは、既存の許可セットの部分集合でなければならない
801 (つまり、そのスレッドが現在持っていない許可ケーパビリティを
802 獲得することはできない)。
803 .IP 4.
804 新しい実効ケーパビリティセットは新しい許可ケーパビリティセットの
805 部分集合になっていなければならない。
806 .SS securebits フラグ: ケーパビリティだけの環境を構築する
807 .\" For some background:
808 .\"       see http://lwn.net/Articles/280279/ and
809 .\"       http://article.gmane.org/gmane.linux.kernel.lsm/5476/
810 カーネル 2.6.26 以降で、
811 ファイルケーパビリティが有効になったカーネルでは、
812 スレッド単位の
813 .I securebits
814 フラグが実装されており、このフラグを使うと UID 0
815 .RI ( root )
816 に対するケーパビリティの特別扱いを無効することができる。
817 以下のようなフラグがある。
818 .TP
819 .B SECBIT_KEEP_CAPS
820 このフラグをセットされている場合、UID が 0 のスレッドの UID が 0 以外の値に
821 切り替わる際に、そのスレッドはケーパビリティを維持することができる。
822 このフラグがセットされていない場合には、UID が 0 から 0 以外の値に
823 切り替わると、そのスレッドは全てのケーパビリティを失う。
824 このフラグは
825 .BR execve (2)
826 時には全てクリアされる
827 (このフラグは、以前の
828 .BR prctl (2)
829
830 .B PR_SET_KEEPCAPS
831 操作と同じ機能を提供するものである)。
832 .TP
833 .B SECBIT_NO_SETUID_FIXUP
834 このフラグをセットすると、スレッドの実効 UID とファイルシステム UID が
835 0 と 0 以外の間で切り替わった場合に、
836 カーネルはケーパビリティセットの調整を行わなくなる
837 (「ユーザ ID 変更のケーパビリティへの影響」の節を参照)。
838 .TP
839 .B SECBIT_NOROOT
840 このビットがセットされている場合、
841 set-user-ID-root プログラムの実行時や、
842 実効 UID か 実 UID が 0 のプロセスが
843 .BR execve (2)
844 を呼び出した時に、カーネルはケーパビリティを許可しない
845 (「ケーパビリティと、ルートによるプログラムの実行」の節を参照)。
846 .PP
847 上記の "base" フラグの各々には対応する "locked" フラグが存在する。
848 いずれの "locked" フラグも一度セットされると戻すことはできず、
849 それ以降は対応する "base" フラグを変更することができなくなる。
850 "locked" フラグは
851 .BR SECBIT_KEEP_CAPS_LOCKED ,
852 .BR SECBIT_NO_SETUID_FIXUP_LOCKED ,
853 .BR SECBIT_NOROOT_LOCKED
854 という名前である。
855 .PP
856 .I securebits
857 フラグは、
858 .BR prctl (2)
859 の操作
860 .B PR_SET_SECUREBITS
861
862 .B PR_GET_SECUREBITS
863 を使うことで変更したり取得したりできる。
864 フラグを変更するには
865 .B CAP_SETPCAP
866 ケーパビリティが必要である。
867
868 .I securebits
869 フラグは子プロセスに継承される。
870 .BR execve (2)
871 においては、
872 .B SECURE_KEEP_CAPS
873 が常にクリアされる以外は、全てのフラグが保持される。
874
875 アプリケーションは、以下の呼び出しを行うことにより、
876 自分自身および子孫となるプロセス全てに対して、
877 必要なファイルケーパビリティを持ったプログラムを実行しない限り、
878 対応するケーパビリティを獲得できないような状況に閉じこめることができる。
879 .in +4n
880 .nf
881
882 prctl(PR_SET_SECUREBITS,
883         SECBIT_KEEP_CAPS_LOCKED |
884         SECBIT_NO_SETUID_FIXUP |
885         SECBIT_NO_SETUID_FIXUP_LOCKED |
886         SECBIT_NOROOT |
887         SECBIT_NOROOT_LOCKED);
888 .fi
889 .in
890 .SH 準拠
891 .PP
892 ケーパビリティに関する標準はないが、 Linux のケーパビリティは廃案になった
893 POSIX.1e 草案に基づいて実装されている。
894 .I http://wt.xpilot.org/publications/posix.1e/
895 を参照。
896 .SH 注意
897 カーネル 2.5.27 以降、ケーパビリティは選択式のカーネルコンポーネント
898 となっており、カーネル設定オプション CONFIG_SECURITY_CAPABILITIES
899 により有効/無効を切り替えることができる。
900
901 .I /proc/PID/task/TID/status
902 ファイルを使うと、スレッドのケーパビリティセットを見ることができる。
903 .I /proc/PID/status
904 ファイルには、プロセスのメインスレッドのケーパビリティセットが表示される。
905
906 .I libcap
907 パッケージは、ケーパビリティを設定・取得するための
908 ルーチン群を提供している。これらのインタフェースは、
909 .BR capset (2)
910
911 .BR capget (2)
912 が提供するインターフェースと比べて、より使いやすく、変更される可能性が少ない。
913 このパッケージでは、
914 .BR setcap (8),
915 .BR getcap (8)
916 というプログラムも提供されている。
917 パッケージは
918 .I http://www.kernel.org/pub/linux/libs/security/linux-privs
919 で入手できる。
920
921 バージョン 2.6.24 より前、およびファイルケーパビリティが
922 有効になっていない2.6.24 以降のカーネルでは、
923 .B CAP_SETPCAP
924 ケーパビリティを持ったスレッドは自分以外のスレッドの
925 ケーパビリティを操作できる。
926 しかしながら、これは理論的に可能というだけである。
927 以下のいずれかの場合においても、どのスレッドも
928 .BR CAP_SETPCAP
929 ケーパビリティを持つことはないからである。
930 .IP * 2
931 2.6.25 より前の実装では、システム共通のケーパビリティ・バウンディングセット
932 .I /proc/sys/kernel/cap-bound
933 ではこのケーパビリティは常に無効になっており、
934 ソースを変更してカーネルを再コンパイルしない限り、
935 これを変更することはできない。
936 .IP *
937 現在の実装ではファイルケーパビリティが無効になっている場合、
938 プロセス毎のバウンディングセットからこのケーパビリティを抜いて
939 .B init
940 は開始され、
941 システム上で生成される他の全てのプロセスでこのバウンディングセットが
942 継承される。
943 .SH 関連項目
944 .BR capget (2),
945 .BR prctl (2),
946 .BR setfsuid (2),
947 .BR cap_clear (3),
948 .BR cap_copy_ext (3),
949 .BR cap_from_text (3),
950 .BR cap_get_file (3),
951 .BR cap_get_proc (3),
952 .BR cap_init (3),
953 .BR capgetp (3),
954 .BR capsetp (3),
955 .BR credentials (7),
956 .BR pthreads (7),
957 .BR getcap (8),
958 .BR setcap (8)
959 .PP
960 カーネルソース内の
961 .I include/linux/capability.h