1 |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
2 |
<html lang="ja-JP"> |
3 |
<head> |
4 |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
5 |
<meta http-equiv="Content-Style-Type" content="text/css"> |
6 |
<title>TOMOYO Linux ポリシー解説書</title> |
7 |
<link rel="stylesheet" href="http://tomoyo.sourceforge.jp/tomoyo.css" media="all" type="text/css"> |
8 |
</head> |
9 |
<body> |
10 |
<p style="text-align:right;"><a href="policy-reference.html.en">English Page</a></p> |
11 |
<p style="text-align:right;">Last modified: $Date$</p> |
12 |
<h1 style="text-align:center;">TOMOYO Linux ポリシー解説書</h1> |
13 |
<h1><a name="index">目次</a></h1> |
14 |
<h2>1. <a href="#Keyword_Index">キーワード一覧</a></h2> |
15 |
<h2>2. <a href="#Common_Rules">はじめに</a></h2> |
16 |
<p>2.1 <a href="#word_expression_rules">単語の表記規則</a></p> |
17 |
<p>2.2 <a href="#wildcard_expression_rules">パターンの表記規則</a></p> |
18 |
<p>2.3 <a href="#memory_usage_infomation">メモリ使用量に関する情報</a></p> |
19 |
<h2>3. <a href="#Policy_Files">ポリシーファイルに関して</a></h2> |
20 |
<p>3.1 <a href="#policy_file_locations">所在について</a></p> |
21 |
<p>3.2 <a href="#policy_file_modifiers">変更について</a></p> |
22 |
<h2>4. <a href="#Domain_Rules">ドメインに関して</a></h2> |
23 |
<p>4.1 <a href="#domain_definition">ドメインとは</a></p> |
24 |
<p>4.2 <a href="#domain_transition">ドメイン遷移とは</a></p> |
25 |
<p>4.3 <a href="#access_logs">アクセスログについて</a></p> |
26 |
<h2>5. <a href="#Syntax_Details">キーワード詳細</a></h2> |
27 |
<h2>6. <a href="#Advanced_Features">便利な機能</a></h2> |
28 |
<p>6.1 <a href="#non_root_policy_update">root 以外のユーザによるポリシーの変更を許可</a></p> |
29 |
<p>6.2 <a href="#conditional_acl">条件付きアクセス許可の指定</a></p> |
30 |
<p>6.3 <a href="#transit_on_match">アクセスを許可するのと同時にドメイン遷移を行う</a></p> |
31 |
<p>6.4 <a href="#sleep_penalty">ポリシー違反時のペナルティ指定</a></p> |
32 |
<p>6.5 <a href="#auto_execute_handler">プログラムの実行可否をカーネルの外部で判断</a></p> |
33 |
<p>6.6 <a href="#denied_execute_handler">許可されていないプログラムの実行が要求された場合の代替処理指定</a></p> |
34 |
<hr> |
35 |
|
36 |
<h1>1. <a name="Keyword_Index">キーワード一覧</a></h1> |
37 |
|
38 |
<p>/proc/ccs/profile および /etc/ccs/profile.conf で使われるもの</p> |
39 |
|
40 |
<ul> |
41 |
<li><a href="#profile_CONFIG::file::execute">CONFIG::file::execute</a></li> |
42 |
<li><a href="#profile_CONFIG::file::open">CONFIG::file::open</a></li> |
43 |
<li><a href="#profile_CONFIG::file::create">CONFIG::file::create</a></li> |
44 |
<li><a href="#profile_CONFIG::file::unlink">CONFIG::file::unlink</a></li> |
45 |
<li><a href="#profile_CONFIG::file::mkdir">CONFIG::file::mkdir</a></li> |
46 |
<li><a href="#profile_CONFIG::file::rmdir">CONFIG::file::rmdir</a></li> |
47 |
<li><a href="#profile_CONFIG::file::mkfifo">CONFIG::file::mkfifo</a></li> |
48 |
<li><a href="#profile_CONFIG::file::mksock">CONFIG::file::mksock</a></li> |
49 |
<li><a href="#profile_CONFIG::file::truncate">CONFIG::file::truncate</a></li> |
50 |
<li><a href="#profile_CONFIG::file::symlink">CONFIG::file::symlink</a></li> |
51 |
<li><a href="#profile_CONFIG::file::rewrite">CONFIG::file::rewrite</a></li> |
52 |
<li><a href="#profile_CONFIG::file::mkblock">CONFIG::file::mkblock</a></li> |
53 |
<li><a href="#profile_CONFIG::file::mkchar">CONFIG::file::mkchar</a></li> |
54 |
<li><a href="#profile_CONFIG::file::link">CONFIG::file::link</a></li> |
55 |
<li><a href="#profile_CONFIG::file::rename">CONFIG::file::rename</a></li> |
56 |
<li><a href="#profile_CONFIG::file::chmod">CONFIG::file::chmod</a></li> |
57 |
<li><a href="#profile_CONFIG::file::chown">CONFIG::file::chown</a></li> |
58 |
<li><a href="#profile_CONFIG::file::chgrp">CONFIG::file::chgrp</a></li> |
59 |
<li><a href="#profile_CONFIG::file::ioctl">CONFIG::file::ioctl</a></li> |
60 |
<li><a href="#profile_CONFIG::file::chroot">CONFIG::file::chroot</a></li> |
61 |
<li><a href="#profile_CONFIG::file::mount">CONFIG::file::mount</a></li> |
62 |
<li><a href="#profile_CONFIG::file::unmount">CONFIG::file::unmount</a></li> |
63 |
<li><a href="#profile_CONFIG::file::pivot_root">CONFIG::file::pivot_root</a></li> |
64 |
<li><a href="#profile_CONFIG::misc::env">CONFIG::misc::env</a></li> |
65 |
<li><a href="#profile_CONFIG::capability::use_route">CONFIG::capability::use_route</a></li> |
66 |
<li><a href="#profile_CONFIG::capability::use_packet">CONFIG::capability::use_packet</a></li> |
67 |
<li><a href="#profile_CONFIG::capability::use_kernel_module">CONFIG::capability::use_kernel_module</a></li> |
68 |
<li><a href="#profile_CONFIG::capability::SYS_REBOOT">CONFIG::capability::SYS_REBOOT</a></li> |
69 |
<li><a href="#profile_CONFIG::capability::SYS_VHANGUP">CONFIG::capability::SYS_VHANGUP</a></li> |
70 |
<li><a href="#profile_CONFIG::capability::SYS_TIME">CONFIG::capability::SYS_TIME</a></li> |
71 |
<li><a href="#profile_CONFIG::capability::SYS_NICE">CONFIG::capability::SYS_NICE</a></li> |
72 |
<li><a href="#profile_CONFIG::capability::SYS_SETHOSTNAME">CONFIG::capability::SYS_SETHOSTNAME</a></li> |
73 |
<li><a href="#profile_CONFIG::capability::SYS_KEXEC_LOAD">CONFIG::capability::SYS_KEXEC_LOAD</a></li> |
74 |
<li><a href="#profile_CONFIG::capability::SYS_PTRACE">CONFIG::capability::SYS_PTRACE</a></li> |
75 |
<li><a href="#profile_CONFIG::network::inet_dgram_bind">CONFIG::network::inet_dgram_bind</a></li> |
76 |
<li><a href="#profile_CONFIG::network::inet_dgram_send">CONFIG::network::inet_dgram_send</a></li> |
77 |
<li><a href="#profile_CONFIG::network::inet_dgram_recv">CONFIG::network::inet_dgram_recv</a></li> |
78 |
<li><a href="#profile_CONFIG::network::inet_stream_bind">CONFIG::network::inet_stream_bind</a></li> |
79 |
<li><a href="#profile_CONFIG::network::inet_stream_listen">CONFIG::network::inet_stream_listen</a></li> |
80 |
<li><a href="#profile_CONFIG::network::inet_stream_connect">CONFIG::network::inet_stream_connect</a></li> |
81 |
<li><a href="#profile_CONFIG::network::inet_stream_accept">CONFIG::network::inet_stream_accept</a></li> |
82 |
<li><a href="#profile_CONFIG::network::inet_raw_bind">CONFIG::network::inet_raw_bind</a></li> |
83 |
<li><a href="#profile_CONFIG::network::inet_raw_send">CONFIG::network::inet_raw_send</a></li> |
84 |
<li><a href="#profile_CONFIG::network::inet_raw_recv">CONFIG::network::inet_raw_recv</a></li> |
85 |
<li><a href="#profile_CONFIG::network::unix_dgram_bind">CONFIG::network::unix_dgram_bind</a></li> |
86 |
<li><a href="#profile_CONFIG::network::unix_dgram_send">CONFIG::network::unix_dgram_send</a></li> |
87 |
<li><a href="#profile_CONFIG::network::unix_dgram_recv">CONFIG::network::unix_dgram_recv</a></li> |
88 |
<li><a href="#profile_CONFIG::network::unix_stream_bind">CONFIG::network::unix_stream_bind</a></li> |
89 |
<li><a href="#profile_CONFIG::network::unix_stream_listen">CONFIG::network::unix_stream_listen</a></li> |
90 |
<li><a href="#profile_CONFIG::network::unix_stream_connect">CONFIG::network::unix_stream_connect</a></li> |
91 |
<li><a href="#profile_CONFIG::network::unix_stream_accept">CONFIG::network::unix_stream_accept</a></li> |
92 |
<li><a href="#profile_CONFIG::network::unix_seqpacket_bind">CONFIG::network::unix_seqpacket_bind</a></li> |
93 |
<li><a href="#profile_CONFIG::network::unix_seqpacket_listen">CONFIG::network::unix_seqpacket_listen</a></li> |
94 |
<li><a href="#profile_CONFIG::network::unix_seqpacket_connect">CONFIG::network::unix_seqpacket_connect</a></li> |
95 |
<li><a href="#profile_CONFIG::network::unix_seqpacket_accept">CONFIG::network::unix_seqpacket_accept</a></li> |
96 |
<li><a href="#profile_CONFIG::ipc::signal">CONFIG::ipc::signal</a></li> |
97 |
<li><a href="#profile_PREFERENCE">PREFERENCE</a></li> |
98 |
</ul> |
99 |
|
100 |
<p>/proc/ccs/exception_policy および /etc/ccs/exception_policy.conf で使われるもの</p> |
101 |
|
102 |
<ul> |
103 |
<li><a href="#exception_policy_acl_group">acl_group</a></li> |
104 |
<li><a href="#exception_policy_aggregator">aggregator</a></li> |
105 |
<li><a href="#exception_policy_initialize_domain">initialize_domain</a></li> |
106 |
<li><a href="#exception_policy_no_initialize_domain">no_initialize_domain</a></li> |
107 |
<li><a href="#exception_policy_keep_domain">keep_domain</a></li> |
108 |
<li><a href="#exception_policy_no_keep_domain">no_keep_domain</a></li> |
109 |
<li><a href="#exception_policy_path_group">path_group</a></li> |
110 |
<li><a href="#exception_policy_number_group">number_group</a></li> |
111 |
<li><a href="#exception_policy_address_group">address_group</a></li> |
112 |
<li><a href="#exception_policy_deny_autobind">deny_autobind</a></li> |
113 |
</ul> |
114 |
|
115 |
<p>/proc/ccs/domain_policy および /etc/ccs/domain_policy.conf で使われるもの</p> |
116 |
|
117 |
<ul> |
118 |
<li><a href="#domain_policy_file_execute">file execute</a></li> |
119 |
<li><a href="#domain_policy_file_read">file read</a></li> |
120 |
<li><a href="#domain_policy_file_write">file write</a></li> |
121 |
<li><a href="#domain_policy_file_append">file append</a></li> |
122 |
<li><a href="#domain_policy_file_create">file create</a></li> |
123 |
<li><a href="#domain_policy_file_unlink">file unlink</a></li> |
124 |
<li><a href="#domain_policy_file_unlinkmkdir">file mkdir</a></li> |
125 |
<li><a href="#domain_policy_file_rmdir">file rmdir</a></li> |
126 |
<li><a href="#domain_policy_file_mkfifo">file mkfifo</a></li> |
127 |
<li><a href="#domain_policy_file_mksock">file mksock</a></li> |
128 |
<li><a href="#domain_policy_file_mkblock">file mkblock</a></li> |
129 |
<li><a href="#domain_policy_file_mkchar">file mkchar</a></li> |
130 |
<li><a href="#domain_policy_file_truncate">file truncate</a></li> |
131 |
<li><a href="#domain_policy_file_symlink">file symlink</a></li> |
132 |
<li><a href="#domain_policy_file_link">file link</a></li> |
133 |
<li><a href="#domain_policy_file_rename">file rename</a></li> |
134 |
<li><a href="#domain_policy_file_ioctl">file ioctl</a></li> |
135 |
<li><a href="#domain_policy_file_mount">file mount</a></li> |
136 |
<li><a href="#domain_policy_file_unmount">file unmount</a></li> |
137 |
<li><a href="#domain_policy_file_chroot">file chroot</a></li> |
138 |
<li><a href="#domain_policy_file_pivot_root">file pivot_root</a></li> |
139 |
<li><a href="#domain_policy_misc_env">misc env</a></li> |
140 |
<li><a href="#domain_policy_network">network</a></li> |
141 |
<li><a href="#domain_policy_capability">capability</a></li> |
142 |
<li><a href="#domain_policy_ipc_signal">ipc signal</a></li> |
143 |
<li><a href="#domain_policy_use_profile">use_profile</a></li> |
144 |
<li><a href="#domain_policy_use_group">use_group</a></li> |
145 |
<li><a href="#domain_policy_task_auto_execute_handler">task auto_execute_handler</a></li> |
146 |
<li><a href="#domain_policy_task_denied_execute_handler">task denied_execute_handler</a></li> |
147 |
<li><a href="#domain_policy_quota_exceeded">quota_exceeded</a></li> |
148 |
<li><a href="#domain_policy_transition_failed">transition_failed</a></li> |
149 |
</ul> |
150 |
|
151 |
<p>/proc/ccs/manager および /etc/ccs/manager.conf で使われるもの</p> |
152 |
|
153 |
<ul> |
154 |
<li><a href="#manager_manage_by_non_root">manage_by_non_root</a></li> |
155 |
</ul> |
156 |
|
157 |
<h1>2. <a name="Common_Rules">はじめに</a></h1> |
158 |
|
159 |
<h2>2.1 <a name="word_expression_rules">単語の表記規則</a></h2> |
160 |
|
161 |
<p>TOMOYO Linux はパス名を用いたアクセス制御を行います。パス名には英数字だけでなく空白や改行などの文字、漢字のような複数バイトで構成される文字などが含まれる可能性があります。そのため、いかなる文字でも正しく処理できるようにするために、 TOMOYO Linux に於いては以下の規則に従って単語を表記します。単語とは、パス名だけでなくコメントや環境変数の名前やプログラム実行時のパラメータなど、文字列として扱う全ての情報を指します。</p> |
162 |
|
163 |
<ul> |
164 |
<li>\ 文字( 0x5C )は 8 進数表記であることを示すために使用されるため、 \\ のように 2 個続けます。</li> |
165 |
<li>0x00 ~ 0x20 および 0x7F ~ 0xFF は \ooo という形式の 8 進数で表記します。</li> |
166 |
<li>残りの 0x21 ~ 0x5B および 0x5D ~ 0x7E はそのままの文字で表記します。</li> |
167 |
</ul> |
168 |
|
169 |
<table border="1"> |
170 |
<tr><td><table><tr><td></td><td>下位 4 ビット</td></tr><tr><td>上位 4 ビット</td><td></td></tr></table></td><td>0x0</td><td>0x1</td><td>0x2</td><td>0x3</td><td>0x4</td><td>0x5</td><td>0x6</td><td>0x7</td><td>0x8</td><td>0x9</td><td>0xA</td><td>0xB</td><td>0xC</td><td>0xD</td><td>0xE</td><td>0xF</td></tr> |
171 |
<tr><td>0x0</td><td>\000</td><td>\001</td><td>\002</td><td>\003</td><td>\004</td><td>\005</td><td>\006</td><td>\007</td><td>\010</td><td>\011</td><td>\012</td><td>\013</td><td>\014</td><td>\015</td><td>\016</td><td>\017</td></tr> |
172 |
<tr><td>0x1</td><td>\020</td><td>\021</td><td>\022</td><td>\023</td><td>\024</td><td>\025</td><td>\026</td><td>\027</td><td>\030</td><td>\031</td><td>\032</td><td>\033</td><td>\034</td><td>\035</td><td>\036</td><td>\037</td></tr> |
173 |
<tr><td>0x2</td><td>\040</td><td>!</td><td>"</td><td>#</td><td>$</td><td>%</td><td>&</td><td>'</td><td>(</td><td>)</td><td>*</td><td>+</td><td>,</td><td>-</td><td>.</td><td>/</td></tr> |
174 |
<tr><td>0x3</td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>:</td><td>;</td><td><</td><td>=</td><td>></td><td>?</td></tr> |
175 |
<tr><td>0x4</td><td>@</td><td>A</td><td>B</td><td>C</td><td>D</td><td>E</td><td>F</td><td>G</td><td>H</td><td>I</td><td>J</td><td>K</td><td>L</td><td>M</td><td>N</td><td>O</td></tr> |
176 |
<tr><td>0x5</td><td>P</td><td>Q</td><td>R</td><td>S</td><td>T</td><td>U</td><td>V</td><td>W</td><td>X</td><td>Y</td><td>Z</td><td>[</td><td>\\</td><td>]</td><td>^</td><td>_</td></tr> |
177 |
<tr><td>0x6</td><td>`</td><td>a</td><td>b</td><td>c</td><td>d</td><td>e</td><td>f</td><td>g</td><td>h</td><td>i</td><td>j</td><td>k</td><td>l</td><td>m</td><td>n</td><td>o</td></tr> |
178 |
<tr><td>0x7</td><td>p</td><td>q</td><td>r</td><td>s</td><td>t</td><td>u</td><td>v</td><td>w</td><td>x</td><td>y</td><td>z</td><td>{</td><td>|</td><td>}</td><td>~</td><td>\177</td></tr> |
179 |
<tr><td>0x8</td><td>\200</td><td>\201</td><td>\202</td><td>\203</td><td>\204</td><td>\205</td><td>\206</td><td>\207</td><td>\210</td><td>\211</td><td>\212</td><td>\213</td><td>\214</td><td>\215</td><td>\216</td><td>\217</td></tr> |
180 |
<tr><td>0x9</td><td>\220</td><td>\221</td><td>\222</td><td>\223</td><td>\224</td><td>\225</td><td>\226</td><td>\227</td><td>\230</td><td>\231</td><td>\232</td><td>\233</td><td>\234</td><td>\235</td><td>\236</td><td>\237</td></tr> |
181 |
<tr><td>0xA</td><td>\240</td><td>\241</td><td>\242</td><td>\243</td><td>\244</td><td>\245</td><td>\246</td><td>\247</td><td>\250</td><td>\251</td><td>\252</td><td>\253</td><td>\254</td><td>\255</td><td>\256</td><td>\257</td></tr> |
182 |
<tr><td>0xB</td><td>\260</td><td>\261</td><td>\262</td><td>\263</td><td>\264</td><td>\265</td><td>\266</td><td>\267</td><td>\270</td><td>\271</td><td>\272</td><td>\273</td><td>\274</td><td>\275</td><td>\276</td><td>\277</td></tr> |
183 |
<tr><td>0xC</td><td>\300</td><td>\301</td><td>\302</td><td>\303</td><td>\304</td><td>\305</td><td>\306</td><td>\307</td><td>\310</td><td>\311</td><td>\312</td><td>\313</td><td>\314</td><td>\315</td><td>\316</td><td>\317</td></tr> |
184 |
<tr><td>0xD</td><td>\320</td><td>\321</td><td>\322</td><td>\323</td><td>\324</td><td>\325</td><td>\326</td><td>\327</td><td>\330</td><td>\331</td><td>\332</td><td>\333</td><td>\334</td><td>\335</td><td>\336</td><td>\337</td></tr> |
185 |
<tr><td>0xE</td><td>\340</td><td>\341</td><td>\342</td><td>\343</td><td>\344</td><td>\345</td><td>\346</td><td>\347</td><td>\350</td><td>\351</td><td>\352</td><td>\353</td><td>\354</td><td>\355</td><td>\356</td><td>\357</td></tr> |
186 |
<tr><td>0xF</td><td>\360</td><td>\361</td><td>\362</td><td>\363</td><td>\364</td><td>\365</td><td>\366</td><td>\367</td><td>\370</td><td>\371</td><td>\372</td><td>\373</td><td>\374</td><td>\375</td><td>\376</td><td>\377</td></tr> |
187 |
</table> |
188 |
|
189 |
<ul> |
190 |
<li>単語と単語を区切るデリミタとして空白文字( 0x20 )を、行と行を区切るデリミタとして改行文字( 0x0A )を使用します。</li> |
191 |
<li>上記の規則に従って表記された単語と、デリミタとして使われる空白文字および改行文字のみが有効です。それ以外の文字は空白文字とみなされます。連続する空白文字は自動的に 1 個の空白文字に圧縮されます。行頭及び行末の空白文字は自動的に削除されます。</li> |
192 |
</ul> |
193 |
|
194 |
<p>以下に表記例を示します。</p> |
195 |
|
196 |
<table border="1"> |
197 |
<tr><td>単語</td><td>正しい表記</td><td>誤った表記</td></tr> |
198 |
<tr><td>Hello world!</td><td>Hello\040world!</td><td>"Hello world!"</td></tr> |
199 |
<tr><td>/home/user/Documents and Settings/</td><td>/home/user/Documents\040and\040Settings/</td><td>/home/user/Documents and Settings/</td></tr> |
200 |
<tr><td>コメント (UTF-8 の場合)</td><td>\343\202\263\343\203\241\343\203\263\343\203\210\040(UTF-8\040\343\201\256\345\240\264\345\220\210)</td><td>コメント\040(UTF-8\040の場合)</td></tr> |
201 |
</table> |
202 |
|
203 |
<h2>2.2 <a name="wildcard_expression_rules">パターンの表記規則</a></h2> |
204 |
|
205 |
<p>パス名にはテンポラリファイルのように、毎回異なる文字が使われる場合があります。そのため、ワイルドカードを用いたパターン化を行うことが必要になります。 TOMOYO Linux に於いては以下のワイルドカードをサポートしています。</p> |
206 |
|
207 |
<table border="1"> |
208 |
<tr><td>ワイルドカード</td><td>意味</td><td>使用例</td></tr> |
209 |
<tr><td>\*</td><td>/ 以外の 0 文字以上</td><td>/var/log/samba/\*</td></tr> |
210 |
<tr><td>\@</td><td>/ と . 以外の 0 文字以上</td><td>/var/www/html/\@.html</td></tr> |
211 |
<tr><td>\?</td><td>/ 以外の 1 文字</td><td>/tmp/mail.\?\?\?\?\?\?</td></tr> |
212 |
<tr><td>\$</td><td>1 桁以上の 10 進数</td><td>/proc/\$/cmdline</td></tr> |
213 |
<tr><td>\+</td><td>10 進数 1 桁</td><td>/var/tmp/my_work.\+</td></tr> |
214 |
<tr><td>\X</td><td>1 桁以上の 16 進数</td><td>/var/tmp/my-work.\X</td></tr> |
215 |
<tr><td>\x</td><td>16 進数 1 桁</td><td>/tmp/my-work.\x</td></tr> |
216 |
<tr><td>\A</td><td>1 文字以上のアルファベット</td><td>/var/log/my-work/\$-\A-\$.log</td></tr> |
217 |
<tr><td>\a</td><td>アルファベット 1 文字</td><td>/home/users/\a/\*/public_html/\*.html</td></tr> |
218 |
<tr><td>\-</td><td>パス名を除外する演算子</td><td> |
219 |
<ul> |
220 |
<li>/etc/\* ・・・ /etc/ 直下の全ファイル</li> |
221 |
<li>/etc/\*\-\*shadow\* ・・・ /etc/\*shadow\* 以外の /etc/\*</li> |
222 |
<li>/\*\-proc\-sys/ ・・・ /proc/ と /sys/ 以外の /\*/</li> |
223 |
</ul> |
224 |
</td></tr> |
225 |
<tr><td>/\{dir\}/</td><td>/ +1回以上の dir/ の繰り返しに一致する演算子</td><td> |
226 |
<ul> |
227 |
<li>/var/www/html/\{\*\}/\*.html ・・・ /var/www/html/\*/\*.html /var/www/html/\*/\*/\*.html /var/www/html/\*/\*/\*/\*.html など</li> |
228 |
<li>/home/\*/\{\*\-.\*\}/\* ・・・ /home/\*/\*\-.\*/\* /home/\*/\*\-.\*/\*\-.\*/\* /home/\*/\*\-.\*/\*\-.\*/\*\-.\*/\* など</li> |
229 |
</ul> |
230 |
</td></tr> |
231 |
</table> |
232 |
|
233 |
<h2>2.3 <a name="memory_usage_infomation">メモリ使用量に関する情報</a></h2> |
234 |
|
235 |
<p>TOMOYO Linux が現在使用中のメモリ消費量は、 /proc/ccs/meminfo から確認できます。単位はバイトです。</p> |
236 |
|
237 |
<table border="1"> |
238 |
<tr><td> |
239 |
# cat /proc/ccs/meminfo<br> |
240 |
Policy: 377376<br> |
241 |
Audit logs: 0<br> |
242 |
Query lists: 0<br> |
243 |
Total: 377376 |
244 |
</td></tr> |
245 |
</table> |
246 |
|
247 |
<ul> |
248 |
<li>Policy: ・・・アクセス許可を記憶するために使用されている量</li> |
249 |
<li>Audit logs: ・・・アクセスログを保持するために使用されている量</li> |
250 |
<li>Query lists: ・・・強制モードでのポリシー違反を対話的に処理するために使用されている量</li> |
251 |
</ul> |
252 |
|
253 |
<p>TOMOYO Linux が使用するメモリの量を制限するためにメモリクォータがサポートされています。</p> |
254 |
|
255 |
<p>/etc/ccs/meminfo.conf に以下のように指定しておくことで設定できます。</p> |
256 |
|
257 |
<table border="1"> |
258 |
<tr><td> |
259 |
# cat /etc/ccs/meminfo.conf<br> |
260 |
Policy: 16777216<br> |
261 |
Audit logs: 1048576<br> |
262 |
Query lists: 1048576 |
263 |
</td></tr> |
264 |
</table> |
265 |
|
266 |
<h1>3. <a name="Policy_Files">ポリシーファイルに関して</a></h1> |
267 |
|
268 |
<h2>3.1 <a name="policy_file_locations">所在について</a></h2> |
269 |
|
270 |
<p>ポリシーファイルとは、アクセスの可否を定義したファイルです。システムの起動時に自動的にカーネルへと読み込まれます。</p> |
271 |
|
272 |
<p>システムの起動時には、 /sbin/init というプログラムが実行されます。 /sbin/init の実行が要求されたときに、 /sbin/ccs-init というプログラムが存在していた場合、 /sbin/ccs-init が実行され、 /sbin/ccs-init の処理が終了してから /sbin/init の実行が開始されます。</p> |
273 |
|
274 |
<p> /sbin/ccs-init は /etc/ccs/ ディレクトリにあるポリシーファイルを /proc/ccs/ ディレクトリを通じてカーネルへと読み込みます。</p> |
275 |
|
276 |
<table border="1"> |
277 |
<tr><td>カーネルとのインタフェース</td><td>ポリシーファイル</td><td>定義されている内容</td></tr> |
278 |
<tr><td><a href="#profile">/proc/ccs/profile</a></td><td>/etc/ccs/profile.conf</td><td>プロファイル(制御レベルを定義したもの)</td></tr> |
279 |
<tr><td><a href="#manager">/proc/ccs/manager</a></td><td>/etc/ccs/manager.conf</td><td>マネージャ(ポリシーの変更ができるプログラムを定義したもの)</td></tr> |
280 |
<tr><td><a href="#exception_policy">/proc/ccs/exception_policy</a></td><td>/etc/ccs/exception_policy.conf</td><td>例外ポリシー(ドメインポリシーの例外を定義したもの)</td></tr> |
281 |
<tr><td><a href="#domain_policy">/proc/ccs/domain_policy</a></td><td>/etc/ccs/domain_policy.conf</td><td>ドメインポリシー(ドメイン単位で適用される設定)</td></tr> |
282 |
<tr><td><a href="#meminfo">/proc/ccs/meminfo</a></td><td>/etc/ccs/meminfo.conf</td><td>メモリ使用状況およびクォータ</td></tr> |
283 |
</table> |
284 |
|
285 |
<p>そのほかの情報を取得するためのインタフェースもあります。対応するポリシーファイルはありません。</p> |
286 |
|
287 |
<table border="1"> |
288 |
<tr><td>カーネルとのインタフェース</td><td>内容</td></tr> |
289 |
<tr><td><a href="#query">/proc/ccs/query</a></td><td>管理者の指示待ちとなっているアクセス要求</td></tr> |
290 |
<tr><td><a href="#.domain_status">/proc/ccs/.domain_status</a></td><td>定義されているドメイン名とプロファイル番号</td></tr> |
291 |
<tr><td><a href="#grant_log">/proc/ccs/grant_log</a></td><td>ポリシーに違反しなかったアクセス要求のログ</td></tr> |
292 |
<tr><td><a href="#reject_log">/proc/ccs/reject_log</a></td><td>ポリシーに違反したアクセス要求のログ</td></tr> |
293 |
<tr><td><a href="#self_domain">/proc/ccs/self_domain</a></td><td>自分が属しているドメインのドメイン名</td></tr> |
294 |
<tr><td><a href="#.process_status">/proc/ccs/.process_status</a></td><td>プロセスが属しているドメイン名とプロファイル番号</td></tr> |
295 |
<tr><td><a href="#version">/proc/ccs/version</a></td><td>TOMOYO Linux のバージョン</td></tr> |
296 |
</table> |
297 |
|
298 |
<h2>3.2 <a name="policy_file_modifiers">変更について</a></h2> |
299 |
|
300 |
<p>カーネルとのインタフェースである /proc/ccs/ ディレクトリを経由してポリシーを変更することができるプログラム名を /proc/ccs/manager に登録します。プログラム名ではなくドメイン名で登録することもできます。</p> |
301 |
|
302 |
<ul> |
303 |
<li>/proc/ccs/manager に登録されているプログラム名を持つプロセス</li> |
304 |
<li>/proc/ccs/manager に登録されているドメイン名を持つプロセス</li> |
305 |
</ul> |
306 |
|
307 |
<p>だけがカーネルとのインタフェースである /proc/ccs/ ディレクトリを経由してポリシーを変更できます。以下に例を示します。</p> |
308 |
|
309 |
<table border="1"> |
310 |
<tr><td> |
311 |
# cat /proc/ccs/manager<br> |
312 |
/usr/sbin/ccs-loadpolicy<br> |
313 |
/usr/sbin/ccs-editpolicy<br> |
314 |
/usr/sbin/ccs-setlevel<br> |
315 |
/usr/sbin/ccs-setprofile<br> |
316 |
/usr/sbin/ccs-ld-watch<br> |
317 |
/usr/sbin/ccs-queryd<br> |
318 |
<kernel> /sbin/mingetty /bin/login /bin/bash |
319 |
</td></tr> |
320 |
</table> |
321 |
|
322 |
<p>デフォルトではユーザIDと実効ユーザIDの両方が 0 であるプロセスだけがポリシーを変更できますが、 <a href="#non_root_policy_update">root 以外のユーザによるポリシーの変更を許可</a>の設定を行えば、非 root ユーザによるポリシーの変更も可能です。</p> |
323 |
|
324 |
<p>なお、学習モード用のプロファイルが割り当てられているプロセスは、アクセスを要求するだけで <a href="#domain_policy">/proc/ccs/domain_policy</a> へと自動的にアクセス許可が追加されていきます。</p> |
325 |
|
326 |
<h1>4. <a name="Domain_Rules">ドメインに関して</a></h1> |
327 |
|
328 |
<h2>4.1 <a name="domain_definition">ドメインとは</a></h2> |
329 |
|
330 |
<p>TOMOYO Linux では、ドメインを単位としてアクセス許可を定義します。 <a href="#domain_policy">/proc/ccs/domain_policy</a> を通じてアクセス許可を定義します。</p> |
331 |
|
332 |
<p>TOMOYO Linux においては、全てのプロセスがそれぞれ 1 つのドメインに属し、全てのプログラムがそれぞれ異なるドメインに属します。現在実行されている 2 つのプロセスが同一のプログラムであっても、それぞれのプロセスの直前のドメインが異なっていれば異なるドメインに属します。</p> |
333 |
|
334 |
<p>全てのドメインはカーネルが属するドメイン「 <kernel> 」を基点として定義されます。 /sbin/init はカーネルの属するドメインから起動されますので、 /sbin/init のドメインは「 <kernel> /sbin/init 」と定義されます。 /etc/rc.d/rc はカーネルから起動された /sbin/init の属するドメインから起動されますので、 /etc/rc.d/rc のドメインは「 <kernel> /sbin/init /etc/rc.d/rc 」と定義されます。</p> |
335 |
|
336 |
<h2>4.2 <a name="domain_transition">ドメイン遷移とは</a></h2> |
337 |
|
338 |
<p>プロセスがプログラムを実行しようとすると、以下の処理が行われます。</p> |
339 |
|
340 |
<table border="1"> |
341 |
<tr><td>Step</td><td>内容</td></tr> |
342 |
<tr><td>プログラム名の取得</td><td> |
343 |
<p>実行しようとするプログラムの絶対パス名を取得して「パス名候補」とします。ただし、実行しようとするプログラムがシンボリックリンクの場合は、シンボリックリンクを解決する前のパス名を取得します。</p> |
344 |
</td></tr> |
345 |
<tr><td>類似するプログラムの集約</td><td> |
346 |
<p>例外ポリシーから</p> |
347 |
|
348 |
<ul> |
349 |
<li>aggregator 「パス名候補」 「集約されたパス名」 |
350 |
</ul> |
351 |
|
352 |
<p>というエントリを探します。見つかった場合は、「集約されたパス名」を「パス名候補」とします。</p> |
353 |
</td></tr> |
354 |
<tr><td><a name="exec_stage_check_execute">権限のチェック</a></td><td> |
355 |
<p>ドメインポリシーから</p> |
356 |
|
357 |
<ul> |
358 |
<li>file execute 「パス名候補」 |
359 |
<li>file execute @「パス名候補」を含むグループ名 |
360 |
</ul> |
361 |
|
362 |
<p>というエントリを探します。見つからなければプログラムの実行要求は拒否されます。</p> |
363 |
</td></tr> |
364 |
<tr><td><a name="exec_stage_check_destination">遷移先の決定</a></td><td> |
365 |
|
366 |
<p>(1) 例外ポリシーから</p> |
367 |
|
368 |
<ul> |
369 |
<li>no_initialize_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」 |
370 |
<li>no_initialize_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」の最後の要素 |
371 |
<li>no_initialize_domain 「パス名候補」 from any |
372 |
<li>no_initialize_domain any from any |
373 |
</ul> |
374 |
|
375 |
<p>というエントリを探します。見つかった場合は (3) へ進みます。</p> |
376 |
|
377 |
<p>(2) 例外ポリシーから</p> |
378 |
|
379 |
<ul> |
380 |
<li>initialize_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」 |
381 |
<li>initialize_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」の最後の要素 |
382 |
<li>initialize_domain 「パス名候補」 from any |
383 |
<li>initialize_domain any from any |
384 |
</ul> |
385 |
|
386 |
<p>というエントリを探します。見つかった場合は「カーネルが属しているドメインのドメイン名( <kernel> )」と「パス名候補」とを連結して「遷移先ドメイン」として (6) へ進みます。</p> |
387 |
|
388 |
<p>(3) 例外ポリシーから</p> |
389 |
|
390 |
<ul> |
391 |
<li>no_keep_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」 |
392 |
<li>no_keep_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」の最後の要素 |
393 |
<li>no_keep_domain any from 「現在のプロセスが属しているドメインのドメイン名」 |
394 |
<li>no_keep_domain any from 「現在のプロセスが属しているドメインのドメイン名」の最後の要素 |
395 |
<li>no_keep_domain any from any |
396 |
</ul> |
397 |
|
398 |
<p>というエントリを探します。見つかった場合は (5) へ進みます。</p> |
399 |
|
400 |
<p>(4) 例外ポリシーから</p> |
401 |
|
402 |
<ul> |
403 |
<li>keep_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」 |
404 |
<li>keep_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」の最後の要素 |
405 |
<li>keep_domain any from 「現在のプロセスが属しているドメインのドメイン名」 |
406 |
<li>keep_domain any from 「現在のプロセスが属しているドメインのドメイン名」の最後の要素 |
407 |
<li>keep_domain any from any |
408 |
</ul> |
409 |
|
410 |
<p>というエントリを探します。見つかった場合は「現在のプロセスが属しているドメインのドメイン名」を「遷移先ドメイン」とし、 (6) へ進みます。</p> |
411 |
|
412 |
<p>(5) 「現在のプロセスが属しているドメインのドメイン名」と「パス名候補」とを連結して「遷移先ドメイン」とし、 (6) へ進みます。</p> |
413 |
|
414 |
<p>(6) ドメインポリシーから「遷移先ドメイン」を探します。見つからなければプログラムの実行要求は拒否されます。</p> |
415 |
|
416 |
</td></tr> |
417 |
<tr><td>環境変数のチェック</td><td> |
418 |
|
419 |
<p>(1) 全ての環境変数名が「遷移先ドメイン」で許可されているかどうかを検査します。 1 つでも許可されていないものが見つかった場合は、プログラムの実行要求は拒否されます。</p> |
420 |
|
421 |
<p>(2) 通常のプログラム実行処理を行い、正常に終了した場合は「遷移先ドメイン」に遷移します。</p> |
422 |
</td></tr> |
423 |
</table> |
424 |
|
425 |
<p>ただし、例外として</p> |
426 |
|
427 |
<ul> |
428 |
<li>上記手順の「<a href="#exec_stage_check_execute">権限のチェック</a>」「<a href="#exec_stage_check_destination">遷移先の決定</a>」のどちらかに於いて拒否されたが、プログラムの実行を要求したプロセスの属しているドメインに <a href="#domain_policy_task_denied_execute_handler">task denied_execute_handler</a> キーワードが指定されている</li> |
429 |
<li>プログラムの実行を要求したプロセスの属しているドメインに <a href="#domain_policy_task_auto_execute_handler">task auto_execute_handler</a> キーワードが指定されている</li> |
430 |
</ul> |
431 |
|
432 |
<p>のどちらかに該当し、かつ、</p> |
433 |
|
434 |
<ul> |
435 |
<li>プログラムの実行を要求したプロセスが <a href="#domain_policy_task_auto_execute_handler">task auto_execute_handler</a> キーワードまたは <a href="#domain_policy_task_denied_execute_handler">task denied_execute_handler</a> キーワードにより起動されたプロセスではない</li> |
436 |
</ul> |
437 |
|
438 |
<p>場合には、以下の手順を実行します。この例外の使い方については「<a href="#auto_execute_handler">プログラムの実行可否をカーネルの外部で判断</a>」と「<a href="#denied_execute_handler">許可されていないプログラムの実行が要求された場合の代替処理指定</a>」で説明します。</p> |
439 |
|
440 |
<table border="1"> |
441 |
<tr><td>Step</td><td>内容</td></tr> |
442 |
<tr><td>プログラム名の取得</td><td> |
443 |
<p><a href="#domain_policy_task_denied_execute_handler">task denied_execute_handler</a> または <a href="#domain_policy_task_auto_execute_handler">task auto_execute_handler</a> で指定されているプログラムのパス名を取得し、「パス名候補」とします。</p> |
444 |
</td></tr> |
445 |
<tr><td>情報の追加</td><td> |
446 |
<p>全ての環境変数を引数の末尾に追加し、全ての環境変数を削除します。</p> |
447 |
<p>「パス名候補」「プログラムの実行を要求したプロセスの属しているドメインのドメイン名」「プログラムの実行を要求したプロセスのパス名」「プログラムの実行を要求したプロセスの状態」「実行が要求されたプログラムのパス名」「引数の数」「環境変数の数」を引数の先頭に挿入します。</p> |
448 |
</td></tr> |
449 |
<tr><td>遷移先の決定</td><td> |
450 |
|
451 |
<p>(1) 例外ポリシーから</p> |
452 |
|
453 |
<ul> |
454 |
<li>no_initialize_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」 |
455 |
<li>no_initialize_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」の最後の要素 |
456 |
<li>no_initialize_domain 「パス名候補」 from any |
457 |
<li>no_initialize_domain any from any |
458 |
</ul> |
459 |
|
460 |
<p>というエントリを探します。見つかった場合は (3) へ進みます。</p> |
461 |
|
462 |
<p>(2) 例外ポリシーから</p> |
463 |
|
464 |
<ul> |
465 |
<li>initialize_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」 |
466 |
<li>initialize_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」の最後の要素 |
467 |
<li>initialize_domain 「パス名候補」 from any |
468 |
<li>initialize_domain any from any |
469 |
</ul> |
470 |
|
471 |
<p>というエントリを探します。見つかった場合は「カーネルが属しているドメインのドメイン名( <kernel> )」と「パス名候補」とを連結して「遷移先ドメイン」として (6) へ進みます。</p> |
472 |
|
473 |
<p>(3) 例外ポリシーから</p> |
474 |
|
475 |
<ul> |
476 |
<li>no_keep_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」 |
477 |
<li>no_keep_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」の最後の要素 |
478 |
<li>no_keep_domain any from 「現在のプロセスが属しているドメインのドメイン名」 |
479 |
<li>no_keep_domain any from 「現在のプロセスが属しているドメインのドメイン名」の最後の要素 |
480 |
<li>no_keep_domain any from any |
481 |
</ul> |
482 |
|
483 |
<p>というエントリを探します。見つかった場合は (5) へ進みます。</p> |
484 |
|
485 |
<p>(4) 例外ポリシーから</p> |
486 |
|
487 |
<ul> |
488 |
<li>keep_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」 |
489 |
<li>keep_domain 「パス名候補」 from 「現在のプロセスが属しているドメインのドメイン名」の最後の要素 |
490 |
<li>keep_domain any from 「現在のプロセスが属しているドメインのドメイン名」 |
491 |
<li>keep_domain any from 「現在のプロセスが属しているドメインのドメイン名」の最後の要素 |
492 |
<li>keep_domain any from any |
493 |
</ul> |
494 |
|
495 |
<p>というエントリを探します。見つかった場合は「現在のプロセスが属しているドメインのドメイン名」を「遷移先ドメイン」とし、 (6) へ進みます。</p> |
496 |
|
497 |
<p>(5) 「現在のプロセスが属しているドメインのドメイン名」と「パス名候補」とを連結して「遷移先ドメイン」とし、 (6) へ進みます。</p> |
498 |
|
499 |
<p>(6) ドメインポリシーから「遷移先ドメイン」を探します。見つからなければプログラムの実行要求は拒否されます。</p> |
500 |
|
501 |
</td></tr> |
502 |
<tr><td>プログラムの実行</td><td> |
503 |
|
504 |
<p>通常のプログラム実行処理を行い、正常に終了した場合は「遷移先ドメイン」に遷移します。</p> |
505 |
|
506 |
</td></tr> |
507 |
</table> |
508 |
|
509 |
<h2>4.3 <a name="access_logs">アクセスログについて</a></h2> |
510 |
|
511 |
<p>ドメインポリシーによって許可されたアクセス要求のログと拒否されたアクセス要求のログを生成します。前者は許可ログと呼ばれ、 /proc/ccs/grant_log から取得することができます。後者は拒否ログと呼ばれ、 /proc/ccs/reject_log から取得することができます。これらのログを取得してファイルとして保存するためのツールとして /usr/sbin/ccs-auditd というプログラムが付属しています。</p> |
512 |
|
513 |
<p>以下に例を示します。最初の例はプログラムを実行しようとしたときのログです。</p> |
514 |
|
515 |
<table border="1"> |
516 |
<tr><td> |
517 |
#2010-01-13 21:00:50# profile=1 mode=learning (global-pid=2908) task={ pid=2908 ppid=2879 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 type!=execute_handler } path1={ uid=0 gid=0 ino=852049 major=8 minor=1 perm=0755 type=file } path1.parent={ uid=0 gid=0 ino=851969 perm=0755 } exec={ realpath="/bin/cat" argc=2 envc=20 argv[]={ "cat" "/etc/fstab" } envp[]={ "HOSTNAME=tomoyo" "TERM=vt100" "SHELL=/bin/bash" "HISTSIZE=1000" "SSH_CLIENT=192.168.1.2\0402845\04022" "SSH_TTY=/dev/pts/0" "USER=root" "LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:" "MAIL=/var/spool/mail/root" "PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin:/root/bin" "PWD=/root" "LANG=C" "SHLVL=1" "HOME=/root" "LOGNAME=root" "CVS_RSH=ssh" "SSH_CONNECTION=192.168.1.2\0402845\040192.168.1.7\04022" "LESSOPEN=|/usr/bin/lesspipe.sh\040%s" "G_BROKEN_FILENAMES=1" "_=/bin/cat" } }<br> |
518 |
<kernel> /usr/sbin/sshd /bin/bash<br> |
519 |
file execute /bin/cat |
520 |
</td></tr> |
521 |
</table> |
522 |
|
523 |
<p>このログは、 <kernel> /usr/sbin/sshd /bin/bash というドメインに属しているプロセスが /bin/cat というプログラムを実行しようとし、そのときの引数の内容は "cat" "/etc/fstab" 、環境変数の内容は "HOSTNAME=tomoyo" "TERM=vt100" "SHELL=/bin/bash" "HISTSIZE=1000" "SSH_CLIENT=192.168.1.2\0402845\04022" "SSH_TTY=/dev/pts/0" "USER=root" "LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:" "MAIL=/var/spool/mail/root" "PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin:/root/bin" "PWD=/root" "LANG=C" "SHLVL=1" "HOME=/root" "LOGNAME=root" "CVS_RSH=ssh" "SSH_CONNECTION=192.168.1.2\0402845\040192.168.1.7\04022" "LESSOPEN=|/usr/bin/lesspipe.sh\040%s" "G_BROKEN_FILENAMES=1" "_=/bin/cat" であったということを示しています。また、プロセスIDやユーザIDなど、プロセスに関する情報も一緒に出力されます。</p> |
524 |
|
525 |
<p>次の例は、ファイルを読み込みモードでオープンしようとしたときのログです。</p> |
526 |
|
527 |
<table border="1"> |
528 |
<tr><td> |
529 |
#2010-01-13 21:00:50# profile=1 mode=learning (global-pid=2908) task={ pid=2908 ppid=2879 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 type!=execute_handler } path1={ uid=0 gid=0 ino=901920 major=8 minor=1 perm=0644 type=file } path1.parent={ uid=0 gid=0 ino=901121 perm=0755 }<br> |
530 |
<kernel> /usr/sbin/sshd /bin/bash /bin/cat<br> |
531 |
file read /etc/fstab |
532 |
</td></tr> |
533 |
</table> |
534 |
|
535 |
<p>このログは、 <kernel> /usr/sbin/sshd /bin/bash /bin/cat というドメインに属しているプロセスが /etc/fstab というファイルをオープンしようとしたことを示しています。</p> |
536 |
|
537 |
<p>次の例は、ドメインが新規作成されたときのログです。</p> |
538 |
|
539 |
<table border="1"> |
540 |
<tr><td> |
541 |
#2010-01-13 21:05:22# profile=1 mode=learning (global-pid=3007) task={ pid=3007 ppid=2991 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 type=execute_handler }<br> |
542 |
<kernel> /usr/sbin/sshd /bin/bash /bin/bash /bin/audit-exec-param /bin/cat<br> |
543 |
use_profile 1 |
544 |
</td></tr> |
545 |
</table> |
546 |
|
547 |
<p>このログは、 <kernel> /usr/sbin/sshd /bin/bash /bin/bash /bin/audit-exec-param /bin/cat というドメインが新規作成され、プロファイルとして 1 が割り当てられたことを示しています。 TOMOYO Linux では、ドメインが自動的に新規作成されていきます。自動的に新規作成された場合には、ドメインを新規作成することになったプロセスの属しているドメインに割り当てられていたプロファイル番号が引き継がれます。</p> |
548 |
|
549 |
<p>次の例は、<a href="#auto_execute_handler">プログラムの実行可否をカーネルの外部で判断</a>するために要求されたのとは異なるプログラムが実行されたときのログです。</p> |
550 |
<table border="1"> |
551 |
<tr><td> |
552 |
#2010-01-13 21:05:22# profile=1 mode=learning (global-pid=3007) task={ pid=3007 ppid=2991 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 type!=execute_handler } path1={ uid=0 gid=0 ino=360482 major=8 minor=1 perm=0755 type=file } path1.parent={ uid=0 gid=0 ino=851969 perm=0755 } exec={ realpath="/bin/audit-exec-param" argc=29 envc=0 argv[]={ "/bin/audit-exec-param" "<kernel>\040/usr/sbin/sshd\040/bin/bash\040/bin/bash" "/bin/bash" "pid=3007\040uid=0\040gid=0\040euid=0\040egid=0\040suid=0\040sgid=0\040fsuid=0\040fsgid=0" "/bin/cat" "2" "20" "cat" "/etc/fstab" "HOSTNAME=tomoyo" "SHELL=/bin/bash" "TERM=vt100" "HISTSIZE=1000" "SSH_CLIENT=192.168.1.2\0402845\04022" "SSH_TTY=/dev/pts/0" "USER=root" "LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:" "PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin:/root/bin:/usr/sbin" "MAIL=/var/spool/mail/root" "PWD=/root" "LANG=C" "HOME=/root" "SHLVL=2" "LOGNAME=root" "CVS_RSH=ssh" "SSH_CONNECTION=192.168.1.2\0402845\040192.168.1.7\04022" "LESSOPEN=|/usr/bin/lesspipe.sh\040%s" "G_BROKEN_FILENAMES=1" "_=/bin/cat" } envp[]={ } }<br> |
553 |
<kernel> /usr/sbin/sshd /bin/bash /bin/bash<br> |
554 |
task auto_execute_handler /bin/audit-exec-param |
555 |
</td></tr> |
556 |
</table> |
557 |
|
558 |
<p>このログは、 <kernel> /usr/sbin/sshd /bin/bash /bin/bash というドメインに属しているプロセスがプログラムを実行しようとしたが、 task auto_execute_handler が指定されていたので代わりに /bin/audit-exec-param というプログラムが実行されたこと、 /bin/audit-exec-param に渡された引数の内容は "/bin/audit-exec-param" "<kernel>\040/usr/sbin/sshd\040/bin/bash\040/bin/bash" "/bin/bash" "pid=3007\040uid=0\040gid=0\040euid=0\040egid=0\040suid=0\040sgid=0\040fsuid=0\040fsgid=0" "/bin/cat" "2" "20" "cat" "/etc/fstab" "HOSTNAME=tomoyo" "SHELL=/bin/bash" "TERM=vt100" "HISTSIZE=1000" "SSH_CLIENT=192.168.1.2\0402845\04022" "SSH_TTY=/dev/pts/0" "USER=root" "LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:" "PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin:/root/bin:/usr/sbin" "MAIL=/var/spool/mail/root" "PWD=/root" "LANG=C" "HOME=/root" "SHLVL=2" "LOGNAME=root" "CVS_RSH=ssh" "SSH_CONNECTION=192.168.1.2\0402845\040192.168.1.7\04022" "LESSOPEN=|/usr/bin/lesspipe.sh\040%s" "G_BROKEN_FILENAMES=1" "_=/bin/cat" であったということを示しています。 LD_PRELOAD などの環境変数によって /bin/audit-exec-param の動作が左右されるのを防ぐため、環境変数を引数に移動しています。</p> |
559 |
|
560 |
<p>このように、アクセスログは 3 行で 1 件( /usr/sbin/ccs-auditd によってファイルに保存されるときに空行が入るので 4 行で 1 件)となっており、これらのログはそのままドメインポリシーとして追加可能な形式になっています。アクセス拒否ログから許可したい部分を抽出して、例えば /var/log/tomoyo/diff.txt という名前で保存した後、</p> |
561 |
|
562 |
<table border="1"> |
563 |
<tr><td> |
564 |
# /usr/sbin/ccs-loadpolicy -d < /var/log/tomoyo/diff.txt |
565 |
</td></tr> |
566 |
</table> |
567 |
|
568 |
<p>という操作を行うことで、ドメインポリシーに追加することができます。そのため、「学習モード」を使わなくても、最初から「確認モード」を使って拒否ログを出力させ、拒否ログの内容を編集するというアプローチでもドメインポリシーを定義していくことができます。「学習モード」でドメインポリシーを作成する場合にはプロセスの状態(アクセスログの先頭行の内容)は加味されませんが、アクセス拒否ログからドメインポリシーを生成すると、最初から<a href="#conditional_acl">条件付きアクセス許可の指定</a>を行うことができます。例えば、「学習モード」を使わずにログを生成し、</p> |
569 |
|
570 |
<table border="1"> |
571 |
<tr><td> |
572 |
<kernel> /usr/sbin/sshd /bin/bash<br> |
573 |
file execute /bin/cat exec.argc=2 exec.realpath="/bin/cat" exec.argv[0]="cat" exec.argv[1]="/etc/fstab" |
574 |
</td></tr> |
575 |
</table> |
576 |
|
577 |
<p>としてドメインポリシーを追加した場合、「学習モード」で追加される以下の内容よりも細かい指定を行うことができるようになります。</p> |
578 |
|
579 |
<table border="1"> |
580 |
<tr><td> |
581 |
<kernel> /usr/sbin/sshd /bin/bash<br> |
582 |
file execute /bin/cat exec.realpath="/bin/cat" exec.argv[0]="cat" |
583 |
</td></tr> |
584 |
</table> |
585 |
|
586 |
<h1>5. <a name="Syntax_Details">キーワード詳細</a></h1> |
587 |
|
588 |
<h2><a name="profile">/proc/ccs/profile</a></h2> |
589 |
|
590 |
<p>TOMOYO Linux では、ファイル以外にもいくつかの項目について強制アクセス制御を行うことができますが、ポリシー管理の負担を減らすために、必要の無い機能を無効化できるようになっています。</p> |
591 |
|
592 |
<p>有効にしたい機能とそのモードを「 プロファイル番号-項目=値 」という形式で定義します。プロファイル番号は 0 ~ 255 が指定可能です。プロファイルの内容を変更するには ccs-setlevel コマンドまたは ccs-loadpolicy コマンドを使用します。</p> |
593 |
|
594 |
<p>各ドメインには 1 個のプロファイルが割り当てられます。ドメインにプロファイルを割り当てるには setprofile コマンドまたは ccs-editpolicy コマンドまたは ccs-loadpolicy コマンドを使用します。</p> |
595 |
|
596 |
<p>現在ドメインに割り当てられているプロファイル番号は ccs-editpolicy コマンドで確認できます。<br> |
597 |
現在動作中のプロセスに割り当てられているプロファイル番号は ccs-pstree コマンドで確認できます。<br> |
598 |
現在のポリシーを ccs-savepolicy コマンドで保存した場合、 <a href="#domain_policy_use_profile">use_profile</a> というキーワードに保持されます。</p> |
599 |
|
600 |
<p>現在のプロファイルを読み出しまたは追加するには以下のように操作します。</p> |
601 |
|
602 |
<p>(例)<br> |
603 |
cat /proc/ccs/profile<br> |
604 |
ccs-savepolicy -p<br> |
605 |
ccs-setlevel 1-CONFIG::file::execute=learning<br> |
606 |
echo 1-CONFIG::file::execute=learning | ccs-loadpolicy -p</p> |
607 |
|
608 |
<p>関連項目:<a href="#policy_file_modifiers">変更について</a></p> |
609 |
|
610 |
<p>CONFIG で始まる項目に対しては以下の値を指定できます。</p> |
611 |
|
612 |
<table border="1"> |
613 |
<tr><td>設定</td><td>内容</td></tr> |
614 |
<tr><td>mode=disabled</td><td>無効。通常のカーネルと同様に動作します。</td></tr> |
615 |
<tr><td>mode=learning</td><td>学習モード。ポリシーに違反してもアクセス要求を拒否することはせず、再度同じアクセス要求が発生した場合にポリシー違反とならないようにするために、ポリシーへの自動追加を行います。</td></tr> |
616 |
<tr><td>mode=permissive</td><td>確認モード。ポリシーに違反してもアクセス要求を拒否することはしませんが、ポリシーへの自動追加も行いません。</td></tr> |
617 |
<tr><td>mode=enforcing</td><td>強制モード。ポリシーに違反するアクセス要求を拒否します。</td></tr> |
618 |
<tr><td>grant_log=yes</td><td>アクセス許可ログを取得する。上限は <a href="#profile_PREFERENCE">PREFERENCE</a> の max_grant_log= で指定する。</td></tr> |
619 |
<tr><td>grant_log=no</td><td>アクセス許可ログを取得しない。</td></tr> |
620 |
<tr><td>reject_log=yes</td><td>アクセス拒否ログを取得する。上限は <a href="#profile_PREFERENCE">PREFERENCE</a> の max_reject_log= で指定する。</td></tr> |
621 |
<tr><td>reject_log=no</td><td>アクセス拒否ログを取得しない。</td></tr> |
622 |
</table> |
623 |
|
624 |
<h3><a name="profile_CONFIG::file::execute">CONFIG::file::execute</a></h3> |
625 |
|
626 |
<p>プログラムの実行およびドメイン遷移に対する強制アクセス制御のレベルを指定します。</p> |
627 |
|
628 |
<h3><a name="profile_CONFIG::file::open">CONFIG::file::open</a></h3> |
629 |
|
630 |
<p>読み込みまたは書き込みモードでのファイルのオープンに対する強制アクセス制御のレベルを指定します。</p> |
631 |
|
632 |
<h3><a name="profile_CONFIG::file::create">CONFIG::file::create</a></h3> |
633 |
|
634 |
<p>ファイルの作成に対する強制アクセス制御のレベルを指定します。</p> |
635 |
|
636 |
<h3><a name="profile_CONFIG::file::unlink">CONFIG::file::unlink</a></h3> |
637 |
|
638 |
<p>ファイルの削除に対する強制アクセス制御のレベルを指定します。</p> |
639 |
|
640 |
<h3><a name="profile_CONFIG::file::mkdir">CONFIG::file::mkdir</a></h3> |
641 |
|
642 |
<p>ディレクトリの作成に対する強制アクセス制御のレベルを指定します。</p> |
643 |
|
644 |
<h3><a name="profile_CONFIG::file::rmdir">CONFIG::file::rmdir</a></h3> |
645 |
|
646 |
<p>ディレクトリの削除に対する強制アクセス制御のレベルを指定します。</p> |
647 |
|
648 |
<h3><a name="profile_CONFIG::file::mkfifo">CONFIG::file::mkfifo</a></h3> |
649 |
|
650 |
<p>名前付きパイプの作成に対する強制アクセス制御のレベルを指定します。</p> |
651 |
|
652 |
<h3><a name="profile_CONFIG::file::mksock">CONFIG::file::mksock</a></h3> |
653 |
|
654 |
<p>UNIXドメインソケットの作成に対する強制アクセス制御のレベルを指定します。</p> |
655 |
|
656 |
<h3><a name="profile_CONFIG::file::truncate">CONFIG::file::truncate</a></h3> |
657 |
|
658 |
<p>ファイルの切り詰めに対する強制アクセス制御のレベルを指定します。</p> |
659 |
|
660 |
<h3><a name="profile_CONFIG::file::symlink">CONFIG::file::symlink</a></h3> |
661 |
|
662 |
<p>シンボリックリンクの作成に対する強制アクセス制御のレベルを指定します。</p> |
663 |
|
664 |
<h3><a name="profile_CONFIG::file::rewrite">CONFIG::file::rewrite</a></h3> |
665 |
|
666 |
<p>ファイルの上書きに対する強制アクセス制御のレベルを指定します。</p> |
667 |
|
668 |
<h3><a name="profile_CONFIG::file::mkblock">CONFIG::file::mkblock</a></h3> |
669 |
|
670 |
<p>ブロック型デバイスファイルの作成に対する強制アクセス制御のレベルを指定します。</p> |
671 |
|
672 |
<h3><a name="profile_CONFIG::file::mkchar">CONFIG::file::mkchar</a></h3> |
673 |
|
674 |
<p>キャラクタ型デバイスファイルの作成に対する強制アクセス制御のレベルを指定します。</p> |
675 |
|
676 |
<h3><a name="profile_CONFIG::file::link">CONFIG::file::link</a></h3> |
677 |
|
678 |
<p>ハードリンクの作成に対する強制アクセス制御のレベルを指定します。</p> |
679 |
|
680 |
<h3><a name="profile_CONFIG::file::rename">CONFIG::file::rename</a></h3> |
681 |
|
682 |
<p>名称変更に対する強制アクセス制御のレベルを指定します。</p> |
683 |
|
684 |
<h3><a name="profile_CONFIG::file::chmod">CONFIG::file::chmod</a></h3> |
685 |
|
686 |
<p>ファイルのモードの変更に対する強制アクセス制御のレベルを指定します。</p> |
687 |
|
688 |
<h3><a name="profile_CONFIG::file::chown">CONFIG::file::chown</a></h3> |
689 |
|
690 |
<p>ファイルの所有者の変更に対する強制アクセス制御のレベルを指定します。</p> |
691 |
|
692 |
<h3><a name="profile_CONFIG::file::chgrp">CONFIG::file::chgrp</a></h3> |
693 |
|
694 |
<p>ファイルのグループの変更に対する強制アクセス制御のレベルを指定します。</p> |
695 |
|
696 |
<h3><a name="profile_CONFIG::file::ioctl">CONFIG::file::ioctl</a></h3> |
697 |
|
698 |
<p>IOCTL に対する強制アクセス制御のレベルを指定します。</p> |
699 |
|
700 |
<h3><a name="profile_CONFIG::file::chroot">CONFIG::file::chroot</a></h3> |
701 |
|
702 |
<p>ルートディレクトリの変更に対する強制アクセス制御のレベルを指定します。</p> |
703 |
|
704 |
<h3><a name="profile_CONFIG::file::mount">CONFIG::file::mount</a></h3> |
705 |
|
706 |
<p>マウントに対する強制アクセス制御のレベルを指定します。</p> |
707 |
|
708 |
<h3><a name="profile_CONFIG::file::unmount">CONFIG::file::unmount</a></h3> |
709 |
|
710 |
<p>アンマウントに対する強制アクセス制御のレベルを指定します。</p> |
711 |
|
712 |
<h3><a name="profile_CONFIG::file::pivot_root">CONFIG::file::pivot_root</a></h3> |
713 |
|
714 |
<p>ルートディレクトリの交換に対する強制アクセス制御のレベルを指定します。</p> |
715 |
|
716 |
<h3><a name="profile_CONFIG::misc::env">CONFIG::misc::env</a></h3> |
717 |
|
718 |
<p>プログラム実行時の環境変数名に対する強制アクセス制御のレベルを指定します。</p> |
719 |
|
720 |
<h3><a name="profile_CONFIG::capability::use_route">CONFIG::capability::use_route</a></h3> |
721 |
|
722 |
<p>ROUTE ソケットの使用に対する強制アクセス制御のレベルを指定します。</p> |
723 |
|
724 |
<h3><a name="profile_CONFIG::capability::use_packet">CONFIG::capability::use_packet</a></h3> |
725 |
|
726 |
<p>PACKET ソケットの使用に対する強制アクセス制御のレベルを指定します。</p> |
727 |
|
728 |
<h3><a name="profile_CONFIG::capability::use_kernel_module">CONFIG::capability::use_kernel_module</a></h3> |
729 |
|
730 |
<p>create_module(2) init_module(2) delete_module(2) の使用に対する強制アクセス制御のレベルを指定します。</p> |
731 |
|
732 |
<h3><a name="profile_CONFIG::capability::SYS_REBOOT">CONFIG::capability::SYS_REBOOT</a></h3> |
733 |
|
734 |
<p>reboot(2) の使用に対する強制アクセス制御のレベルを指定します。</p> |
735 |
|
736 |
<h3><a name="profile_CONFIG::capability::SYS_VHANGUP">CONFIG::capability::SYS_VHANGUP</a></h3> |
737 |
|
738 |
<p>vhangup(2) の使用に対する強制アクセス制御のレベルを指定します。</p> |
739 |
|
740 |
<h3><a name="profile_CONFIG::capability::SYS_TIME">CONFIG::capability::SYS_TIME</a></h3> |
741 |
|
742 |
<p>stime(2) settimeofday(2) adjtimex(2) の使用に対する強制アクセス制御のレベルを指定します。</p> |
743 |
|
744 |
<h3><a name="profile_CONFIG::capability::SYS_NICE">CONFIG::capability::SYS_NICE</a></h3> |
745 |
|
746 |
<p>nice(2) setpriority(2) の使用に対する強制アクセス制御のレベルを指定します。</p> |
747 |
|
748 |
<h3><a name="profile_CONFIG::capability::SYS_SETHOSTNAME">CONFIG::capability::SYS_SETHOSTNAME</a></h3> |
749 |
|
750 |
<p>sethostname(2) setdomainname(2) の使用に対する強制アクセス制御のレベルを指定します。</p> |
751 |
|
752 |
<h3><a name="profile_CONFIG::capability::SYS_KEXEC_LOAD">CONFIG::capability::SYS_KEXEC_LOAD</a></h3> |
753 |
|
754 |
<p>kexec_load(2) の使用に対する強制アクセス制御のレベルを指定します。</p> |
755 |
|
756 |
<h3><a name="profile_CONFIG::capability::SYS_PTRACE">CONFIG::capability::SYS_PTRACE</a></h3> |
757 |
|
758 |
<p>ptrace(2) の使用に対する強制アクセス制御のレベルを指定します。<br> |
759 |
|
760 |
<h3><a name="profile_CONFIG::network::inet_dgram_bind">CONFIG::network::inet_dgram_bind</a></h3> |
761 |
|
762 |
<p>UDP ソケットが使用するローカルアドレスに対する強制アクセス制御のレベルを指定します。</p> |
763 |
|
764 |
<h3><a name="profile_CONFIG::network::inet_dgram_send">CONFIG::network::inet_dgram_send</a></h3> |
765 |
|
766 |
<p>UDP ソケットが送信時に使用するリモートアドレスに対する強制アクセス制御のレベルを指定します。</p> |
767 |
|
768 |
<h3><a name="profile_CONFIG::network::inet_dgram_recv">CONFIG::network::inet_dgram_recv</a></h3> |
769 |
|
770 |
<p>UDP ソケットが受信時に使用するリモートアドレスに対する強制アクセス制御のレベルを指定します。</p> |
771 |
|
772 |
<h3><a name="profile_CONFIG::network::inet_stream_bind">CONFIG::network::inet_stream_bind</a></h3> |
773 |
|
774 |
<p>TCP ソケットの bind() 操作に対する強制アクセス制御のレベルを指定します。</p> |
775 |
|
776 |
<h3><a name="profile_CONFIG::network::inet_stream_listen">CONFIG::network::inet_stream_listen</a></h3> |
777 |
|
778 |
<p>TCP ソケットの listen() 操作に対する強制アクセス制御のレベルを指定します。</p> |
779 |
|
780 |
<h3><a name="profile_CONFIG::network::inet_stream_connect">CONFIG::network::inet_stream_connect</a></h3> |
781 |
|
782 |
<p>TCP ソケットの connect() 操作に対する強制アクセス制御のレベルを指定します。</p> |
783 |
|
784 |
<h3><a name="profile_CONFIG::network::inet_stream_accept">CONFIG::network::inet_stream_accept</a></h3> |
785 |
|
786 |
<p>TCP ソケットの accept() 操作に対する強制アクセス制御のレベルを指定します。</p> |
787 |
|
788 |
<h3><a name="profile_CONFIG::network::inet_raw_bind">CONFIG::network::inet_raw_bind</a></h3> |
789 |
|
790 |
<p>RAW ソケットが使用するローカルアドレスに対する強制アクセス制御のレベルを指定します。</p> |
791 |
|
792 |
<h3><a name="profile_CONFIG::network::inet_raw_send">CONFIG::network::inet_raw_send</a></h3> |
793 |
|
794 |
<p>RAW ソケットが送信時に使用するリモートアドレスに対する強制アクセス制御のレベルを指定します。</p> |
795 |
|
796 |
<h3><a name="profile_CONFIG::network::inet_raw_recv">CONFIG::network::inet_raw_recv</a></h3> |
797 |
|
798 |
<p>RAW ソケットが受信時に使用するリモートアドレスに対する強制アクセス制御のレベルを指定します。</p> |
799 |
|
800 |
<h3><a name="profile_CONFIG::network::unix_dgram_bind">CONFIG::network::unix_dgram_bind</a></h3> |
801 |
|
802 |
<p>同一ホスト内でのデータグラムソケットが使用するローカルアドレスに対する強制アクセス制御のレベルを指定します。</p> |
803 |
|
804 |
<h3><a name="profile_CONFIG::network::unix_dgram_send">CONFIG::network::unix_dgram_send</a></h3> |
805 |
|
806 |
<p>同一ホスト内でのデータグラムソケットが送信してよいリモートアドレスに対する強制アクセス制御のレベルを指定します。</p> |
807 |
|
808 |
<h3><a name="profile_CONFIG::network::unix_dgram_recv">CONFIG::network::unix_dgram_recv</a></h3> |
809 |
|
810 |
<p>同一ホスト内でのデータグラムソケットが受信してよいリモートアドレスに対する強制アクセス制御のレベルを指定します。</p> |
811 |
|
812 |
<h3><a name="profile_CONFIG::network::unix_stream_bind">CONFIG::network::unix_stream_bind</a></h3> |
813 |
|
814 |
<p>同一ホスト内でのストリームソケットが使用するローカルアドレスに対する強制アクセス制御のレベルを指定します。</p> |
815 |
|
816 |
<h3><a name="profile_CONFIG::network::unix_stream_listen">CONFIG::network::unix_stream_listen</a></h3> |
817 |
|
818 |
<p>同一ホスト内でのストリームソケットが待ち受けするローカルアドレスに対する強制アクセス制御のレベルを指定します。</p> |
819 |
|
820 |
<h3><a name="profile_CONFIG::network::unix_stream_connect">CONFIG::network::unix_stream_connect</a></h3> |
821 |
|
822 |
<p>同一ホスト内でのストリームソケットが接続するリモートアドレスに対する強制アクセス制御のレベルを指定します。</p> |
823 |
|
824 |
<h3><a name="profile_CONFIG::network::unix_stream_accept">CONFIG::network::unix_stream_accept</a></h3> |
825 |
|
826 |
<p>同一ホスト内でのストリームソケットが受け付けるリモートアドレスに対する強制アクセス制御のレベルを指定します。</p> |
827 |
|
828 |
<h3><a name="profile_CONFIG::network::unix_seqpacket_bind">CONFIG::network::unix_seqpacket_bind</a></h3> |
829 |
|
830 |
<p>同一ホスト内での SEQPACKET ソケットが使用するローカルアドレスに対する強制アクセス制御のレベルを指定します。</p> |
831 |
|
832 |
<h3><a name="profile_CONFIG::network::unix_seqpacket_listen">CONFIG::network::unix_seqpacket_listen</a></h3> |
833 |
|
834 |
<p>同一ホスト内での SEQPACKET ソケットが待ち受けするローカルアドレスに対する強制アクセス制御のレベルを指定します。</p> |
835 |
|
836 |
<h3><a name="profile_CONFIG::network::unix_seqpacket_connect">CONFIG::network::unix_seqpacket_connect</a></h3> |
837 |
|
838 |
<p>同一ホスト内での SEQPACKET ソケットが接続するリモートアドレスに対する強制アクセス制御のレベルを指定します。</p> |
839 |
|
840 |
<h3><a name="profile_CONFIG::network::unix_seqpacket_accept">CONFIG::network::unix_seqpacket_accept</a></h3> |
841 |
|
842 |
<p>同一ホスト内での SEQPACKET ソケットが受け付けるリモートアドレスに対する強制アクセス制御のレベルを指定します。</p> |
843 |
|
844 |
<h3><a name="profile_CONFIG::ipc::signal">CONFIG::ipc::signal</a></h3> |
845 |
|
846 |
<p>シグナルの送信に対する強制アクセス制御のレベルを指定します。</p> |
847 |
|
848 |
<h3><a name="profile_PREFERENCE">PREFERENCE</a></h3> |
849 |
|
850 |
<p>アクセスログ/学習モード/強制モードに関する設定を指定します。</p> |
851 |
|
852 |
<p>max_grant_log= にはカーネル内に保持する、ポリシーによって許可されたアクセス要求のログの件数を指定します。</p> |
853 |
|
854 |
<p>max_reject_log= にはカーネル内に保持する、ポリシーによって許可されなかったアクセス要求のログの件数を指定します。</p> |
855 |
|
856 |
<p>max_learning_entry= には学習モードで自動的に追加されるアクセス許可の上限を指定します。</p> |
857 |
|
858 |
<p>enforcing_penalty= には強制モードでポリシー違反が発生した場合にスリープさせる時間を 0.1 秒単位で指定します。</p> |
859 |
|
860 |
<h2><a name="domain_policy">/proc/ccs/domain_policy</a></h2> |
861 |
|
862 |
<p>このファイルでは、全てのドメインを定義し、各ドメインに対して与えるアクセス許可を定義します。</p> |
863 |
|
864 |
<p>ドメインを定義している行( <kernel> で始まる行)の次行から次のドメインを定義している行の前行までが、そのドメインに対するアクセス許可です。</p> |
865 |
|
866 |
<p>それぞれのアクセス許可について、必要に応じて追加の条件を指定することができます。そのための構文は<a href="#conditional_acl">条件付きアクセス許可の指定</a>で説明します。さらに、必要に応じてアクセスを許可するのと同時にドメイン遷移を行うための方法を<a href="#transit_on_match">アクセスを許可するのと同時にドメイン遷移を行う</a>で説明します。</p> |
867 |
|
868 |
<p>現在のドメインポリシーを読み出しまたは追加または削除するには、以下のように操作します。</p> |
869 |
<p>(例)ドメインを選択してアクセス許可を追加(ドメインが存在しない場合は作成されます)<br> |
870 |
printf "<kernel> /sbin/init\nfile read /etc/passwd\n" | ccs-loadpolicy -d</p> |
871 |
<p>(例)ドメインを選択してアクセス許可を追加(ドメインが存在しない場合は作成されません)<br> |
872 |
printf "select <kernel> /sbin/init\nfile read /etc/passwd\n" | ccs-loadpolicy -d</p> |
873 |
<p>(例)ドメインを選択してアクセス許可を削除<br> |
874 |
printf "select <kernel> /sbin/init\ndelete file read /etc/passwd\ndelete file read /etc/shadow\n" | ccs-loadpolicy -d</p> |
875 |
<p>(例)特定のドメインを削除<br> |
876 |
printf "delete <kernel> /sbin/init\n" | ccs-loadpolicy -d</p> |
877 |
<p>(例)ドメインポリシーの読み出し<br> |
878 |
cat /proc/ccs/domain_policy</p> |
879 |
|
880 |
<p>関連項目:<a href="#policy_file_modifiers">変更について</a></p> |
881 |
|
882 |
<h3><a name="domain_policy_file_execute">file execute</a></h3> |
883 |
<p>指定されたパス名を実行することを許可します。</p> |
884 |
<p>(例) file execute /bin/ls</p> |
885 |
<p>関連項目:<a href="#domain_transition">ドメイン遷移</a> <a href="#exception_policy_aggregator">aggregator</a></p> |
886 |
|
887 |
<h3><a name="domain_policy_file_write">file write</a></h3> |
888 |
<p>指定されたパス名を書き込みモードでオープンすることを許可します。</p> |
889 |
<p>(例) file write /dev/null</p> |
890 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
891 |
|
892 |
<h3><a name="domain_policy_file_read">file read</a></h3> |
893 |
<p>指定されたパス名を読み込みモードでオープンすることを許可します。</p> |
894 |
<p>(例) file read /proc/meminfo</p> |
895 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
896 |
|
897 |
<h3><a name="domain_policy_append">file append</a></h3> |
898 |
<p>指定されたパス名を追記モードでオープンすることを許可します。</p> |
899 |
<p>(例) file append /dev/null</p> |
900 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
901 |
|
902 |
<h3><a name="domain_policy_file_create">file create</a></h3> |
903 |
<p>指定されたパス名のファイルを新規作成することを許可します。</p> |
904 |
<p>(例) file create /var/lock/subsys/crond</p> |
905 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
906 |
|
907 |
<h3><a name="domain_policy_file_unlink">file unlink</a></h3> |
908 |
<p>指定されたパス名を削除することを許可します。</p> |
909 |
<p>(例) file unlink /var/lock/subsys/crond</p> |
910 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
911 |
|
912 |
<h3><a name="domain_policy_file_mkdir">file mkdir</a></h3> |
913 |
<p>パス名で指定されたディレクトリを作成することを許可します。</p> |
914 |
<p>(例) file mkdir /tmp/logwatch.\*/</p> |
915 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
916 |
|
917 |
<h3><a name="domain_policy_file_rmdir">file rmdir</a></h3> |
918 |
<p>ディレクトリの削除を許可します。</p> |
919 |
<p>(例) file rmdir /tmp/logwatch.\*/</p> |
920 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
921 |
|
922 |
<h3><a name="domain_policy_file_mkfifo">file mkfifo</a></h3> |
923 |
<p>FIFO の作成を許可します。</p> |
924 |
<p>(例) file mkfifo /dev/initctl</p> |
925 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
926 |
|
927 |
<h3><a name="domain_policy_file_mksock">file mksock</a></h3> |
928 |
<p>UNIX ドメインソケットの作成を許可します。</p> |
929 |
<p>(例) file mksock /dev/log</p> |
930 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
931 |
|
932 |
<h3><a name="domain_policy_file_mkblock">file mkblock</a></h3> |
933 |
<p>ブロック型デバイスファイルの作成を許可します。</p> |
934 |
<p>(例) file mkblock /dev/\*</p> |
935 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
936 |
|
937 |
<h3><a name="domain_policy_file_mkchar">file mkchar</a></h3> |
938 |
<p>キャラクタ型デバイスファイルの作成を許可します。</p> |
939 |
<p>(例) file mkchar /dev/\*</p> |
940 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
941 |
|
942 |
<h3><a name="domain_policy_file_truncate">file truncate</a></h3> |
943 |
<p>ファイルの切り詰めと伸長を許可します。</p> |
944 |
<p>(例) file truncate /etc/mtab</p> |
945 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
946 |
|
947 |
<h3><a name="domain_policy_file_symlink">file symlink</a></h3> |
948 |
<p>シンボリックリンクの作成を許可します。</p> |
949 |
<p>(例) file symlink /dev/cdrom</p> |
950 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
951 |
|
952 |
<h3><a name="domain_policy_file_link">file link</a></h3> |
953 |
<p>ハードリンクの作成を許可します。</p> |
954 |
<p>(例) file link /etc/mtab~\$ /etc/mtab~</p> |
955 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
956 |
|
957 |
<h3><a name="domain_policy_file_rename">file rename</a></h3> |
958 |
<p>ファイル名の変更を許可します。</p> |
959 |
<p>(例) file rename /etc/mtab.tmp /etc/mtab</p> |
960 |
<p>関連項目: <a href="#exception_policy_path_group">path_group</a></p> |
961 |
|
962 |
<h3><a name="domain_policy_file_ioctl">file ioctl</a></h3> |
963 |
|
964 |
<p>IOCTL 要求で指定可能なコマンド番号を指定するには、 file ioctl というキーワードに続けて、パス名とコマンド番号を指定します。パス名にはパターンおよびパス名のグループも使用できます。</p> |
965 |
|
966 |
<p>関連項目: <a href="#conditional_acl">条件付きアクセス許可の指定</a></p> |
967 |
|
968 |
<table border="1"> |
969 |
<tr><td>指定例</td><td>許可されるアクセス</td></tr> |
970 |
<tr><td>file ioctl socket:[family=2:type=2:protocol=17] 35093</td><td>アドレスファミリーが 2 、種別が 2 、プロトコルが 17 のソケットに対して 35093 番の IOCTL 要求を許可</td></tr> |
971 |
<tr><td>file ioctl /dev/null 10000-20000</td><td>/dev/null に対して 10000 ~ 20000 番の IOCTL 要求を許可</td></tr> |
972 |
</table> |
973 |
|
974 |
<p>IOCTL 要求のコマンド番号の意味については、 IOCTL 機能を提供しているモジュールの説明を参照してください。例えば、 i386 環境において 21585 番の IOCTL 要求は close-on-exec フラグをセットするための FIOCLEX コマンドを指します。例えば、ソケットに対する 35088 番の IOCTL 要求は、ネットワークインターフェースの名前を取得する SIOCGIFNAME コマンドを指します。</p> |
975 |
|
976 |
<h3><a name="domain_policy_file_mount">file mount</a></h3> |
977 |
<p>マウント許可を指定するには、 file mount というキーワードに続けて、「デバイスファイル マウントポイント ファイルシステム オプション」を指定します。 デバイスファイルを必要とするファイルシステムを指定する場合は、デバイスファイルは正規化されたファイル名でなければいけません。マウントポイントは正規化されたファイル名でなければいけません。オプションは 16 進数の数値で指定します。</p> |
978 |
|
979 |
<p>「 any マウントポイント --remount オプション」と指定すると、「 mount -o remount マウントポイント」が許可されます。</p> |
980 |
|
981 |
<p>「複製元 複製先 --bind オプション」と指定すると、「 mount --bind 複製元 複製先」が許可されます。<br> |
982 |
「移動元 移動先 --move オプション」と指定すると、「 mount --move 移動元 移動先」が許可されます。<br> |
983 |
複製元/複製先/移動元/移動先は正規化されたディレクトリ名でなければなりません。</p> |
984 |
|
985 |
<p>カーネル 2.6.15 以降では、 Shared Subtree という機能が利用できます。<br> |
986 |
「 any マウントポイント --make-unbindable オプション」と指定すると、「 mount --make-unbindable マウントポイント」が許可されます。<br> |
987 |
「 any マウントポイント --make-private オプション」と指定すると、「 mount --make-private マウントポイント」が許可されます。<br> |
988 |
「 any マウントポイント --make-slave オプション」と指定すると、「 mount --make-slave マウントポイント」が許可されます。<br> |
989 |
「 any マウントポイント --make-shared オプション」と指定すると、「 mount --make-shared マウントポイント」が許可されます。</p> |
990 |
|
991 |
<p>(例)<br> |
992 |
file mount none /dev/pts/ devpts 0x0<br> |
993 |
file mount /proc /proc/ proc 0x0<br> |
994 |
file mount usbdevfs /proc/bus/usb/ usbdevfs 0x0<br> |
995 |
file mount none /data/ tmpfs 0xE<br> |
996 |
file mount none /dev/shm/ tmpfs 0xE<br> |
997 |
file mount /dev/hdc /var/www/ ext2 0xF<br> |
998 |
file mount any / --remount 0x0</p> |
999 |
|
1000 |
<h3><a name="domain_policy_file_unmount">file unmount</a></h3> |
1001 |
<p>アンマウント許可を指定するには、 file unmount というキーワードに続けて、アンマウントを許可する正規化されたディレクトリ名を指定します。</p> |
1002 |
|
1003 |
<p>(例)<br> |
1004 |
file unmount /mnt/cdrom/</p> |
1005 |
|
1006 |
<h3><a name="domain_policy_file_chroot">file chroot</a></h3> |
1007 |
<p>chroot 許可を指定するには、 file chroot というキーワードに続けて、 chroot で移動することを許可したい正規化されたディレクトリ名を指定します。<br> |
1008 |
通常、 sshd が使用する /var/empty/sshd/ を指定します。 その他に chroot 環境で動かしたいアプリケーションや、 chroot を行うアプリケーション( vsftpd の場合 /usr/share/empty/ )が存在する場合は、それらも指定します。</p> |
1009 |
|
1010 |
<p>(例)<br> |
1011 |
file chroot /var/empty/sshd/<br> |
1012 |
file chroot /usr/share/empty/<br> |
1013 |
file chroot /var/www/html/<br> |
1014 |
file chroot /</p> |
1015 |
|
1016 |
<h3><a name="domain_policy_file_pivot_root">file pivot_root</a></h3> |
1017 |
<p>pivot_root 許可を指定するには、 file pivot_root というキーワードに続けて、新しいルートとなる正規化されたディレクトリ名と古いルートディレクトリとなる正規化されたディレクトリ名を指定します。<br> |
1018 |
通常、このキーワードを使う必要はありません。</p> |
1019 |
|
1020 |
<h3><a name="domain_policy_misc_env">misc env</a></h3> |
1021 |
|
1022 |
<p>環境変数名を制限するには、 misc env というキーワードに続けて、「環境変数名」を指定します。</p> |
1023 |
|
1024 |
<p>プログラムを実行する関数である execve() には filename と argv[] と envp[] を渡すことができます。多くのプログラムは envp[] の内容によって振る舞いを変化させます。</p> |
1025 |
<p>このキーワードの目的は、実行されるプログラムに渡される環境変数を制限することです。</p> |
1026 |
|
1027 |
<h3><a name="domain_policy_capability">capability</a></h3> |
1028 |
|
1029 |
<p>ケイパビリティのアクセス許可を指定するには、 capability というキーワードに続けて、ケイパビリティを指定します。以下のケイパビリティが指定できます。</p> |
1030 |
|
1031 |
<table border="1"> |
1032 |
<tr><td>capability use_route</td><td>ROUTE ソケットの使用を許可</td></tr> |
1033 |
<tr><td>capability use_packet</td><td>PACKET ソケットの使用を許可</td></tr> |
1034 |
<tr><td>capability use_kernel_module</td><td>create_module(2) init_module(2) delete_module(2) の使用を許可</td></tr> |
1035 |
<tr><td>capability SYS_REBOOT</td><td>reboot(2) の使用を許可</td></tr> |
1036 |
<tr><td>capability SYS_VHANGUP</td><td>vhangup(2) の使用を許可</td></tr> |
1037 |
<tr><td>capability SYS_TIME</td><td>stime(2) settimeofday(2) adjtimex(2) の使用を許可</td></tr> |
1038 |
<tr><td>capability SYS_NICE</td><td>nice(2) setpriority(2) の使用を許可</td></tr> |
1039 |
<tr><td>capability SYS_SETHOSTNAME</td><td>sethostname(2) setdomainname(2) の使用を許可</td></tr> |
1040 |
<tr><td>capability SYS_KEXEC_LOAD</td><td>kexec_load(2) の使用を許可</td></tr> |
1041 |
<tr><td>capability SYS_PTRACE</td><td>ptrace(2) の使用を許可</td></tr> |
1042 |
</table> |
1043 |
|
1044 |
<h3><a name="domain_policy_network">network</a></h3> |
1045 |
|
1046 |
<p>ネットワークのアクセス許可を指定するには、 network というキーワードに続けて、プロトコル( TCP UDP RAW の何れか)、 IP アドレス、ポート番号( TCP UDP の場合)またはプロトコル番号( RAW の場合)を指定します。 IPv4 プロトコルおよび IPv6 プロトコルで使用するローカルポート番号が対象です。</p> |
1047 |
<table border="1"> |
1048 |
<tr><td>キーワード</td><td>許可されるアクセス</td><td>指定例</td></tr> |
1049 |
<tr><td>network inet stream bind</td><td>ローカルの TCP アドレス/ポートの割り当て</td><td>network inet stream bind 0.0.0.0 80</td></tr> |
1050 |
<tr><td>network inet stream listen</td><td>ローカルの TCP アドレス/ポートでの待機</td><td>network inet stream listen 0.0.0.0 80</td></tr> |
1051 |
<tr><td>network inet stream accept</td><td>リモートの TCP アドレス/ポートからの接続受付および通信</td><td>network inet stream accept 10.0.0.0-10.255.255.255 1024-65535</td></tr> |
1052 |
<tr><td>network inet stream connect</td><td>リモートの TCP アドレス/ポートへの接続および通信</td><td>network inet stream connect 127.0.0.1 1024-65535</td></tr> |
1053 |
<tr><td>network inet dgram bind</td><td>ローカルの UDP アドレス/ポートの割り当て</td><td>network inet dgram bind 0.0.0.0 53</td></tr> |
1054 |
|
1055 |
<tr><td>network inet dgram send</td><td>指定されたアドレス/ポート番号への UDP パケットの送信</td><td>network inet dgram send 127.0.0.1 53</td></tr> |
1056 |
<tr><td>network inet dgram recv</td><td>指定されたアドレス/ポート番号からの UDP パケットの受信</td><td>network inet dgram recv 127.0.0.1 53</td></tr> |
1057 |
<tr><td>network inet raw bind</td><td>ローカルの IP アドレス/プロトコルの割り当て</td><td>network inet raw bind 127.0.0.1 255</td></tr> |
1058 |
<tr><td>network inet raw send</td><td>指定されたアドレス/ポート番号への IP パケットの送信</td><td>network inet raw send 10.0.0.1 1</td></tr> |
1059 |
<tr><td>network inet raw recv</td><td>指定されたアドレス/ポート番号からの IP パケットの受信</td><td>network inet raw recv 10.0.0.1 1</td></tr> |
1060 |
</table> |
1061 |
<p>IPv6 で使われる "::" という表記はサポートされていません。 "::1" ではなく "0:0:0:0:0:0:0:1" のように表記する必要があります。</p> |
1062 |
|
1063 |
<p>同じIPアドレスを繰り返し指定する手間を避けるために、パス名と同様にグループ化を行うことができます。</p> |
1064 |
|
1065 |
<p>関連項目: <a href="#exception_policy_address_group">address_group</a></p> |
1066 |
|
1067 |
<h3><a name="domain_policy_ipc_signal">ipc signal</a></h3> |
1068 |
|
1069 |
<p>シグナルのアクセス許可を指定するには、 ipc signal というキーワードに続けて、シグナルの番号および操作対象ドメインを指定します。<br> |
1070 |
例外が 2 つ存在します。シグナル番号が 0 の場合は常に許可されます。また、自分の属するドメインへのシグナルの場合には常に許可されます。<br> |
1071 |
その他の場合、このファイルに指定されたシグナル番号とドメイン名で始まる場合のみそのシグナルを送信できます。<br> |
1072 |
操作対象ドメインとして <kernel> を指定すると、全てのドメインに指定された番号のシグナルを送信できます。</p> |
1073 |
|
1074 |
<h3><a name="domain_policy_use_profile">use_profile</a></h3> |
1075 |
|
1076 |
<p>これは、このドメインに対して割り当てられているプロファイル番号を示しています。プロファイル番号は 0 ~ 255 の値をとります。</p> |
1077 |
|
1078 |
<h3><a name="domain_policy_use_group">use_group</a></h3> |
1079 |
|
1080 |
<p>これは、このドメインに対して割り当てられているグループ番号を示しています。グループ番号は 0 ~ 255 の値をとります。</p> |
1081 |
|
1082 |
<h3><a name="domain_policy_task_auto_execute_handler">task auto_execute_handler</a></h3> |
1083 |
|
1084 |
<p>これは、このドメインに対しては常にこのキーワードで指定されたプログラムだけを実行することを示しています。特定のドメインで実行されるプログラムの実行要求を全て特定のプログラムを経由して起動させたい場合に使います。</p> |
1085 |
|
1086 |
<p>このキーワードが指定されている場合、 <a href="#profile_CONFIG::file::execute">CONFIG::file::execute</a> の値に関わらず常にこのキーワードで指定されたプログラムが実行されます。そのため、このキーワードに適切なプログラムへのパス名が指定されていなかった場合、このキーワードが指定されているドメインからは一切のプログラムを実行できなくなります。</p> |
1087 |
|
1088 |
<p>関連項目: <a href="#domain_policy_task_denied_execute_handler">task denied_execute_handler</a> <a href="#profile_CONFIG::file::execute">CONFIG::file::execute</a> <a href="#domain_policy_file_execute">file execute</a></p> |
1089 |
|
1090 |
<h3><a name="domain_policy_task_denied_execute_handler">task denied_execute_handler</a></h3> |
1091 |
|
1092 |
<p>これは、 <a href="#profile_CONFIG::file::execute">CONFIG::file::execute</a> が enforcing の状態に於いて許可されていないプログラムの実行が要求された場合には、常にこのキーワードで指定されたプログラムを実行することを示しています。このキーワードが指定されていない場合、 <a href="#profile_CONFIG::file::execute">CONFIG::file::execute</a> が enforcing の状態に於いて許可されていないプログラムの実行が要求された場合にはプログラムの実行を拒否します。</p> |
1093 |
|
1094 |
<p>ただし、ドメインに対して <a href="#domain_policy_task_auto_execute_handler">task auto_execute_handler</a> キーワードが指定されている場合、このキーワードは無視されます。</p> |
1095 |
|
1096 |
<h3><a name="domain_policy_quota_exceeded">quota_exceeded</a></h3> |
1097 |
|
1098 |
<p>これは、学習モードで動作中にアクセス許可の数が <a href="#profile_PREFERENCE">PREFERENCE</a> で指定された値に到達したため、このドメインに対してはアクセス許可を学習しきれなかったことを示しています。チューニングを行うなどしてアクセス許可の数を減らすようにしてください。</p> |
1099 |
|
1100 |
<p>関連項目: <a href="#profile_PREFERENCE">PREFERENCE</a></p> |
1101 |
|
1102 |
<h3><a name="domain_policy_transition_failed">transition_failed</a></h3> |
1103 |
|
1104 |
<p>これは、このドメインに属しているプロセスが、プログラムの実行時にドメイン遷移をすることができなかったことを示しています。</p> |
1105 |
|
1106 |
<p>このドメインに対して <a href="#profile_CONFIG::file::execute">CONFIG::file::execute</a>=enforcing のプロファイルが割り当てられていた場合、プログラムの実行要求は拒否されます。</p> |
1107 |
|
1108 |
<p>そうではない場合、プログラムの実行要求は拒否されません。そのため、ドメイン遷移をせずにプログラムが実行されます。ドメイン遷移が失敗した理由は「遷移先ドメインのドメイン名が長すぎる」または「遷移先ドメインのためのメモリを割り当てることができなかった」のどちらかであるため、このドメインに対して <a href="#profile_CONFIG::file::execute">CONFIG::file::execute</a>=enforcing のプロファイルを割り当てる予定がある場合には、「ドメイン遷移を抑制する」または「メモリ割り当て量を増やす」ようにしてください。</p> |
1109 |
|
1110 |
<p>関連項目: <a href="#exception_policy_keep_domain">keep_domain</a> <a href="#memory_usage_infomation">メモリ使用量に関する情報</a></p> |
1111 |
|
1112 |
<h2><a name="exception_policy">/proc/ccs/exception_policy</a></h2> |
1113 |
|
1114 |
<p>現在の例外ポリシーを読み出しまたは追加または削除するには以下のように操作します。</p> |
1115 |
<p>(例)<br> |
1116 |
echo 'acl_group 0 file read proc:/self/stat' | ccs-loadpolicy -e<br> |
1117 |
echo 'delete acl_group 0 file read proc:/self/stat' | ccs-loadpolicy -e<br> |
1118 |
cat /proc/ccs/exception_policy</p> |
1119 |
|
1120 |
<p>関連項目: <a href="#policy_file_modifiers">変更について</a></p> |
1121 |
|
1122 |
<h3><a name="exception_policy_path_group">path_group</a></h3> |
1123 |
|
1124 |
<p>パス名のグループを定義するには、 path_group というキーワードに続けて、グループ名とパス名のパターンを指定します。<br> |
1125 |
例えば、ホームディレクトリ以下の全ファイルをまとめたい場合、</p> |
1126 |
|
1127 |
<table border="1"> |
1128 |
<tr><td> |
1129 |
path_group HOME-DIR-FILE /home/\*/\*<br> |
1130 |
path_group HOME-DIR-FILE /home/\*/\{\*\}/\* |
1131 |
</td></tr> |
1132 |
</table> |
1133 |
|
1134 |
<p>のように定義しておくことで、ドメインポリシーのファイルに対するアクセス許可を指定する際に</p> |
1135 |
|
1136 |
<table border="1"> |
1137 |
<tr><td> |
1138 |
file read @HOME-DIR-FILE |
1139 |
</td></tr> |
1140 |
</table> |
1141 |
|
1142 |
<p>のように指定できます。</p> |
1143 |
|
1144 |
<h3><a name="exception_policy_number_group">number_group</a></h3> |
1145 |
|
1146 |
<p>数値のグループを定義するには、 number_group というキーワードに続けて、グループ名と数値の範囲を指定します。<br> |
1147 |
例えば、 0644 と 0664 をまとめたい場合、</p> |
1148 |
|
1149 |
<table border="1"> |
1150 |
<tr><td> |
1151 |
number_group CREATE_MODES 0644<br> |
1152 |
number_group CREATE_MODES 0664 |
1153 |
</td></tr> |
1154 |
</table> |
1155 |
|
1156 |
<p>のように定義しておくことで、ドメインポリシーのアクセス許可を指定する際に</p> |
1157 |
|
1158 |
<table border="1"> |
1159 |
<tr><td> |
1160 |
file create /tmp/file @CREATE_MODES |
1161 |
</td></tr> |
1162 |
</table> |
1163 |
|
1164 |
<p>のように指定できます。</p> |
1165 |
|
1166 |
<h3><a name="exception_policy_address_group">address_group</a></h3> |
1167 |
|
1168 |
<p>アドレスのグループを定義するには、 address_group というキーワードに続けて、グループ名と IP アドレスのパターンを指定します。<br> |
1169 |
例えば、ローカルアドレスをまとめたい場合、</p> |
1170 |
|
1171 |
<table border="1"> |
1172 |
<tr><td> |
1173 |
address_group local-address 10.0.0.0-10.255.255.255<br> |
1174 |
address_group local-address 172.16.0.0-172.31.255.255<br> |
1175 |
address_group local-address 192.168.0.0-192.168.255.255 |
1176 |
</td></tr> |
1177 |
</table> |
1178 |
|
1179 |
<p>のように定義しておくことで、ドメインポリシーのネットワークに対するアクセス許可を指定する際に</p> |
1180 |
|
1181 |
<table border="1"> |
1182 |
<tr><td> |
1183 |
network inet stream accept @local-address 1024-65535 |
1184 |
</td></tr> |
1185 |
</table> |
1186 |
|
1187 |
<p>のように指定できます。</p> |
1188 |
|
1189 |
<h3><a name="exception_policy_acl_group">acl_group</a></h3> |
1190 |
|
1191 |
<p>ドメイン用ポリシーの use_group キーワードにより参照されるアクセス許可を指定するには、 acl_group というキーワードに続けてグループ番号およびドメイン用ポリシーで指定可能なアクセス許可を指定します。</p> |
1192 |
<p>例えば、 acl_group 0 file read /dev/null という指定をすると、 use_group 0 という指定がされているドメインに対しては file read /dev/null というアクセス許可が与えられた状態になります。</p> |
1193 |
|
1194 |
<h3><a name="exception_policy_aggregator">aggregator</a></h3> |
1195 |
|
1196 |
<p>複数のプログラムを単一のプログラム名で扱うには、 aggregator というキーワードに続けて集約前のプログラム名と集約後のプログラム名を指定します。このキーワードの目的は、同様のプログラムを集約することです。</p> |
1197 |
<p>例えば、 /usr/bin/tac と /bin/cat は似ているので、 aggregator /usr/bin/tac /bin/cat という指定をすることで /usr/bin/tac を /bin/cat のドメインで実行することができるようになります。</p> |
1198 |
|
1199 |
<p>関連項目: <a href="#domain_policy_file_execute">file execute</a></p> |
1200 |
|
1201 |
<h3><a name="exception_policy_initialize_domain">initialize_domain</a></h3> |
1202 |
|
1203 |
<p>特定のプログラムが実行された場合にドメイン遷移を初期化させるには、 initialize_domain というキーワードを使用します。</p> |
1204 |
|
1205 |
<ul> |
1206 |
<li>initialize_domain プログラム名 from ドメイン名 |
1207 |
<li>initialize_domain プログラム名 from ドメイン名の最後のプログラム名 |
1208 |
<li>initialize_domain プログラム名 from any |
1209 |
</ul> |
1210 |
|
1211 |
<p>ドメイン名が <kernel> で始まらない場合は、ドメイン名の最後のプログラム名が一致する全てのドメインに適用されます。</p> |
1212 |
|
1213 |
<p>このキーワードの目的は、常駐型プログラムや必要に応じてカーネルから起動されるプログラムを、通常とは異なるドメインに遷移させることで、ドメイン遷移を集約することです。</p> |
1214 |
|
1215 |
<p>関連項目:<a href="#domain_transition">ドメイン遷移</a> <a href="#exception_policy_no_initialize_domain">no_initialize_domain</a></p> |
1216 |
|
1217 |
<h3><a name="exception_policy_no_initialize_domain">no_initialize_domain</a></h3> |
1218 |
|
1219 |
<p>initialize_domain の効力を打ち消すには、 no_initialize_domain というキーワードを指定します。</p> |
1220 |
|
1221 |
<ul> |
1222 |
<li>no_initialize_domain プログラム名 from ドメイン名 |
1223 |
<li>no_initialize_domain プログラム名 from ドメイン名の最後のプログラム名 |
1224 |
<li>no_initialize_domain プログラム名 from any |
1225 |
</ul> |
1226 |
|
1227 |
<p>このキーワードはドメイン遷移を初期化させたくない場合に使用します。</p> |
1228 |
|
1229 |
<p>関連項目:<a href="#domain_transition">ドメイン遷移</a> <a href="#exception_policy_initialize_domain">initialize_domain</a></p> |
1230 |
|
1231 |
<h3><a name="exception_policy_keep_domain">keep_domain</a></h3> |
1232 |
|
1233 |
<p>特定のドメインからプログラムが実行されてもドメイン遷移を行わないようにするには、 keep_domain というキーワードを使用します。</p> |
1234 |
|
1235 |
<ul> |
1236 |
<li>keep_domain プログラム名 from ドメイン名 |
1237 |
<li>keep_domain プログラム名 from ドメイン名の最後のプログラム名 |
1238 |
<li>keep_domain any from ドメイン名 |
1239 |
<li>keep_domain any from ドメイン名の最後のプログラム名 |
1240 |
</ul> |
1241 |
|
1242 |
<p>ドメイン名が <kernel> で始まらない場合は、ドメイン名の最後のプログラム名が一致する全てのドメインに適用されます。</p> |
1243 |
|
1244 |
<p>このキーワードの目的は、不要なドメイン遷移の発生を抑制することでドメイン数とメモリ消費を抑えることです。</p> |
1245 |
|
1246 |
<p>関連項目:<a href="#domain_transition">ドメイン遷移</a> <a href="#exception_policy_no_keep_domain">no_keep_domain</a></p> |
1247 |
|
1248 |
<h3><a name="exception_policy_no_keep_domain">no_keep_domain</a></h3> |
1249 |
|
1250 |
<p>keep_domain の効力を打ち消すには、 no_keep_domain というキーワードを指定します。</p> |
1251 |
|
1252 |
<ul> |
1253 |
<li>no_keep_domain プログラム名 from ドメイン名 |
1254 |
<li>no_keep_domain プログラム名 from ドメイン名の最後のプログラム名 |
1255 |
<li>no_keep_domain any from ドメイン名 |
1256 |
<li>no_keep_domain any from ドメイン名の最後のプログラム名 |
1257 |
</ul> |
1258 |
|
1259 |
<p>このキーワードはドメイン遷移を行わせたい場合に使用します。</p> |
1260 |
|
1261 |
<p>関連項目:<a href="#domain_transition">ドメイン遷移</a> <a href="#exception_policy_keep_domain">keep_domain</a></p> |
1262 |
|
1263 |
<h3><a name="exception_policy_deny_autobind">deny_autobind</a></h3> |
1264 |
|
1265 |
<p>ローカルポートの自動選択で特定のポート番号が選択させるのを禁止するには、 deny_autobind というキーワードに続けて、ローカルポート番号を指定します。 |
1266 |
このキーワードは、特定のポート番号が一時的な用途で割り当てられるのを防ぐのが狙いです。例えば、一部のプロキシサーバはポート 8080 を使用するので、ポート 8080 が一時的な用途のために割り当てられるべきではありません。</p> |
1267 |
|
1268 |
<p>(例)<br> |
1269 |
deny_autobind 1-1023<br> |
1270 |
deny_autobind 8080</p> |
1271 |
|
1272 |
<h2><a name="query">/proc/ccs/query</a></h2> |
1273 |
|
1274 |
<p>強制モードで動作中にポリシー違反が発生した場合に、そのアクセス要求を個別に許可するかどうかの指定を行うために使用します。強制モードでポリシー違反が発生した場合、 ccs-queryd を用いて対話的に諾否を指定できます。</p> |
1275 |
|
1276 |
<h2><a name="manager">/proc/ccs/manager</a></h2> |
1277 |
|
1278 |
<p>ポリシーの読み書きを行えるプログラムまたはドメインの一覧を取得または追加します。</p> |
1279 |
|
1280 |
<h3><a name="manager_manage_by_non_root">manage_by_non_root</a></h3> |
1281 |
|
1282 |
<p>デフォルトではユーザIDと実効ユーザIDの両方が 0 であるプロセスだけがポリシーを変更できますが、非 root ユーザによる変更を認めたい場合に使用します。</p> |
1283 |
|
1284 |
<h2><a name=".domain_status">/proc/ccs/.domain_status</a></h2> |
1285 |
|
1286 |
<p>setprofile コマンドが行単位での処理を行いやすくするために domain_policy の内容からプロファイル番号とドメイン名の部分だけを抽出したもの。DBMSのビューに相当する機能を提供します。</p> |
1287 |
|
1288 |
<h2><a name="meminfo">/proc/ccs/meminfo</a></h2> |
1289 |
|
1290 |
<p>TOMOYO Linux がポリシーを保持するために使用しているカーネルのメモリ情報を取得します。</p> |
1291 |
<p>(例)<br> |
1292 |
cat /proc/ccs/meminfo<br></p> |
1293 |
|
1294 |
<h2><a name="grant_log">/proc/ccs/grant_log</a></h2> |
1295 |
|
1296 |
<p>ドメインポリシーに対するアクセス許可ログを取得します。取得すべきログが無い場合はすぐに戻ってくるので、ログが発生するまで待機させるには select(2) を使ってください。記憶できる件数は PREFERENCE の max_grant_log パラメータで指定されている件数までです。それ以上は記録されないので、随時読み出すようにする必要があります。</p> |
1297 |
<p>(例)<br> |
1298 |
cat /proc/ccs/grant_log</p> |
1299 |
|
1300 |
<h2><a name="reject_log">/proc/ccs/reject_log</a></h2> |
1301 |
|
1302 |
<p>ドメインポリシーに対するアクセス拒否ログを取得します。取得すべきログが無い場合はすぐに戻ってくるので、ログが発生するまで待機させるには select(2) を使ってください。記憶できる件数は PREFERENCE の max_reject_log パラメータで指定されている件数までです。それ以上は記録されないので、随時読み出すようにする必要があります。</p> |
1303 |
<p>(例)<br> |
1304 |
cat /proc/ccs/reject_log</p> |
1305 |
|
1306 |
<h2><a name="self_domain">/proc/ccs/self_domain</a></h2> |
1307 |
|
1308 |
<p>呼び出し元プロセスが属しているドメインの名前を取得します。</p> |
1309 |
<p>(例)<br> |
1310 |
cat /proc/ccs/self_domain</p> |
1311 |
|
1312 |
<h2><a name=".process_status">/proc/ccs/.process_status</a></h2> |
1313 |
|
1314 |
<p>ccs-pstree コマンド(「現在動作中のプロセス」と「そのプロセスが属しているドメイン」と「そのドメインに割り当てられているプロファイル番号」を pstree のように一覧表示する)のためのインタフェース。例外的にポリシーマネージャとして登録されていないプログラムでも書き込みを行える。</p> |
1315 |
|
1316 |
<h2><a name="version">/proc/ccs/version</a></h2> |
1317 |
|
1318 |
<p>TOMOYO Linux のバージョン番号を取得するためのインタフェースです。</p> |
1319 |
<p>(例)<br> |
1320 |
cat /proc/ccs/version</p> |
1321 |
|
1322 |
<h1>6. <a name="Advanced_Features">便利な機能</a></h1> |
1323 |
|
1324 |
<h2>6.1 <a name="non_root_policy_update">root 以外のユーザによるポリシーの変更を許可</a></h2> |
1325 |
|
1326 |
<p>デフォルトではユーザIDと実効ユーザIDの両方が 0 であるプロセスだけがポリシーを変更できますが、非 root ユーザによる変更を認めたい場合には</p> |
1327 |
|
1328 |
<table border="1"> |
1329 |
<tr><td> |
1330 |
# echo manage_by_non_root | /usr/sbin/ccs-loadpolicy -m |
1331 |
</td></tr> |
1332 |
</table> |
1333 |
|
1334 |
<p>のように manage_by_non_root というキーワードを書き込むことで、ユーザIDと実効ユーザIDのチェックを無効にすることができます。また、再びユーザIDと実効ユーザIDのチェックを有効にするには、</p> |
1335 |
|
1336 |
<table border="1"> |
1337 |
<tr><td> |
1338 |
# echo delete manage_by_non_root | /usr/sbin/ccs-loadpolicy -m |
1339 |
</td></tr> |
1340 |
</table> |
1341 |
|
1342 |
<p>のように delete manage_by_non_root というキーワードを書き込んでください。 /proc/ccs/ 以下のエントリの所有者は root なので、非 root ユーザによるアクセスを認めるためには必要に応じて chown/chmod を実行してください。<br> |
1343 |
起動時に自動的にこの処理が行われるようにするために、 /sbin/ccs-init は /etc/ccs/ccs-post-init というプログラムが存在する場合には /etc/ccs/ccs-post-init も実行するようになっています。よって、例えば demo ユーザが /proc/ccs/ インタフェースへの読み書きができるように設定したい場合は、</p> |
1344 |
|
1345 |
<table border="1"> |
1346 |
<tr><td> |
1347 |
#! /bin/sh<br> |
1348 |
echo manage_by_non_root > /proc/ccs/manager<br> |
1349 |
chown -R demo /proc/ccs/ |
1350 |
</td></tr> |
1351 |
</table> |
1352 |
|
1353 |
<p>という内容で /etc/ccs/ccs-post-init を作成し、</p> |
1354 |
|
1355 |
<table border="1"> |
1356 |
<tr><td> |
1357 |
# chmod 755 /etc/ccs/ccs-post-init<br> |
1358 |
# chown -R demo /etc/ccs/ |
1359 |
</td></tr> |
1360 |
</table> |
1361 |
|
1362 |
<p>を実行することで demo ユーザがポリシーのあるディレクトリへのアクセスとポリシーを編集するためのプログラムを実行できるようになります。</p> |
1363 |
|
1364 |
<h2>6.2 <a name="conditional_acl">条件付きアクセス許可の指定</a></h2> |
1365 |
|
1366 |
<p>アクセス許可にユーザID等に基づいた条件を付加することができます。条件は個々のアクセス許可の末尾に追加する形で指定します。</p> |
1367 |
|
1368 |
<table border="1"> |
1369 |
<tr><td>指定例</td><td>意味</td></tr> |
1370 |
<tr><td>file read /etc/passwd</td><td>/etc/passwd の参照を許可</td></tr> |
1371 |
<tr><td>file read /etc/passwd task.uid=0</td><td>プロセスのユーザIDが 0 の場合に限り、 /etc/passwd の参照を許可</td></tr> |
1372 |
<tr><td>file read /etc/passwd task.uid!=0</td><td>プロセスのユーザIDが 0 ではない場合に限り、 /etc/passwd の参照を許可</td></tr> |
1373 |
<tr><td>network inet stream connect 10.0.0.1 80</td><td>TCP プロトコルで 10.0.0.1 ポート 80 への接続を許可</td></tr> |
1374 |
<tr><td>network inet stream connect 10.0.0.1 80 task.uid=100</td><td>プロセスのユーザIDが 100 の場合に限り、 TCP プロトコルで 10.0.0.1 ポート 80 への接続を許可</td></tr> |
1375 |
<tr><td>capability SYS_PTRACE</td><td>ptrace(2) の使用を許可</td></tr> |
1376 |
<tr><td>capability SYS_PTRACE task.ppid=1 task.uid=0 task.euid=0</td><td>親プロセスが /sbin/init であり、かつ、プロセスのユーザIDと実効ユーザIDが 0 の場合に限り、 ptrace(2) の使用を許可</td></tr> |
1377 |
</table> |
1378 |
|
1379 |
<p>以下の変数を指定できます。</p> |
1380 |
|
1381 |
<table border="1"> |
1382 |
<tr><td>変数</td><td>意味</td></tr> |
1383 |
<tr><td>task.uid</td><td>呼び出したプロセスのユーザID</td></tr> |
1384 |
<tr><td>task.euid</td><td>呼び出したプロセスの実効ユーザID</td></tr> |
1385 |
<tr><td>task.suid</td><td>呼び出したプロセスの保存ユーザID</td></tr> |
1386 |
<tr><td>task.fsuid</td><td>呼び出したプロセスのファイルシステムユーザID</td></tr> |
1387 |
<tr><td>task.gid</td><td>呼び出したプロセスのグループID</td></tr> |
1388 |
<tr><td>task.egid</td><td>呼び出したプロセスの実効グループID</td></tr> |
1389 |
<tr><td>task.sgid</td><td>呼び出したプロセスの保存グループID</td></tr> |
1390 |
<tr><td>task.fsgid</td><td>呼び出したプロセスのファイルシステムグループID</td></tr> |
1391 |
<tr><td>task.pid</td><td>呼び出したプロセスのプロセスID</td></tr> |
1392 |
<tr><td>task.ppid</td><td>呼び出したプロセスの親プロセスのプロセスID</td></tr> |
1393 |
<tr><td>path1.uid</td><td>許可されるパス名の所有者ID</td></tr> |
1394 |
<tr><td>path1.gid</td><td>許可されるパス名のグループID</td></tr> |
1395 |
<tr><td>path1.ino</td><td>許可されるパス名のiノード番号</td></tr> |
1396 |
<tr><td>path1.parent.uid</td><td>許可されるパス名の親ディレクトリの所有者ID</td></tr> |
1397 |
<tr><td>path1.parent.gid</td><td>許可されるパス名の親ディレクトリのグループID</td></tr> |
1398 |
<tr><td>path1.parent.ino</td><td>許可されるパス名の親ディレクトリのiノード番号</td></tr> |
1399 |
<tr><td>path2.parent.uid</td><td>作成されるパス名の親ディレクトリの所有者ID</td></tr> |
1400 |
<tr><td>path2.parent.gid</td><td>作成されるパス名の親ディレクトリのグループID</td></tr> |
1401 |
<tr><td>path2.parent.ino</td><td>作成されるパス名の親ディレクトリのiノード番号</td></tr> |
1402 |
</table> |
1403 |
|
1404 |
<p>path1 はパス名を必要とする操作の 1 個目のパス名に対応し、 path2 はパス名を必要とする操作の 2 個目のパス名に対応します。 |
1405 |
例えば、「 file rename file1 file2 」というアクセス許可の場合、 path1 が file1 に、 path2 が file2 に対応します。</p> |
1406 |
|
1407 |
<p>path1.uid および path1.gid は存在しないパス名に対しては指定できません。つまり、ファイル等の作成時( file create 等)には使用できません。</p> |
1408 |
|
1409 |
<p>path1.parent.uid および path1.parent.gid は常に指定可能です。</p> |
1410 |
|
1411 |
<p>path2.parent.uid および path2.parent.gid はパス名を 2 つ必要とする操作(つまり file link および file rename および file mount )に限り指定できます。</p> |
1412 |
|
1413 |
<p>path2.uid および path2.gid は mount 操作に限り指定できます。</p> |
1414 |
|
1415 |
<p>sysctl による読み書き( /proc/sys/ ディレクトリ以下のファイルを open ではなく sysctl を用いてアクセス)を行う場合については、 path1 path2 ともにサポートしていません。</p> |
1416 |
|
1417 |
<h3>プログラムの実行許可(<a href="#domain_policy_file_execute">file execute</a>)に対しては以下の変数と条件も指定できます。</h3> |
1418 |
|
1419 |
<table border="1"> |
1420 |
<tr><td>変数</td><td>意味</td></tr> |
1421 |
<tr><td>exec.realpath</td><td>シンボリックリンクを解決後のプログラムの絶対パス名</td></tr> |
1422 |
<tr><td>exec.argc</td><td>プログラム実行時の引数の数</td></tr> |
1423 |
<tr><td>exec.envc</td><td>プログラム実行時の環境変数の数</td></tr> |
1424 |
</table> |
1425 |
|
1426 |
<table border="1"> |
1427 |
<tr><td>条件</td><td>意味</td></tr> |
1428 |
<tr><td>exec.realpath="value"</td><td>シンボリックリンクを解決後のプログラムの絶対パス名が value である</td></tr> |
1429 |
<tr><td>exec.realpath!="value"</td><td>シンボリックリンクを解決後のプログラムの絶対パス名が value ではない</td></tr> |
1430 |
<tr><td>exec.argv[index]="value"</td><td>index ( 0 <= index < exec.argc )番目の引数の値が value である</td></tr> |
1431 |
<tr><td>exec.argv[index]!="value"</td><td>index ( 0 <= index < exec.argc )番目の引数の値が value ではない</td></tr> |
1432 |
<tr><td>exec.envp["name"]="value"</td><td>環境変数 name が定義されており、値が value である</td></tr> |
1433 |
<tr><td>exec.envp["name"]!="value"</td><td>環境変数 name が定義されていないか、あるいは値が value ではない</td></tr> |
1434 |
<tr><td>exec.envp["name"]!=NULL</td><td>環境変数 name が定義されている</td></tr> |
1435 |
<tr><td>exec.envp["name"]=NULL</td><td>環境変数 name が定義されていない</td></tr> |
1436 |
</table> |
1437 |
|
1438 |
<h4>プロセス種別の指定</h4> |
1439 |
|
1440 |
<table border="1"> |
1441 |
<tr><td>条件</td><td>意味</td></tr> |
1442 |
<tr><td>task.type=execute_handler</td><td>プロセスは execute_handler として動作している</td></tr> |
1443 |
<tr><td>task.type!=execute_handler</td><td>プロセスは普通のプロセスとして動作している</td></tr> |
1444 |
</table> |
1445 |
|
1446 |
<h4>ファイル種別の指定</h4> |
1447 |
|
1448 |
<table border="1"> |
1449 |
<tr><td>条件</td><td>意味</td></tr> |
1450 |
<tr><td>path1.type=file</td><td>path1 は通常のファイルである</td></tr> |
1451 |
<tr><td>path1.type=directory</td><td>path1 はディレクトリである</td></tr> |
1452 |
<tr><td>path1.type=fifo</td><td>path1 is a は FIFO である</td></tr> |
1453 |
<tr><td>path1.type=socket</td><td>path1 はソケットである</td></tr> |
1454 |
<tr><td>path1.type=symlink</td><td>path1 はシンボリックリンクである</td></tr> |
1455 |
<tr><td>path1.type=block</td><td>path1 はブロックデバイスファイルである</td></tr> |
1456 |
<tr><td>path1.type=char</td><td>path1 はキャラクタデバイスファイルである</td></tr> |
1457 |
<tr><td>path1.type!=file</td><td>path1 は通常のファイルではない</td></tr> |
1458 |
<tr><td>path1.type!=directory</td><td>path1 はディレクトリではない</td></tr> |
1459 |
<tr><td>path1.type!=fifo</td><td>path1 は FIFO ではない</td></tr> |
1460 |
<tr><td>path1.type!=socket</td><td>path1 はソケットではない</td></tr> |
1461 |
<tr><td>path1.type!=symlink</td><td>path1 はシンボリックリンクではない</td></tr> |
1462 |
<tr><td>path1.type!=block</td><td>path1 はブロックデバイスファイルではない</td></tr> |
1463 |
<tr><td>path1.type!=char</td><td>path1 はキャラクタデバイスファイルではない</td></tr></table> |
1464 |
|
1465 |
<p>path1.parent や path2.parent は常にディレクトリなので、 path1.parent.type や path2.parent.type という指定はサポートしません。</p> |
1466 |
|
1467 |
<h4>ファイルの保存されているデバイス番号の指定</h4> |
1468 |
|
1469 |
<table border="1"> |
1470 |
<tr><td>条件</td><td>意味</td></tr> |
1471 |
<tr><td>path1.major=数値1-数値2</td><td>path1 のメジャー番号部分が「数値1~数値2」である</td></tr> |
1472 |
<tr><td>path1.minor=数値1-数値2</td><td>path1 のマイナー番号部分が「数値1~数値2」である</td></tr> |
1473 |
<tr><td>path1.major!=数値1-数値2</td><td>path1 のメジャー番号部分が「数値1~数値2」ではない</td></tr> |
1474 |
<tr><td>path1.minor!=数値1-数値2</td><td>path1 のマイナー番号部分が「数値1~数値2」ではない</td></tr> |
1475 |
</table> |
1476 |
|
1477 |
<p>path1.parent や path2.parent のデバイスは(デバイスを跨ぐ操作は認められていないため)常に path1 と同一なので、 path1.parent や path2.parent という指定はサポートしません。</p> |
1478 |
|
1479 |
<p>「数値1」と「数値2」が同じ値の場合、「-数値2」の部分は省略可能です。</p> |
1480 |
|
1481 |
<h4>デバイスファイル属性の指定</h4> |
1482 |
|
1483 |
<table border="1"> |
1484 |
<tr><td>条件</td><td>意味</td></tr> |
1485 |
<tr><td>path1.dev_major=数値1-数値2</td><td>path1 のデバイスメジャー番号部分が「数値1~数値2」である</td></tr> |
1486 |
<tr><td>path1.dev_minor=数値1-数値2</td><td>path1 のデバイスマイナー番号部分が「数値1~数値2」である</td></tr> |
1487 |
<tr><td>path1.dev_major!=数値1-数値2</td><td>path1 のデバイスメジャー番号部分が「数値1~数値2」ではない</td></tr> |
1488 |
<tr><td>path1.dev_minor!=数値1-数値2</td><td>path1 のデバイスマイナー番号部分が「数値1~数値2」ではない</td></tr> |
1489 |
</table> |
1490 |
|
1491 |
<p>path1.type=block または path1.type=char に対してのみ有効です。</p> |
1492 |
|
1493 |
<p>「数値1」と「数値2」が同じ値の場合、「-数値2」の部分は省略可能です。</p> |
1494 |
|
1495 |
<h4>DAC のパーミッション指定</h4> |
1496 |
|
1497 |
<table border="1"> |
1498 |
<tr><td>条件</td><td>意味</td></tr> |
1499 |
<tr><td>path1.perm=数値1-数値2</td><td>path1 のパーミッションが「数値1~数値2」である</td></tr> |
1500 |
<tr><td>path1.perm!=数値1-数値2</td><td>path1 のパーミッションが「数値1~数値2」ではない</td></tr> |
1501 |
<tr><td>path1.perm=setuid</td><td>path1 に関して setuid ビットが on である</td></tr> |
1502 |
<tr><td>path1.perm!=setuid</td><td>path1 に関して setuid ビットが off である</td></tr> |
1503 |
<tr><td>path1.perm=setgid</td><td>path1 に関して setgid ビットが on である</td></tr> |
1504 |
<tr><td>path1.perm!=setgid</td><td>path1 に関して setgid ビットが off である</td></tr> |
1505 |
<tr><td>path1.perm=sticky</td><td>path1 に関して sticky ビットが on である</td></tr> |
1506 |
<tr><td>path1.perm!=sticky</td><td>path1 に関して sticky ビットが off である</td></tr> |
1507 |
<tr><td>path1.perm=owner_read</td><td>path1 に関して owner に対する read ビットが on である</td></tr> |
1508 |
<tr><td>path1.perm!=owner_read</td><td>path1 に関して owner に対する read ビットが off である</td></tr> |
1509 |
<tr><td>path1.perm=owner_write</td><td>path1 に関して owner に対する write ビットが on である</td></tr> |
1510 |
<tr><td>path1.perm!=owner_write</td><td>path1 に関して owner に対する write ビットが off である</td></tr> |
1511 |
<tr><td>path1.perm=owner_execute</td><td>path1 に関して owner に対する execute ビットが on である</td></tr> |
1512 |
<tr><td>path1.perm!=owner_execute</td><td>path1 に関して owner に対する execute ビットが off である</td></tr> |
1513 |
<tr><td>path1.perm=group_read</td><td>path1 に関して group に対する read ビットが on である</td></tr> |
1514 |
<tr><td>path1.perm!=group_read</td><td>path1 に関して group に対する read ビットが off である</td></tr> |
1515 |
<tr><td>path1.perm=group_write</td><td>path1 に関して group に対する write ビットが on である</td></tr> |
1516 |
<tr><td>path1.perm!=group_write</td><td>path1 に関して group に対する write ビットが off である</td></tr> |
1517 |
<tr><td>path1.perm=group_execute</td><td>path1 に関して group に対する execute ビットが on である</td></tr> |
1518 |
<tr><td>path1.perm!=group_execute</td><td>path1 に関して group に対する execute ビットが off である</td></tr> |
1519 |
<tr><td>path1.perm=others_read</td><td>path1 に関して others に対する read ビットが on である</td></tr> |
1520 |
<tr><td>path1.perm!=others_read</td><td>path1 に関して others に対する read ビットが off である</td></tr> |
1521 |
<tr><td>path1.perm=others_write</td><td>path1 に関して others に対する write ビットが on である</td></tr> |
1522 |
<tr><td>path1.perm!=others_write</td><td>path1 に関して others に対する write ビットが off である</td></tr> |
1523 |
<tr><td>path1.perm=others_execute</td><td>path1 に関して others に対する execute ビットが on である</td></tr> |
1524 |
<tr><td>path1.perm!=others_execute</td><td>path1 に関して others に対する execute ビットが off である</td></tr> |
1525 |
</table> |
1526 |
|
1527 |
<p>path1 だけでなく path1.parent や path2.parent も指定可能です。</p> |
1528 |
|
1529 |
<p>「数値1」と「数値2」が同じ値の場合、「-数値2」の部分は省略可能です。</p> |
1530 |
|
1531 |
<p>数値を 8 進数で指定する場合には 0 から始まるようにしてください。(例: path1.perm=0644 )</p> |
1532 |
|
1533 |
<h4>例</h4> |
1534 |
|
1535 |
<ul> |
1536 |
<li>file append /dev/null path1.type=char path1.major=1 path1.minor=3 path1.perm=0666 |
1537 |
</ul> |
1538 |
|
1539 |
<p>「パス名が /dev/null 」「ファイル種別がキャラクタデバイスファイル」「デバイスメジャー番号が 1 」「デバイスマイナー番号が 3 」「パーミッションが 0666 」の場合のみ「読み書きモードでのオープンを許可する」という意味になります。</p> |
1540 |
|
1541 |
<h3>シンボリックリンクの作成許可(<a href="#domain_policy_file_symlink">file symlink</a>)に対しては以下の条件も指定できます。</h3> |
1542 |
|
1543 |
<table border="1"> |
1544 |
<tr><td>条件</td><td>意味</td></tr> |
1545 |
<tr><td>symlink.target="value"</td><td>作成されるシンボリックリンクの内容が value である</td></tr> |
1546 |
<tr><td>symlink.target!="value"</td><td>作成されるシンボリックリンクの内容が value ではない</td></tr> |
1547 |
</table> |
1548 |
|
1549 |
<h2>6.3 <a name="transit_on_match">アクセスを許可するのと同時にドメイン遷移を行う</a></h2> |
1550 |
|
1551 |
<p>例えば接続元クライアントのIPアドレスによってアクセスの可否を切り替えたいという場合に対応するため、アクセスを許可するのと同時にドメイン遷移を行うことができるようになっています。</p> |
1552 |
|
1553 |
<p>アクセスを許可するのと同時にドメイン遷移を行うには、以下のようにアクセス許可の指定に続けて auto_domain_transition= という句を指定します。</p> |
1554 |
|
1555 |
<table border="1"> |
1556 |
<tr><td>使用例</td><td>意味</td></tr> |
1557 |
<tr><td>network inet stream accept @TRUSTED_HOSTS 1024-65535 auto_domain_transition="//trusted_hosts"</td><td>クライアントが @TRUSTED_HOSTS である場合には、現在のドメイン名に //trusted_hosts を連結したドメインに自動的に遷移します。</td></tr> |
1558 |
<tr><td>network inet stream accept @UNTRUSTED_HOSTS 1024-65535 auto_domain_transition="//untrusted_hosts"</td><td>クライアントが @UNTRUSTED_HOSTS である場合には、現在のドメイン名に //untrusted_hosts を連結したドメインに自動的に遷移します。</td></tr> |
1559 |
</table> |
1560 |
|
1561 |
<p>auto_domain_transition= を使用する際には、以下の点に注意してください。</p> |
1562 |
|
1563 |
<ul> |
1564 |
<li>auto_domain_transition= で指定したドメインへ遷移できなかった場合、そのプロセスは強制終了されます。</li> |
1565 |
<li>auto_domain_transition= で指定したドメインへの遷移はポリシーのチェックにより許可された時点で行われます。そのため、メモリ不足などポリシーのチェック以降のエラーによって、アクセス要求は処理されなかったという状況が発生しえます。</li> |
1566 |
<li>上記の @TRUSTED_HOSTS と @UNTRUSTED_HOSTS の両方に含まれていた場合、先に一致したほうのアクセス許可が使われます。そのため、順番に依存するアクセス許可を定義しないように注意してください。</li> |
1567 |
</ul> |
1568 |
|
1569 |
<h2>6.4 <a name="sleep_penalty">ポリシー違反時のペナルティ指定</a></h2> |
1570 |
|
1571 |
<p>強制モードでポリシー違反が発生した場合に、ポリシー違反の原因となったプロセスを一定時間スリープ状態にさせることができます。</p> |
1572 |
|
1573 |
<table border="1"> |
1574 |
<tr><td>/proc/ccs/profile での指定例</td><td>意味</td></tr> |
1575 |
<tr><td>3-PREFERENCE={ enforcing_penalty=1 }</td><td>プロファイル 3 が割り当てられているプロセスが強制モードに於いてポリシー違反を発生させた場合、 0.1 秒間スリープさせます。</td></tr> |
1576 |
<tr><td>4-PREFERENCE={ enforcing_penalty=10 }</td><td>プロファイル 4 が割り当てられているプロセスが強制モードに於いてポリシー違反を発生させた場合、 1 秒間スリープさせます。</td></tr> |
1577 |
</table> |
1578 |
|
1579 |
<p>この機能は、無限ループの中でポリシー違反が発生した場合に、CPU使用率が 100% になってしまうのを回避するための安全装置です。通常は 0.1 秒間スリープさせるだけで充分です。</p> |
1580 |
|
1581 |
<p>この機能は、許可されていないホストからの TCP 接続要求や UDP パケットを攻撃者が故意に送りつけることでポリシー違反を発生させることでサービスを長時間スリープ状態にさせることにより、許可されているホストからの TCP 接続要求や UDP パケットの処理を大幅に遅延させるという攻撃が成立してしまうのを回避するために、ネットワークの受信系の操作に対しては機能しないようになっています。</p> |
1582 |
|
1583 |
<h2>6.5 <a name="auto_execute_handler">プログラムの実行可否をカーネルの外部で判断</a></h2> |
1584 |
|
1585 |
<p>TOMOYO Linux では、原則としてポリシーに従ってプログラムの実行可否を制御します。プログラム実行時のパラメータをチェックしたい場合には、<a href="#conditional_acl">条件付きアクセス許可の指定</a>で説明したように exec.argv や exec.envp を使ってチェックを行うことができます。しかし、<a href="#conditional_acl">条件付きアクセス許可の指定</a>では、単純なパターンマッチしかサポートされておらず、また、どのようなプログラムの実行を許可するかを予め指定しておく必要があります。</p> |
1586 |
|
1587 |
<p>そこで、 TOMOYO Linux では <a href="#domain_policy_task_auto_execute_handler">task auto_execute_handler</a> という仕組みがサポートされています。この仕組みは、プログラムの実行可否をカーネルが判断するのではなく、 <a href="#domain_policy_task_auto_execute_handler">task auto_execute_handler</a> により指定されたプログラムが判断し、プログラムの実行を許可すべきと判断した場合には実際にプログラムを実行するという動作をします。</p> |
1588 |
|
1589 |
<p>Linux に於いては、プログラムを実行するという動作は、プログラムの実行を要求したプロセスを上書きするという動作であり、プログラムの実行に成功した場合にはプログラムの実行を要求したプロセスに制御が戻ることはありません。つまり、要求されたプログラムの実行に失敗した場合にしか、プログラムの実行を要求したプロセスに対して、要求されたプログラムが実行されなかったことが通知されません。<br> |
1590 |
例えば、プログラムAとして動作しているプロセスがプログラムBの実行を要求する場合を考えてみます。<br> |
1591 |
プログラムAとして動作しているプロセスがプログラムBの実行を要求すると、カーネルが「プログラムAとして動作しているプロセスからプログラムBを実行することは適切であるかどうか」をポリシーを照合することで判断し、適切であると判断された場合には「プログラムAとして動作しているプロセスをプログラムBで上書き」し、適切では無いと判断された場合には「プログラムAとして動作しているプロセスにプログラムBの実行が認められていないことを通知」します。</p> |
1592 |
|
1593 |
<p><a href="#domain_policy_task_auto_execute_handler">task auto_execute_handler</a> を指定した場合、 task auto_execute_handler として指定されたプログラムCがこの動作に介在します。<br> |
1594 |
プログラムAとして動作しているプロセスがプログラムBの実行を要求すると、プログラムCに「プログラムAとして動作しているプロセスからプログラムBを実行することは適切であるかどうか」を判断してもらうために「プログラムAとして動作しているプロセスをプログラムCで上書き」します。プログラムCとして動作するようになったプロセスが「プログラムAとして動作していたプロセスからプログラムBを実行することは適切であるかどうか」を判断し、適切であると判断した場合には「プログラムCとして動作しているプロセスをプログラムBで上書き」し、適切では無いと判断された場合には「プログラムCとして動作しているプロセスをプログラムBで上書きせずに終了」します。</p> |
1595 |
|
1596 |
<p>このように、プログラムBの実行を要求したプログラムAとして動作していたプロセスがに対して、プログラムBの実行に失敗したことを通知する手段を放棄することになるため、プログラムBの実行を要求したプログラムAとして動作していたプロセスが、プログラムBが実行されなかったという通知を受けることができなくなるという副作用が発生します。<br> |
1597 |
しかし、たとえ <a href="#domain_policy_task_auto_execute_handler">task auto_execute_handler</a> を指定していない場合であっても、「共有ライブラリの読み込みができなかった」「 KILL シグナルを受信した」「メモリ不足になり OOM killer によって強制終了させられた」など、様々な要因によって「実行には成功したが期待された動作を始める前に終了してしまった」という状況が起こりえます。つまり、「プログラムの実行が失敗しなかった」ということと「要求されたプログラムが期待した動作を始めた」ということの間には、不確定要素が存在します。<br> |
1598 |
そう考えると、「プログラムの実行に失敗したという通知が無い限りプログラムは期待された動作を始める」という保証は最初から存在しないわけなので、 <a href="#domain_policy_task_auto_execute_handler">task auto_execute_handler</a> により指定されたプログラムCが、プログラムBの実行に失敗したことをプログラムBの実行を要求したプログラムAとして動作していたプロセスに通知できなかったという結果になったとしても、容認できる範囲であると言えると思います。</p> |
1599 |
|
1600 |
<p>TOMOYO Linux は、どのプログラムからどのプログラムを実行する必要があるかを事前に把握して、必要最小限のプログラムの実行のみを認めるというアプローチを採用しています。そのため、正常な動作をしている限り、ポリシーで許可されていないプログラムの実行要求は起こらないはずだと仮定すると、全てのプログラムの実行要求をとりあえず受理して構わないと考えることができます。もしも受理すべきではないプログラムの実行要求が発生した場合、 <a href="#domain_policy_task_denied_execute_handler">task denied_execute_handler</a> の機能を使うことで要求を拒否する代わりにそのプロセスを強制終了させるなどの行動を起こすことができます。つまり、カーネルの内部でプログラムの実行可否の判断を行わなくても構わないということです。</p> |
1601 |
|
1602 |
<p>そこで、ドメインに対して <a href="#domain_policy_task_auto_execute_handler">task auto_execute_handler</a> キーワードを指定しておくことで、そのドメインから発生する全てのプログラムの実行可否の判断をカーネル外部のプログラムに委ねることができるようになります。</p> |
1603 |
<p>カーネルの内部では利用可能なライブラリが少ない上に連続したメモリ領域の割り当てが失敗する可能性が高くなりますが、 |
1604 |
カーネルの外部であれば豊富なライブラリを使ってメモリ割り当ての限界を心配せずに詳細なチェックが可能になります。そこで、 <a href="#domain_policy_task_auto_execute_handler">task auto_execute_handler</a> で指定したプログラムにプログラム実行時のパラメータをチェックしてもらい、適切であればプログラムを実行してもらうようにすることができます。</p> |
1605 |
|
1606 |
<p>この方式の副作用は、プログラムの実行を拒否すべきと判断した場合に、プログラムの実行を要求したプロセスに通知する方法が無い点です。しかし、自由にカスタマイズできるので、 ssh 等を用いて遠隔地のマシンに問い合わせをしながらしながら判断することも可能です。</p> |
1607 |
|
1608 |
<p>この機能を使うには、以下のように指定します。</p> |
1609 |
|
1610 |
<table border="1"> |
1611 |
<tr><td>/proc/ccs/domain_policy の例</td><td>意味</td></tr> |
1612 |
<tr><td>task auto_execute_handler /usr/sbin/check-and-exec</td><td>このドメインに属しているプロセスがプログラムの実行を要求した場合、要求されたプログラムを実行する代わりに /usr/sbin/check-and-exec を実行します。 /usr/sbin/check-and-exec はパラメータをチェックし、妥当と判断した場合には要求されたプログラムを実行します。</td></tr> |
1613 |
</table> |
1614 |
|
1615 |
<p>task auto_execute_handler で指定されたプログラムは、以下のパラメータを受け取ります。<a href="#access_logs">アクセスログについて</a>で説明した、 file execute のログと比較してみてください。</p> |
1616 |
|
1617 |
<ul> |
1618 |
<li>argv[0] には、 task auto_execute_handler で指定されたプログラムのパス名が入っています。</li> |
1619 |
<li>argv[1] には、プログラムの実行を要求したプロセスのドメイン名が入っています。</li> |
1620 |
<li>argv[2] には、プログラムの実行を要求したプロセスのパス名が入っています。</li> |
1621 |
<li>argv[3] には、プログラムの実行を要求したプロセスの情報が入っています。</li> |
1622 |
<li>argv[4] には、実行が要求されたプログラムのパス名が入っています。</li> |
1623 |
<li>argv[5] には、プログラム実行要求時の引数の数が入っています。</li> |
1624 |
<li>argv[6] には、プログラム実行要求時の環境変数の数が入っています。</li> |
1625 |
<li>argv[7] から argv[6 + argc] には、呼び出し元プロセスが渡した argv[] の内容が入っています。</li> |
1626 |
<li>argv[7 + argc] から argv [6 + argc + envc] には、呼び出し元プロセスが渡した envp[] の内容が入っています。</li> |
1627 |
<li>環境変数 envp[] は全てクリアされます。</li> |
1628 |
<li>標準入出力などは呼び出し元プロセスのものを引き継ぎます。</li> |
1629 |
</ul> |
1630 |
|
1631 |
<p>この機能を使用する際には、以下の点に注意してください。</p> |
1632 |
|
1633 |
<ul> |
1634 |
<li>task auto_execute_handler で指定されたプログラムに対して実行許可( <a href="#domain_policy_file_execute">file execute</a> )を与える必要はありませんし、与えるべきではありません。</li> |
1635 |
<li>プロセスが chroot 内部の環境で動作している場合、 task auto_execute_handler で指定されたプログラムが見つからないために実行されない場合があります。これは、プロセスが chroot 内部の環境で動作している場合に、 chroot 外部の環境にあるプログラムを実行できてしまうと危険なので、 task auto_execute_handler で指定されたプログラムは、プロセスの名前空間のルートディレクトリではなく、プロセスのルートディレクトリから検索するようになっているためです。</li> |
1636 |
<li>task auto_execute_handler で指定されたプログラムが動作するためのドメインが存在しない場合、実行されません。そのため、例えば <kernel> 直下に task auto_execute_handler で指定されたプログラム用のドメインを作成して、そのプログラムを <a href="#exception_policy_initialize_domain">initialize_domain</a> キーワードで指定するなどの準備をしてください。</li> |
1637 |
<li>task auto_execute_handler で指定されたプログラムは環境変数の影響を受けるのを避けるため、全ての環境変数の内容をクリアした状態で起動されます。そのため、環境変数 PATH 等が設定されていないので、外部コマンドを呼び出す場合には注意してください。また、 task auto_execute_handler で指定されたプログラムが動作するドメインにも強制モード用のプロファイルを割り当てておくことを推奨します。</li> |
1638 |
</ul> |
1639 |
|
1640 |
<p>ccs-tools のソースパッケージには、 audit-exec-param.c というサンプルプログラムが入っています。ご自由に改造してお使いください。</p> |
1641 |
<p>この機能は、機構を提供しているだけです。この機構を活用できるかどうかはあなた次第です。</p> |
1642 |
|
1643 |
<h2>6.6 <a name="denied_execute_handler">許可されていないプログラムの実行が要求された場合の代替処理指定</a></h2> |
1644 |
|
1645 |
<p>TOMOYO Linux では、どのプログラムからどのプログラムを実行する必要があるかを事前に把握して、必要最小限のプログラムの実行のみを認めるというアプローチを採用しています。そのため、不要なプログラムの実行を拒否するという振る舞いだけでなく、それ以外の振る舞いを行うこともできます。</p> |
1646 |
|
1647 |
<p>強制モードに於いて file execute 構文により許可されていないプログラムの実行が要求された場合、デフォルトではプログラムの実行を拒否します。しかし、あるプログラムからどのプログラムの実行を許可する必要があるかを把握済みであるという前提があれば、プロセスが正常な動作をしている限りに於いて許可されていないプログラムの実行が要求されることは無いので、許可されていないプログラムの実行が要求されたということはプロセスが正常な動作をしていない(つまり、プロセスにとっては制御を失った状態である)とみなすことができます。</p> |
1648 |
|
1649 |
<p>攻撃者はバッファオーバーフローなどのセキュリティホールを攻撃することでプロセスの制御を奪い、シェルなどのコマンドの実行を要求してきます。もし、そのプロセスからシェルの実行を許可する必要が無い(すなわち file execute /bin/bash のようなアクセス許可を与える必要が無い)のであれば、シェルの実行が要求された時点で既にプロセスにとっては制御を失っていると考えることができます。</p> |
1650 |
|
1651 |
<p>通常、許可されていないプログラムの実行が要求された場合は、その要求を拒否するだけです。しかし、制御を失っているプロセスから要求されたプログラムの実行要求を拒否したところで、そのプロセスの制御が取り戻される(つまり、正常な動作をするようになる)とは考えられません。<br> |
1652 |
しかし、プログラムを実行するということは、現在動作中のプロセスを新しいプログラムに置き換えることで、制御を新しいプログラムに譲渡することを意味します。つまり、あるプロセスがバッファオーバーフローなどにより制御を失っていたとしても、プログラムを実行することにより、そのプロセスの制御が取り戻されるわけです。</p> |
1653 |
|
1654 |
<p>攻撃者の手によって制御を失ったプロセスからプログラムが実行された後の制御は、どのプログラムが実行されたかによって決まります。シェルが実行された場合には、シェルはユーザが要求したとおりに処理を実行してしまうため、プログラムの実行を要求したプロセスの所有者である攻撃者の手に委ねられてしまうわけです。しかし、何もせずに終了するようなプログラム(例えば /bin/true )が実行された場合には、プロセスの制御が攻撃者の手に委ねられてしまうことはありません。</p> |
1655 |
|
1656 |
<p>このように、攻撃者の手によって本来許可する必要の無いプログラムの実行が要求されるという出来事は、見方を変えると、攻撃者自身が制御を取り戻すためのチャンスを与えてくれていると考えることができます。<br> |
1657 |
そこで、 TOMOYO Linux では、許可されていないプログラムの実行が要求された場合、その要求を拒否する代わりに他のプログラムを実行するための機構を提供しています。この機構を用いて何をするかはシステム管理者の自由です。</p> |
1658 |
|
1659 |
<p>例えば、シェルの実行要求を /bin/true の実行要求に差し替えてしまうことで、そのプロセスを直ちに強制終了させることができます。</p> |
1660 |
|
1661 |
<p>例えば、シェルの実行要求をハニーポットクライアントプログラムの実行要求に差し替えてしまうことで、攻撃者がどのようなリクエストを行うかを観察することができます。</p> |
1662 |
|
1663 |
<p>例えば、そのログインセッションを強制終了させることができます。</p> |
1664 |
|
1665 |
<p>例えば、要求されたコマンドがどのパッケージに含まれているかを教えてくれる Ubuntu の command-not-found パッケージのように、「 You are not permitted to execute this program. 」のような警告を表示することができます。</p> |
1666 |
|
1667 |
<p>例えば、攻撃者の接続元IPアドレスを割り出して、ファイアウォールの設定を変更することができます。</p> |
1668 |
|
1669 |
<p>この機能を使うには、以下のように指定します。</p> |
1670 |
|
1671 |
<table border="1"> |
1672 |
<tr><td>/proc/ccs/profile の例</td><td>/proc/ccs/domain_policy の例</td><td>意味</td></tr> |
1673 |
<tr><td>3-CONFIG::file::execute=enforcing</td><td>use_profile 3<br>task denied_execute_handler /bin/true</td><td>プロファイル 3 が割り当てられているドメインに属しているプロセスが、許可されていないプログラムの実行を要求した場合、代わりに /bin/true を実行します。</td></tr> |
1674 |
</table> |
1675 |
|
1676 |
<p>この機能を使用する際の注意事項は<a href="#auto_execute_handler">プログラムの実行可否をカーネルの外部で判断</a>と同じです。</p> |
1677 |
|
1678 |
<hr> |
1679 |
|
1680 |
<p><a href="index.html.ja">目次へ戻る</a></p> |
1681 |
<p><a href="http://sourceforge.jp/"><img src="http://sourceforge.jp/sflogo.php?group_id=1973" width="96" height="31" alt="SourceForge.jp"></a></p> |
1682 |
</body> |
1683 |
</html> |