Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /tags/htdocs/index.html

Parent Directory Parent Directory | Revision Log Revision Log


Revision 123 - (hide annotations) (download) (as text)
Sat Jun 14 16:16:00 2014 UTC (9 years, 9 months ago) by kumaneko
File MIME type: text/html
File size: 181281 byte(s)


1 kumaneko 10 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2     <html lang="en-US">
3     <head>
4     <meta http-equiv="content-type" content="text/html; charset=UTF-8">
5 kumaneko 15 <meta http-equiv="content-style-type" content="text/css">
6     <link rel="stylesheet" href="media/caitsith.css" media="all" type="text/css">
7 kumaneko 10 <title>CaitSith Documentation</title>
8     </head>
9     <body>
10    
11     <h1>CaitSith -- A simplified access restriction module for system protection.</h1>
12    
13     <p>CaitSith is an access restriction module for Linux systems. This module gives you ability to restrict access (e.g. opening files, executing programs) at the kernel level. This module is designed for ease of use.</p>
14    
15     <hr>
16 kumaneko 29 <h2><a name="index">Index</a></h2>
17 kumaneko 10
18 kumaneko 15 <p><a href="#difference_with_tomoyo">1. Difference with TOMOYO (for existing TOMOYO users)</a></p>
19    
20 kumaneko 10 <ul>
21 kumaneko 15 <li><a href="#1.1">1.1. About pathnames and management programs</a></li>
22     <li><a href="#1.2">1.2. About policy syntax</a></li>
23 kumaneko 54 <li><a href="#1.3">1.3. Why CaitSith was developed</a></li>
24 kumaneko 10 </ul>
25    
26 kumaneko 15 <p><a href="#how_to_install">2. How to install</a></p>
27    
28     <ul>
29 kumaneko 97 <li><a href="#2.1">2.1 How to install LKM-based LSM version</a><br>
30     <ul>
31     <li><a href="#2.1.1">2.1.1. Install dependencies</a></li>
32     <li><a href="#2.1.2">2.1.2. Building the kernel module</a></li>
33 kumaneko 123 <li><a href="#2.1.3">2.1.3. Check whether CaitSith kernel module can be loaded or not (Optional)</a>
34     <li><a href="#2.1.4">2.1.4. Install the userspace tools</a></li>
35     <li><a href="#2.1.5">2.1.5. Initializing configuration</a></li>
36     <li><a href="#2.1.6">2.1.6. Configuring your bootloader</a></li>
37     <li><a href="#2.1.7">2.1.7. Rebooting your system</a></li>
38     <li><a href="#2.1.8">2.1.8. How can I disable/uninstall CaitSith?</a></li>
39 kumaneko 15 </ul>
40 kumaneko 97 </li>
41     <li><a href="#2.2">2.2. How to install fully featured version</a><br>
42     <ul>
43     <li><a href="#2.2.1">2.2.1. Install dependencies</a></li>
44     <li><a href="#2.2.2">2.2.2. Download and patch the kernel</a></li>
45     <li><a href="#2.2.3">2.2.3. Configure the kernel</a></li>
46     <li><a href="#2.2.4">2.2.4. Compile and install the kernel</a></li>
47     <li><a href="#2.2.5">2.2.5. Install the userspace tools</a></li>
48     <li><a href="#2.2.6">2.2.6. Initializing configuration</a></li>
49     <li><a href="#2.2.7">2.2.7. Configuring your bootloader</a></li>
50     <li><a href="#2.2.8">2.2.8. Rebooting your system</a></li>
51     <li><a href="#2.2.9">2.2.9. How can I disable/uninstall CaitSith?</a></li>
52     </ul>
53     </li>
54     </ul>
55 kumaneko 15
56     <p><a href="#how_to_develop_policy">3. How to develop policy</a></p>
57    
58 kumaneko 16 <ul>
59     <li><a href="#3.1">3.1. Policy file structure</a></li>
60     <li><a href="#3.2">3.2. Updating policy configuration</a></li>
61     <li><a href="#3.3">3.3. Example of simple access restriction rule</a></li>
62 kumaneko 20 <li><a href="#3.4">3.4. Understanding two viewpoints</a></li>
63 kumaneko 112 <li><a href="#3.5">3.5. Steps for writing access restriction rules</a></li>
64     <li><a href="#3.6">3.6. Restricting access in various ways</a></li>
65 kumaneko 16 </ul>
66    
67 kumaneko 29 <p><a href="#condition_list">4. List of conditions</a></p>
68 kumaneko 10
69     <ul>
70 kumaneko 29 <li><a href="#4.1">4.1. Using string arguments in conditions</a></li>
71     <li><a href="#4.2">4.2. Using numeric arguments in conditions</a></li>
72     <li><a href="#4.3">4.3. Using process's information in conditions</a></li>
73     <li><a href="#4.4">4.4. Using IP address arguments in conditions</a></li>
74     <li><a href="#4.5">4.5. Using command line arguments in conditions</a></li>
75     <li><a href="#4.6">4.6. Using environment variable arguments in conditions</a></li>
76     <li><a href="#4.7">4.7. Using file's DAC permissions in conditions</a></li>
77     <li><a href="#4.8">4.8. Using handle file's type in conditions</a></li>
78     <li><a href="#4.9">4.9. Using file's attributes in conditions</a></li>
79 kumaneko 10 </ul>
80    
81 kumaneko 30 <p><a href="#syntax_list">5. List of syntaxes</a></p>
82 kumaneko 29
83 kumaneko 30 <ul>
84     <li><a href="#5.1">5.1. execute</a></li>
85     <li><a href="#5.2">5.2. read</a></li>
86     <li><a href="#5.3">5.3. write</a></li>
87     <li><a href="#5.4">5.4. append</a></li>
88     <li><a href="#5.5">5.5. create</a></li>
89     <li><a href="#5.6">5.6. unlink</a></li>
90     <li><a href="#5.7">5.7. getattr</a></li>
91     <li><a href="#5.8">5.8. mkdir</a></li>
92     <li><a href="#5.9">5.9. rmdir</a></li>
93     <li><a href="#5.10">5.10. mkfifo</a></li>
94     <li><a href="#5.11">5.11. mksock</a></li>
95     <li><a href="#5.12">5.12. truncate</a></li>
96     <li><a href="#5.13">5.13. symlink</a></li>
97     <li><a href="#5.14">5.14. mkblock</a></li>
98     <li><a href="#5.15">5.15. mkchar</a></li>
99     <li><a href="#5.16">5.16. link</a></li>
100     <li><a href="#5.17">5.17. rename</a></li>
101     <li><a href="#5.18">5.18. chmod</a></li>
102     <li><a href="#5.19">5.19. chown</a></li>
103     <li><a href="#5.20">5.20. chgrp</a></li>
104     <li><a href="#5.21">5.21. ioctl</a></li>
105     <li><a href="#5.22">5.22. chroot</a></li>
106     <li><a href="#5.23">5.23. mount</a></li>
107     <li><a href="#5.24">5.24. unmount</a></li>
108     <li><a href="#5.25">5.25. pivot_root</a></li>
109     <li><a href="#5.26">5.26. inet_stream_bind</a></li>
110     <li><a href="#5.27">5.27. inet_stream_listen</a></li>
111     <li><a href="#5.28">5.28. inet_stream_connect</a></li>
112     <li><a href="#5.29">5.29. inet_stream_accept</a></li>
113     <li><a href="#5.30">5.30. inet_dgram_bind</a></li>
114     <li><a href="#5.31">5.31. inet_dgram_send</a></li>
115     <li><a href="#5.32">5.32. inet_dgram_recv</a></li>
116     <li><a href="#5.33">5.33. inet_raw_bind</a></li>
117     <li><a href="#5.34">5.34. inet_raw_send</a></li>
118     <li><a href="#5.35">5.35. inet_raw_recv</a></li>
119     <li><a href="#5.36">5.36. unix_stream_bind</a></li>
120     <li><a href="#5.37">5.37. unix_stream_listen</a></li>
121     <li><a href="#5.38">5.38. unix_stream_connect</a></li>
122     <li><a href="#5.39">5.39. unix_stream_accept</a></li>
123     <li><a href="#5.40">5.40. unix_dgram_bind</a></li>
124     <li><a href="#5.41">5.41. unix_dgram_send</a></li>
125     <li><a href="#5.42">5.42. unix_dgram_recv</a></li>
126     <li><a href="#5.43">5.43. unix_seqpacket_bind</a></li>
127     <li><a href="#5.44">5.44. unix_seqpacket_listen</a></li>
128     <li><a href="#5.45">5.45. unix_seqpacket_connect</a></li>
129     <li><a href="#5.46">5.46. unix_seqpacket_accept</a></li>
130     <li><a href="#5.47">5.47. ptrace</a></li>
131     <li><a href="#5.48">5.48. signal</a></li>
132     <li><a href="#5.49">5.49. environ</a></li>
133     <li><a href="#5.50">5.50. modify_policy</a></li>
134     <li><a href="#5.51">5.51. use_netlink_socket</a></li>
135     <li><a href="#5.52">5.52. use_packet_socket</a></li>
136     <li><a href="#5.53">5.53. use_reboot</a></li>
137     <li><a href="#5.54">5.54. use_vhangup</a></li>
138     <li><a href="#5.55">5.55. set_time</a></li>
139     <li><a href="#5.56">5.56. set_priority</a></li>
140     <li><a href="#5.57">5.57. set_hostname</a></li>
141     <li><a href="#5.58">5.58. use_kernel_module</a></li>
142     <li><a href="#5.59">5.59. use_new_kernel</a></li>
143     <li><a href="#5.60">5.60. manual_domain_transition</a></li>
144     <li><a href="#5.61">5.61. auto_domain_transition</a></li>
145     </ul>
146    
147     <p><a href="#advanced_usage">6. Advanced usage</a></p>
148 kumaneko 112 <ul>
149     <li><a href="#6.1">6.1. Controlling domain transition</a></li>
150     <li><a href="#6.2">6.2. Using execute handler</a></li>
151     </ul>
152 kumaneko 30
153 kumaneko 10 <hr>
154     <h2><a name="difference_with_tomoyo">1. Difference with TOMOYO (for existing TOMOYO users)</a></h2>
155    
156 kumaneko 15 <p>CaitSith was derived from TOMOYO Linux, but usage of CaitSith would be too different to imagine that CaitSith was derived from TOMOYO Linux. If you are already using TOMOYO Linux, please read the difference described below.</p>
157 kumaneko 10
158 kumaneko 30 <hr>
159 kumaneko 15 <h3><a name="1.1">1.1. About pathnames and management programs</a></h3>
160 kumaneko 10
161 kumaneko 22 <p><code>/proc/ccs/domain_policy</code>, <code>/proc/ccs/exception_policy</code>, <code>/proc/ccs/profile</code>, <code>/proc/ccs/manager</code> and <code>/proc/ccs/stat</code> have been aggregated into <code>/proc/caitsith/policy</code>.</p>
162 kumaneko 10
163 kumaneko 22 <p><code>/etc/ccs/policy/current/domain_policy.conf</code>, <code>/etc/ccs/policy/current/exception_policy.conf</code>, <code>/etc/ccs/policy/current/profile.conf</code>, <code>/etc/ccs/policy/current/manager.conf</code> and <code>/etc/ccs/policy/current/stat.conf</code> have been aggregated into <code>/etc/caitsith/policy/current</code>.</p>
164 kumaneko 10
165 kumaneko 22 <p>Built-in policy files which are located under kernel source directory as <code>security/ccsecurity/policy/domain_policy.conf</code>, <code>security/ccsecurity/policy/exception_policy.conf</code>, <code>security/ccsecurity/policy/profile.conf</code>, <code>security/ccsecurity/policy/manager.conf</code> and <code>security/ccsecurity/policy/stat.conf</code> have been aggregated into <code>security/caitsith/policy/policy.conf</code>.</p>
166 kumaneko 10
167 kumaneko 22 <p>Only <code>/sbin/caitsith-init</code>, <code>/usr/sbin/caitsith-auditd</code>, <code>/usr/sbin/caitsith-loadpolicy</code>, <code>/usr/sbin/caitsith-notifyd</code>, <code>/usr/sbin/caitsith-pstree</code>, <code>/usr/sbin/caitsith-queryd</code>, <code>/usr/sbin/caitsith-savepolicy</code>, <code>/usr/lib/caitsith/audit-exec-param</code>, <code>/usr/lib/caitsith/caitsith-agent</code> and <code>/usr/lib/caitsith/init_policy</code> are provided for managing policy. (In other words, programs such as <code>/usr/sbin/ccs-editpolicy</code> and <code>/usr/sbin/ccs-setprofile</code> have been removed.)</p>
168 kumaneko 10
169 kumaneko 28 <p>Command line arguments for specifying type of policy to load/save have been removed from <code>/usr/sbin/caitsith-loadpolicy</code> and <code>/usr/sbin/caitsith-savepolicy</code>.</p>
170 kumaneko 10
171 kumaneko 28 <p>Command line arguments for specifying profile type have been removed from <code>/usr/lib/caitsith/init_policy</code>.</p>
172 kumaneko 10
173 kumaneko 30 <hr>
174 kumaneko 15 <h3><a name="1.2">1.2. About policy syntax</a></h3>
175 kumaneko 10
176 kumaneko 28 <p>Policy syntax has been drastically changed. TOMOYO Linux uses process's domainname as a key for grouping permissions to do some operations. In other words, TOMOYO Linux's policy is collection of "which domain can do ..." rules. On the other hand, CaitSith uses operation as a key for checking permission. In other words, CaitSith's policy is collection of "which operation can be done by ..." rules. This change is intended for allowing users to protect resources using blacklisting approach. In CaitSith, process's domainname is nothing but one of optional parameters that can be used for controlling whether to grant or deny specific operations. Users can write rules without managing domainnames unless needed.</p>
177 kumaneko 10
178     <p>Process's domainname representation has changed from space delimited multiple words (e.g. "&lt;kernel&gt; /sbin/init /etc/rc.d/rc.sysinit") to a single word (e.g. "/sbin/init").</p>
179    
180     <p>Domain transitions no longer happen unless explicitly specified by policy.</p>
181    
182     <p>Distinction of disabled/learning/permissive/enforcing mode has been removed.</p>
183    
184     <p>"path_group" keyword has been renamed to "string_group", and "address_group" keyword has been renamed to "ip_group".</p>
185    
186     <p>Representation of \ character has been changed from \\ to \134.</p>
187    
188 kumaneko 28 <p>Distinction between directory's pathname and non-directory's pathname has been removed by removing trailing / character from pathname.</p>
189 kumaneko 10
190     <p>A new wildcard /\(dir\)/ has been introduced for helping converting from (e.g.) "/tmp/\{\*\}/" to "/tmp/\(\*\)/\*", for directory's pathname (except the root directory itself) no longer ends with / character which previously matched /\{\*\}/ wildcard.</p>
191    
192     <p>Category keywords (i.e. "file", "network", "ipc", "misc", "capability", "task") have been removed because access control levels which was specified using profile has been removed. Some of operation keywords have been renamed (e.g. "network inet stream connect" became "inet_stream_connect", "misc env" became "environ").</p>
193    
194     <p>"task auto_execute_handler" keyword has been renamed to "handler=" argument of "execute" keyword. This is intended for using execute handler for preprocessing purpose when executing specific programs rather than when executing from specific domains. "task denied_execute_handler" keyword has been removed.</p>
195    
196     <p>Domain argument has been removed from permission to send signals (i.e. "signal" directive), for kill() system call accepts negative number for specifying multiple processes. It is impossible to selectively deny sending signals because it is not permitted to sleep while sending signals.</p>
197    
198     <p>Restriction granularity for ptrace operation has changed from boolean (i.e. "capability SYS_PTRACE") to command number + domainname.</p>
199    
200     <p>Restriction granularity for environment variables has changed from name only to both name and values.</p>
201    
202     <p>Several variables for referencing file's attributes have been added.</p>
203    
204     <p>Local port reserve functionality (i.e. "deny_autobind" keyword) has been removed.</p>
205    
206 kumaneko 30 <hr>
207 kumaneko 54 <h3><a name="1.3">1.3. Why CaitSith was developed?</a></h3>
208    
209     <p>Presentation slides which I used at LinuxCon North America 2012 that explain why CaitSith was developed are available.</p>
210    
211     <ul>
212     <li><a href="http://I-love.SAKURA.ne.jp/tomoyo/CaitSith-en.pdf">English</a></li>
213     <li><a href="http://I-love.SAKURA.ne.jp/tomoyo/CaitSith-ja.pdf">Japanese</a></li>
214     </ul>
215    
216     <hr>
217 kumaneko 10 <h2><a name="how_to_install">2. How to install</a></h2>
218    
219 kumaneko 97 <p>CaitSith supports Linux kernel 2.6.27 and later.</p>
220 kumaneko 10
221 kumaneko 97 <p>There are two ways to compile CaitSith kernel module. Please choose one, but please accept that you need to choose <a href="#2.2">fully featured version</a> if you can't choose <a href="#2.1">LKM-based LSM version</a>.</p>
222    
223     <table border="1">
224     <tr><td></td><td><a href="#2.1">LKM-based LSM version</a></td><td><a href="#2.2">fully featured version</a></td></tr>
225     <tr><td>Advantages</td><td>No need to replace kernel package.</td><td>Complete functionality and syntax are supported.</td></tr>
226     <tr><td>Disadvantages</td><td>Supported functionality and syntax depend on kernel's version and kernel's configuration options.</td><td>Need to replace kernel package.</td></tr>
227     <tr><td>Dependency</td><td>
228     Kernel package must be built with below configuration options.<br>
229     <ul>
230     <li>CONFIG_SECURITY=y</li>
231     <li>CONFIG_KALLSYMS=y</li>
232     <li>CONFIG_PROC_FS=y</li>
233     <li>CONFIG_MODULES=y</li>
234     </ul>
235     The kernel package should be built with below configuration options in addition to above configuration options for supporting further functionality.<br>
236     <ul>
237     <li>CONFIG_SECURITY_NETWORK=y</li>
238     <li>CONFIG_SECURITY_PATH=y</li>
239     </ul>
240     Currently known to work on x86_32 x86_64 SH and ARM. Other architectures are not tested yet.
241     </td><td>
242     Requires patching against kernel's source and rebuilding from source.
243     </td></tr>
244     </table>
245    
246 kumaneko 30 <hr>
247 kumaneko 97 <h2><a name="2.1">2.1. How to install LKM-based LSM version</a></h2>
248 kumaneko 10
249 kumaneko 97 <hr>
250     <h3><a name="2.1.1">2.1.1. Install dependencies</a></h3>
251    
252     <p>These packages are required for compiling the kernel module and the userspace tools:</p>
253    
254     <ul>
255     <li><strong>wget</strong>: to download sources</li>
256     <li><strong>gcc</strong>: to build the module and tools</li>
257     <li><strong>make</strong>: to build the module and tools</li>
258     <li><strong>ncurses-devel</strong> or <strong>libncurses-dev</strong>: to build the tools</li>
259     </ul>
260    
261     <p>These can be installed with the following commands:</p>
262    
263     <p><strong>RedHat distributions</strong></p>
264     <pre class="command">
265     # yum -y install wget gcc make ncurses-devel
266     </pre>
267     <p><strong>Debian distributions</strong></p>
268     <pre class="command">
269     # apt-get -y install wget gcc make libncurses-dev
270     </pre>
271     <p><strong>SUSE distributions</strong></p>
272     <pre class="command">
273     # yast -i wget gcc make ncurses-devel
274     </pre>
275    
276     <hr>
277     <h3><a name="2.1.2">2.1.2. Building the kernel module</a></h3>
278    
279     <p>Install the kernel development package and go to the directory that it has installed into:</p>
280    
281     <p><strong>RedHat distributions</strong></p>
282     <pre class="command">
283     # VERSION=$(uname -r)
284     # yum -y install kernel-devel-${VERSION}
285     # cd /usr/src/kernels/${VERSION}*/
286     </pre>
287    
288     <p><strong>Debian distributions</strong></p>
289     <pre class="command">
290     # VERSION=$(uname -r)
291     # apt-get -y install linux-headers-${VERSION}
292     # cd /usr/src/linux-headers-${VERSION}/
293     </pre>
294    
295     <p><strong>SUSE distributions</strong></p>
296     <pre class="command">
297     # VERSION=$(uname -r)
298     # yast -i kernel-devel
299     # cd /lib/modules/${VERSION}/build/
300     </pre>
301    
302     <p>Run the following commands in order to extract source code of CaitSith:</p>
303    
304     <pre class="command">
305 kumaneko 121 # wget -O caitsith-patch-0.1-20140601.tar.gz 'http://sourceforge.jp/frs/redir.php?m=jaist&amp;f=/caitsith/55464/caitsith-patch-0.1-20140601.tar.gz'
306     # wget -O caitsith-patch-0.1-20140601.tar.gz.asc 'http://sourceforge.jp/frs/redir.php?m=jaist&amp;f=/caitsith/55464/caitsith-patch-0.1-20140601.tar.gz.asc'
307 kumaneko 97 # wget http://I-love.SAKURA.ne.jp/kumaneko-key
308     # gpg --import kumaneko-key
309 kumaneko 121 # gpg caitsith-patch-0.1-20140601.tar.gz.asc
310     # tar -zxf caitsith-patch-0.1-20140601.tar.gz
311 kumaneko 97 </pre>
312    
313 kumaneko 123 <p>On systemd environments, <code>/usr/lib/systemd/systemd</code> will be executed rather than <code>/sbin/init</code>. If your system is using systemd, please edit CONFIG_CAITSITH_ACTIVATION_TRIGGER line in caitsith/config.h like below:</p>
314 kumaneko 97
315 kumaneko 123 <p>Before:</p>
316     <pre>#define CONFIG_CAITSITH_ACTIVATION_TRIGGER "/sbin/init"
317     </pre>
318    
319     <p>After:</p>
320     <pre>#define CONFIG_CAITSITH_ACTIVATION_TRIGGER "/usr/lib/systemd/systemd"
321     </pre>
322    
323     <p>You can override CONFIG_CAITSITH_ACTIVATION_TRIGGER setting via CS_trigger= kernel boot option (e.g. CS_trigger=<code>/usr/lib/systemd/systemd</code>).</p>
324    
325     <p>There are two types of CaitSith's policy configuration. The former is embedded into the kernel and the latter is saved as files on the filesystems (e.g. <code>/etc/caitsith/</code> directory). You will need to rebuild the CaitSIth kernel module whenever updating the former, but allows you to load policy without using userspace policy loader (e.g. <code>/sbin/caitsith-init</code>). The latter is loaded by executing userspace policy loader when the access control by CaitSith is about to be activated (e.g. when <code>/sbin/init</code> or <code>/usr/lib/systemd/systemd</code>starts). <em>Activate without calling userspace policy loader.</em> allows you to activate access control by CaitSith as soon as the former is loaded. This option is useful when it is difficult to call policy loader (e.g. embedded systems).</p>
326    
327 kumaneko 97 <p>If you want to activate CaitSith as soon as the kernel module is loaded, you can define CONFIG_CAITSITH_OMIT_USERSPACE_LOADER line in caitsith/config.h like below. (But be sure to supply built-in policy configuration located at caitsith/policy/ directory if you define CONFIG_CAITSITH_OMIT_USERSPACE_LOADER, or the system will panic as soon as the kernel module is loaded.):</p>
328    
329     <p>Before:</p>
330     <pre>//#define CONFIG_CAITSITH_OMIT_USERSPACE_LOADER
331     </pre>
332    
333     <p>After:</p>
334     <pre
335     >#define CONFIG_CAITSITH_OMIT_USERSPACE_LOADER
336     </pre>
337    
338     <p>Run the following commands in order to build and install CaitSith:</p>
339    
340     <pre class="command">
341     # make SUBDIRS=$PWD/caitsith modules
342     # make SUBDIRS=$PWD/caitsith modules_install
343     # depmod ${VERSION}
344     </pre>
345    
346     <p>If you encountered one of errors listed below, you cannot use CaitSith for your kernel. Please jump to <a href="#2.2">2.2. How to install fully featured version</a>.
347     For other errors, please contact the author ( penguin-kernel@I-love.SAKURA.ne.jp ).</p>
348    
349     <pre class="output">
350     You must choose CONFIG_SECURITY=y for building this module.
351     You must choose CONFIG_KALLSYMS=y for building this module.
352     You must choose CONFIG_PROC_FS=y for building this module.
353     You must choose CONFIG_MODULES=y for building this module.
354     </pre>
355    
356 kumaneko 123 <h3><a name="2.1.3">2.1.3. Check whether CaitSith kernel module can be loaded or not (Optional)</a></h3>
357    
358 kumaneko 97 <p>Since registering CaitSith module depends on your environment, you might encounter problems. Therefore, I recommend you to confirm that CaitSith module can be loaded at this step.</p>
359    
360     <p>Run the following commands in order to try to load caitsith_test.ko module:</p>
361    
362     <pre class="command">
363     # dmesg -c &gt; /dev/null
364     # modprobe caitsith_test
365     # dmesg
366     </pre>
367     <pre class="output">
368     security_ops=c0c4b470
369     find_task_by_vpid=c04769e0
370     find_task_by_pid_ns=c04769c0
371     vfsmount_lock=c0a5a3a0
372     All dependent symbols have been guessed.
373     Please verify these addresses using System.map for this kernel (e.g. /boot/System.map-`uname -r` ).
374     If these addresses are correct, you can try loading CaitSith module on this kernel.
375     </pre>
376    
377     <p>If caitsith_test.ko was loaded successfully, guessed addresses like above are printed. Therefore, please compare guessed addresses from caitsith_test.ko and actual addresses from System.map file. (Number of symbols and addresses printed depends on your environment.):</p>
378    
379     <pre class="command">
380     # for i in c0c4b470 c04769e0 c04769c0 c0a5a3a0; do grep $i /boot/System.map-${VERSION}; done
381     </pre>
382     <pre class="output">
383     c0c4b470 B security_ops
384     c04769e0 T find_task_by_vpid
385     c04769c0 T find_task_by_pid_ns
386     c0a5a3a0 D vfsmount_lock
387     </pre>
388    
389     <p>Please proceed if these addresses are correct. Otherwise, please contact the author since CaitSith module will not work even if you continue.</p>
390    
391     <p>If caitsith_test.ko was not loaded successfully, error messages like below are printed. In this case, please contact the author since CaitSith module will not work even if you continue:</p>
392    
393     <pre class="command">
394     # dmesg -c &gt; /dev/null
395     # modprobe caitsith_test
396     </pre>
397     <pre class="output">FATAL: Error inserting caitsith_test (/lib/modules/2.6.32/extra/caitsith_test.ko): Invalid argument
398     </pre>
399     <pre class="command">
400     # dmesg
401     </pre>
402     <pre class="output">
403     Sorry, I couldn't guess dependent symbols.
404     I need some changes for supporting your environment.
405     Please contact the author.
406     </pre>
407    
408     <hr>
409 kumaneko 123 <h3><a name="2.1.4">2.1.4. Install the userspace tools</a></h3>
410 kumaneko 97
411     <p>Make sure the dependencies described above have been installed. Compile and install the tools with the following commands:</p>
412    
413     <pre class="command">
414 kumaneko 115 $ wget -O caitsith-tools-0.1-20140105.tar.gz 'http://sourceforge.jp/frs/redir.php?m=jaist&amp;f=/caitsith/55465/caitsith-tools-0.1-20140105.tar.gz'
415     $ wget -O caitsith-tools-0.1-20140105.tar.gz.asc 'http://sourceforge.jp/frs/redir.php?m=jaist&amp;f=/caitsith/55465/caitsith-tools-0.1-20140105.tar.gz.asc'
416     $ gpg caitsith-tools-0.1-20140105.tar.gz.asc
417     $ tar -zxf caitsith-tools-0.1-20140105.tar.gz
418 kumaneko 97 $ cd caitsith-tools/
419     $ make -s USRLIBDIR=/usr/lib
420     $ su
421     # make -s USRLIBDIR=/usr/lib install
422     </pre>
423    
424     <p>Please change USRLIBDIR=<code>/usr/lib</code> to USRLIBDIR=<code>/usr/lib64</code> (for 64bits userspace) or USRLIBDIR=<code>/usr/lib32</code> (for 32bits userspace) if needed.</p>
425    
426     <p>Programs listed below are main userspace tools used for administrating CaitSith.</p>
427    
428     <ul>
429     <li><code>/sbin/caitsith-init</code></li>
430     <li><code>/usr/sbin/caitsith-auditd</code></li>
431     <li><code>/usr/sbin/caitsith-loadpolicy</code></li>
432     <li><code>/usr/sbin/caitsith-notifyd</code></li>
433     <li><code>/usr/sbin/caitsith-pstree</code></li>
434     <li><code>/usr/sbin/caitsith-queryd</code></li>
435     <li><code>/usr/sbin/caitsith-savepolicy</code></li>
436     </ul>
437    
438     <p>FYI: If your system has rpm-build package installed, you can make a tools RPM package with the following commands:</p>
439    
440     <pre class="command">
441 kumaneko 115 $ rpmbuild -tb caitsith-tools-0.1-20140105.tar.gz
442 kumaneko 97 </pre>
443    
444     <hr>
445 kumaneko 123 <h3><a name="2.1.5">2.1.5. Initializing configuration</a></h3>
446 kumaneko 97
447     <p>Before you can make use of CaitSith, an initialization procedure must take place. This prepares the files in which policy information will be stored. All policy files are <strong>stored in the "<code>/etc/caitsith/</code>" directory</strong>.</p>
448    
449     <p>Run the following command as root user to initialize:</p>
450    
451     <pre class="command">
452     # /usr/lib/caitsith/init_policy
453     </pre>
454     <pre class="output">
455     Creating policy directory... OK
456     Creating configuration directory... OK
457     Creating default policy... OK.
458     Creating module loader... OK.
459     Creating configuration file for caitsith-auditd ... OK.
460     Creating configuration file for caitsith-notifyd ... OK.
461     </pre>
462    
463     <p>CaitSith can generate audit logs and allows you to read them via <code>/proc/caitsith/audit</code> interface. To save <code>/proc/caitsith/audit</code> automatically, start <code>/usr/sbin/caitsith-auditd</code> from somewhere. Default setting (specified in <code>/etc/caitsith/tools/auditd.conf</code>) sends access allowed logs to <code>/dev/null</code>, access unmatched logs to <code>/var/log/caitsith/unmatched.log</code>, access denied logs to <code>/var/log/caitsith/denied.log</code>. (The meaning and example of allowed/unmatched/denied will be explained in <a href="#3.3">Example of simple access restriction rule</a>.)</p>
464    
465     <p>CaitSith can ask for your decision about access requests which will be denied unless you grant them via <code>/proc/caitsith/query</code> interface. To notify immediately the occurrence of access requests which CaitSith is about to deny, start <code>/usr/sbin/caitsith-notifyd</code> from somewhere. Default setting (specified in <code>/etc/caitsith/tools/notifyd.conf</code>) sends mails to root@localhost with subject "Notification from caitsith-notifyd" up to once per a minute.</p>
466    
467     <p>Below example launches <code>/usr/sbin/caitsith-auditd</code> and <code>/usr/sbin/caitsith-notifyd</code> from <code>/etc/rc.local</code> script:</p>
468    
469     <pre>
470     #!/bin/sh
471     #
472     # This script will be executed *after* all the other init scripts.
473     # You can put your own initialization stuff in here if you don't
474     # want to do the full Sys V style init stuff.
475    
476     touch /var/lock/subsys/local
477     /usr/sbin/caitsith-auditd
478     /usr/sbin/caitsith-notifyd
479     </pre>
480    
481     <hr>
482 kumaneko 123 <h3><a name="2.1.6">2.1.6. Configuring your bootloader</a></h3>
483 kumaneko 97
484 kumaneko 123 <p>On systems where use of init= kernel boot option causes boot failures (e.g. RHEL 7), you need to choose <a href="#2.1.6.1">Loading CaitSith's module from initramfs</a>. On systems where it does not cause boot failures (e.g. RHEL 6), you can choose <a href="#2.1.6.2">Loading CaitSith's module from the init process</a>.</p>
485 kumaneko 97
486 kumaneko 123 <h4><a name="2.1.6.1">2.1.6.1. Loading CaitSith's module from initramfs</a></h4>
487    
488     <p>This section assumes that you are using dracut and GRUB2.</p>
489    
490     <p>Create /etc/dracut.conf.d/caitsith.conf like below and rebuild the initramfs:</p>
491    
492     <pre class="command">
493     # echo 'add_drivers+=" caitsith "' &gt; /etc/dracut.conf.d/caitsith.conf
494     # dracut -f
495 kumaneko 97 </pre>
496    
497 kumaneko 123 <p>Edit your bootloader to add "rd.driver.pre=caitsith" to the kernel boot options. An example is shown below:</p>
498 kumaneko 97
499 kumaneko 123 <p>Before:</p>
500     <pre>linux16 /boot/vmlinuz-3.10.0-123.1.2.el7.x86_64 ro root=LABEL=/
501     </pre>
502    
503     <p>After:</p>
504     <pre>linux16 /boot/vmlinuz-3.10.0-123.1.2.el7.x86_64 ro root=LABEL=/ rd.driver.pre=caitsith
505     </pre>
506    
507     <p>It is recommended that you also modify GRUB_CMDLINE_LINUX line in <code>/etc/default/grub</code> file like below in case you update kernel packages in the future:</p>
508    
509     <p>Before:</p>
510 kumaneko 97 <pre>
511 kumaneko 123 GRUB_CMDLINE_LINUX="vconsole.keymap=us crashkernel=auto vconsole.font=latarcyrheb-sun16 rhgb quiet"
512 kumaneko 97 </pre>
513    
514 kumaneko 123 <p>After:</p>
515     <pre>
516     GRUB_CMDLINE_LINUX="vconsole.keymap=us crashkernel=auto vconsole.font=latarcyrheb-sun16 rhgb quiet rd.driver.pre=caitsith"
517     </pre>
518    
519     <h4><a name="2.1.6.2">2.1.6.2. Loading CaitSith's module from the init process</a></h4>
520     <p>Edit your bootloader (e.g. GRUB) to add "init=/sbin/caitsith-init" to the kernel boot options. An example is shown below:</p>
521    
522     <p>Before:</p>
523     <pre>kernel /boot/vmlinuz-2.6.32-431.17.1.el6.i686 ro root=LABEL=/
524     </pre>
525    
526     <p>After:</p>
527     <pre>kernel /boot/vmlinuz-2.6.32-431.17.1.el6.i686 ro root=LABEL=/ init=/sbin/caitsith-init
528     </pre>
529    
530 kumaneko 97 <hr>
531 kumaneko 123 <h3><a name="2.1.7">2.1.7. Rebooting your system</a></h3>
532 kumaneko 97
533     <p>Now you have finished all preparation. Reboot your system.</p>
534    
535     <p>If everything was installed properly and the bootloader was correctly configured, the kernel should boot as normal and CaitSith should be activated:</p>
536    
537     <img src="media/caitsith-lsm-activated.png" alt="caitsith-lsm-activated.png" title="CaitSith(LSM) activated" width="720" height="400">
538    
539 kumaneko 123 <p>Although CaitSith is a LSM module, CaitSith can coexist with other LSM modules. However, you need to also add "selinux=0" to the kernel boot options if you disable SELinux by specifying SELINUX=disabled in /etc/selinux/config . This is because the init process unregisters LSM hooks which CaitSith module depends on if SELINUX=disabled is specified in /etc/selinux/config .</p>
540    
541 kumaneko 97 <hr>
542 kumaneko 123 <h3><a name="2.1.8">2.1.8. How can I disable/uninstall CaitSith?</a></h3>
543 kumaneko 97
544 kumaneko 123 <p>If your system becomes unable to boot during the course of this guide or any time in the future, it may be due to policy configuration or something related to CaitSith. If this is the case, it is possible that the kernel can still be booted by disabling CaitSith. This can be done by removing "init=/sbin/caitsith-init" from the kernel boot options.</p>
545 kumaneko 97
546 kumaneko 123 <p>CaitSith fortunately does not require the modification of any existing Linux binaries, libraries or applications. Thus, uninstalling CaitSith is very easy. It is simply a matter of removing "rd.driver.pre=caitsith" or "init=/sbin/caitsith-init" from the kernel boot options and userspace tools that you installed above.</p>
547 kumaneko 97
548     <hr>
549     <h2><a name="2.2">2.2. How to install fully featured version</a></h2>
550    
551     <hr>
552     <h3><a name="2.2.1">2.2.1. Install dependencies</a></h3>
553    
554 kumaneko 15 <p>These packages are required for compiling the kernel and the userspace tools:</p>
555 kumaneko 10
556 kumaneko 15 <ul>
557     <li><strong>wget</strong>: to download sources</li>
558     <li><strong>patch</strong>: to patch the kernel</li>
559     <li><strong>gcc</strong>: to build the kernel and tools</li>
560     <li><strong>make</strong>: to build the kernel and tools</li>
561     <li><strong>ncurses-devel</strong> or <strong>libncurses-dev</strong>: to build the tools</li>
562     </ul>
563    
564     <p>These can be installed with the following commands:</p>
565    
566     <p><strong>RedHat distributions</strong></p>
567     <pre class="command">
568     # yum -y install wget patch gcc make ncurses-devel
569     </pre>
570     <p><strong>Debian distributions</strong></p>
571     <pre class="command">
572     # apt-get -y install wget patch gcc make libncurses-dev
573     </pre>
574     <p><strong>SUSE distributions</strong></p>
575     <pre class="command">
576     # yast -i wget patch gcc make ncurses-devel
577     </pre>
578    
579 kumaneko 30 <hr>
580 kumaneko 97 <h3><a name="2.2.2">2.2.2. Download and patch the kernel</a></h3>
581 kumaneko 15
582     <p>Download the kernel source from <a href="http://www.kernel.org/pub/linux/kernel/v2.6/">linux-2.6</a> or <a href="http://www.kernel.org/pub/linux/kernel/v3.0/">linux-3</a>.<br>
583     Linux kernel 2.6.27 and later are supported from the linux-2.6 tree.<br>
584     Linux kernel 3.0 and later are supported from the linux-3 tree.</p>
585    
586     <p>Extract the kernel source and go to the extracted directory.<br>
587 kumaneko 117 In the operations below, "$VERSION" should be replaced with appropriate kernel version. For example "3.13" if using Linux kernel 3.13.7, "2.6.27" if using Linux kernel 2.6.27.62.<br>
588     Also, there are several patches which can be applied to distributor's latest kernels. For example "2.6.32-centos-6.5" if using CentOS 6.5's latest kernel:</p>
589 kumaneko 15
590     <pre class="command">
591 kumaneko 121 $ wget -O caitsith-patch-0.1-20140601.tar.gz 'http://sourceforge.jp/frs/redir.php?m=jaist&amp;f=/caitsith/55464/caitsith-patch-0.1-20140601.tar.gz'
592     $ wget -O caitsith-patch-0.1-20140601.tar.gz.asc 'http://sourceforge.jp/frs/redir.php?m=jaist&amp;f=/caitsith/55464/caitsith-patch-0.1-20140601.tar.gz.asc'
593 kumaneko 15 $ wget http://I-love.SAKURA.ne.jp/kumaneko-key
594     $ gpg --import kumaneko-key
595 kumaneko 121 $ gpg caitsith-patch-0.1-20140601.tar.gz.asc
596     $ tar -zxf caitsith-patch-0.1-20140601.tar.gz
597 kumaneko 107 $ sed -i -e 's/CCSECURITY/CAITSITH/g' -e 's/ccsecurity/caitsith/g' -e 's/ccs_domain_info/cs_domain_info/g' -e 's/ccs_flags/cs_flags/g' -- patches/ccs-patch-*.diff
598 kumaneko 28 $ patch -sp1 &lt; patches/ccs-patch-$VERSION.diff
599 kumaneko 15 </pre>
600 kumaneko 10
601 kumaneko 30 <hr>
602 kumaneko 97 <h3><a name="2.2.3">2.2.3. Configure the kernel</a></h3>
603 kumaneko 10
604 kumaneko 15 <pre class="command">
605     $ make -s menuconfig
606     </pre>
607 kumaneko 10
608 kumaneko 15 <p>Choose the following options in "Security options" section:</p>
609 kumaneko 10
610 kumaneko 15 <ul>
611     <li>[*] CaitSith support</li>
612     <li>[ ] &nbsp;&nbsp;Compile as loadable kernel module</li>
613     <li>[ ] &nbsp;&nbsp;Disable by default</li>
614     <li>[ ] &nbsp;&nbsp;Do not modify 'struct task_struct' in order to keep KABI</li>
615     <li>[ ] &nbsp;&nbsp;Activate without calling userspace policy loader.</li>
616 kumaneko 22 <li>(<code>/sbin/caitsith-init</code>) Location of userspace policy loader</li>
617     <li>(<code>/sbin/init</code>) Trigger for calling userspace policy loader</li>
618 kumaneko 15 <li>[*] &nbsp;&nbsp;Enable readdir operation restriction.</li>
619     <li>[*] &nbsp;&nbsp;Enable getattr operation restriction.</li>
620     <li>[*] &nbsp;&nbsp;Enable socket operation restriction.</li>
621     <li>[*] &nbsp;&nbsp;Enable non-POSIX capability operation restriction.</li>
622     <li>[*] &nbsp;&nbsp;Enable ptrace operation restriction.</li>
623     <li>[*] &nbsp;&nbsp;Enable kill operation restriction.</li>
624     <li>[*] &nbsp;&nbsp;Enable environment variable names/values restriction.</li>
625     <li>[*] &nbsp;&nbsp;Enable execute handler functionality.</li>
626     <li>[*] &nbsp;&nbsp;Enable domain transition without program execution request.</li>
627     <li>[*] &nbsp;&nbsp;Enable automatic domain transition.</li>
628     </ul>
629    
630     <p><em>"Compile as loadable kernel module"</em> is useful when there is a file size limitation for vmlinux (e.g. embedded systems).</p>
631    
632 kumaneko 123 <p><em>"Disable by default"</em> will enable CaitSith only when "caitsith=on" is passed to the kernel boot options. If this option is not selected, "caitsith=off" will disable CaitSith.</p>
633 kumaneko 15
634     <p><em>"Do not modify 'struct task_struct' in order to keep KABI"</em> will manage "struct task_struct" variables outside "struct task_struct" in order to avoid Kernel Application Binary Interface (KABI) breakage. Choose this option if wanting to patch against distributor's kernels without breaking KABI. However, since "struct caitsith_operations" must be exported to loadable kernel modules (LKMs) in order to allow them to call CaitSith's functions, build scripts may still print warning messages.</p>
635    
636 kumaneko 22 <p>There are two types of CaitSith's policy configuration. The former is embedded into the kernel and the latter is saved as files on the filesystems (e.g. <code>/etc/caitsith/</code> directory). You will need to rebuild the kernel whenever updating the former, but allows you to load policy without using userspace policy loader (e.g. <code>/sbin/caitsith-init</code>). The latter is loaded by executing userspace policy loader when the access control by CaitSith is about to be activated (e.g. when <code>/sbin/init</code> starts). <em>Activate without calling userspace policy loader.</em> allows you to activate access control by CaitSith as soon as the former is loaded. This option is useful when it is difficult to call policy loader (e.g. embedded systems).</p>
637 kumaneko 15
638 kumaneko 123 <p><em>Location of userspace policy loader</em> is available only when <em>Activate without calling userspace policy loader.</em> is not selected. This option specifies the default pathname of the userspace policy loader. You can override this setting via the "CS_loader=" kernel boot option.</p>
639 kumaneko 15
640 kumaneko 123 <p><em>Trigger for calling userspace policy loader</em> is available only when <em>Activate without calling userspace policy loader.</em> is not selected. This option specifies the default pathname of the activation trigger. You can override this setting via the "CS_trigger=" kernel boot option. For example, if you pass "init=<code>/usr/lib/systemd/systemd</code>" option, you may also want to pass "CS_trigger=<code>/usr/lib/systemd/systemd</code>" option.</p>
641 kumaneko 15
642 kumaneko 30 <hr>
643 kumaneko 97 <h3><a name="2.2.4">2.2.4. Compile and install the kernel</a></h3>
644 kumaneko 15
645 kumaneko 22 <p>The policy configuration which will be embedded into the kernel needs to exist as <code>security/caitsith/policy/policy.conf</code>. But you can proceed without creating that file because you don't have the policy configuration to embed as of this step. (You may come back here after you developed policy configuration to embed.)</p>
646 kumaneko 15
647     <p>Once the kernel has been configured, compile and install the kernel with the following commands:</p>
648    
649     <pre class="command">
650     $ make -s
651     $ su
652     # make -s modules_install install
653     </pre>
654    
655     <p>Create initrd/initramfs if required.</p>
656    
657 kumaneko 30 <hr>
658 kumaneko 97 <h3><a name="2.2.5">2.2.5. Install the userspace tools</a></h3>
659 kumaneko 15
660     <p>Make sure the dependencies described above have been installed. Compile and install the tools with the following commands:</p>
661    
662     <pre class="command">
663 kumaneko 115 $ wget -O caitsith-tools-0.1-20140105.tar.gz 'http://sourceforge.jp/frs/redir.php?m=jaist&amp;f=/caitsith/55465/caitsith-tools-0.1-20140105.tar.gz'
664     $ wget -O caitsith-tools-0.1-20140105.tar.gz.asc 'http://sourceforge.jp/frs/redir.php?m=jaist&amp;f=/caitsith/55465/caitsith-tools-0.1-20140105.tar.gz.asc'
665     $ gpg caitsith-tools-0.1-20140105.tar.gz.asc
666     $ tar -zxf caitsith-tools-0.1-20140105.tar.gz
667 kumaneko 10 $ cd caitsith-tools/
668 kumaneko 15 $ make -s USRLIBDIR=/usr/lib
669     $ su
670     # make -s USRLIBDIR=/usr/lib install
671     </pre>
672 kumaneko 10
673 kumaneko 22 <p>Please change USRLIBDIR=<code>/usr/lib</code> to USRLIBDIR=<code>/usr/lib64</code> (for 64bits userspace) or USRLIBDIR=<code>/usr/lib32</code> (for 32bits userspace) if needed.</p>
674 kumaneko 10
675 kumaneko 15 <p>Programs listed below are main userspace tools used for administrating CaitSith.</p>
676 kumaneko 10
677 kumaneko 15 <ul>
678 kumaneko 22 <li><code>/sbin/caitsith-init</code></li>
679     <li><code>/usr/sbin/caitsith-auditd</code></li>
680     <li><code>/usr/sbin/caitsith-loadpolicy</code></li>
681     <li><code>/usr/sbin/caitsith-notifyd</code></li>
682     <li><code>/usr/sbin/caitsith-pstree</code></li>
683     <li><code>/usr/sbin/caitsith-queryd</code></li>
684     <li><code>/usr/sbin/caitsith-savepolicy</code></li>
685 kumaneko 15 </ul>
686    
687 kumaneko 97 <p>FYI: If your system has rpm-build package installed, you can make a tools RPM package with the following commands:</p>
688 kumaneko 15
689 kumaneko 97 <pre class="command">
690 kumaneko 115 $ rpmbuild -tb caitsith-tools-0.1-20140105.tar.gz
691 kumaneko 15 </pre>
692    
693 kumaneko 30 <hr>
694 kumaneko 97 <h3><a name="2.2.6">2.2.6. Initializing configuration</a></h3>
695 kumaneko 15
696 kumaneko 22 <p>Before you can make use of CaitSith, an initialization procedure must take place. This prepares the files in which policy information will be stored. All policy files are <strong>stored in the "<code>/etc/caitsith/</code>" directory</strong>.</p>
697 kumaneko 15
698     <p>Run the following command as root user to initialize:</p>
699    
700     <pre class="command">
701     # /usr/lib/caitsith/init_policy
702     </pre>
703     <pre class="output">
704     Creating policy directory... OK
705     Creating configuration directory... OK
706     Creating default policy... OK.
707     Creating module loader... OK.
708     Creating configuration file for caitsith-auditd ... OK.
709     Creating configuration file for caitsith-notifyd ... OK.
710     </pre>
711    
712 kumaneko 22 <p>CaitSith can generate audit logs and allows you to read them via <code>/proc/caitsith/audit</code> interface. To save <code>/proc/caitsith/audit</code> automatically, start <code>/usr/sbin/caitsith-auditd</code> from somewhere. Default setting (specified in <code>/etc/caitsith/tools/auditd.conf</code>) sends access allowed logs to <code>/dev/null</code>, access unmatched logs to <code>/var/log/caitsith/unmatched.log</code>, access denied logs to <code>/var/log/caitsith/denied.log</code>. (The meaning and example of allowed/unmatched/denied will be explained in <a href="#3.3">Example of simple access restriction rule</a>.)</p>
713 kumaneko 15
714 kumaneko 22 <p>CaitSith can ask for your decision about access requests which will be denied unless you grant them via <code>/proc/caitsith/query</code> interface. To notify immediately the occurrence of access requests which CaitSith is about to deny, start <code>/usr/sbin/caitsith-notifyd</code> from somewhere. Default setting (specified in <code>/etc/caitsith/tools/notifyd.conf</code>) sends mails to root@localhost with subject "Notification from caitsith-notifyd" up to once per a minute.</p>
715 kumaneko 15
716 kumaneko 22 <p>Below example launches <code>/usr/sbin/caitsith-auditd</code> and <code>/usr/sbin/caitsith-notifyd</code> from <code>/etc/rc.local</code> script:</p>
717 kumaneko 15
718     <pre>
719     #!/bin/sh
720     #
721     # This script will be executed *after* all the other init scripts.
722     # You can put your own initialization stuff in here if you don't
723     # want to do the full Sys V style init stuff.
724    
725     touch /var/lock/subsys/local
726     /usr/sbin/caitsith-auditd
727     /usr/sbin/caitsith-notifyd
728     </pre>
729    
730 kumaneko 30 <hr>
731 kumaneko 97 <h3><a name="2.2.7">2.2.7. Configuring your bootloader</a></h3>
732 kumaneko 15
733     <p>Now edit your bootloader (e.g. GRUB) to include the kernel you have just compiled. If the <em>"Disable by default"</em> option was selected during kernel configuration, remember to include "caitsith=on" in the kernel boot options. Consult the documentation for your distribution and bootloader to find out how to boot your CaitSith kernel.</p>
734    
735 kumaneko 16 <pre>
736     # grub.conf generated by anaconda
737     #
738     # Note that you do not have to rerun grub after making changes to this file
739     # NOTICE: You do not have a /boot partition. This means that
740     # all kernel and initrd paths are relative to /, eg.
741     # root (hd0,0)
742     # kernel /boot/vmlinuz-version ro root=/dev/sda1
743     # initrd /boot/initrd-[generic-]version.img
744     #boot=/dev/sda
745     default=1
746     timeout=5
747     splashimage=(hd0,0)/boot/grub/splash.xpm.gz
748     #hiddenmenu
749 kumaneko 97 title CentOS (3.8.6-caitsith)
750 kumaneko 16 root (hd0,0)
751 kumaneko 97 kernel /boot/vmlinuz-3.8.6-caitsith ro root=UUID=cc8371f3-bb2c-47b4-bd8f-318124f523df rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=jp106 crashkernel=auto
752     initrd /boot/initramfs-3.8.6-caitsith.img
753     title CentOS (2.6.32-358.2.1.el6.i686)
754 kumaneko 16 root (hd0,0)
755 kumaneko 97 kernel /boot/vmlinuz-2.6.32-358.2.1.el6.i686 ro root=UUID=cc8371f3-bb2c-47b4-bd8f-318124f523df rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=jp106 crashkernel=auto
756     initrd /boot/initramfs-2.6.32-358.2.1.el6.i686.img
757 kumaneko 16 </pre>
758    
759 kumaneko 30 <hr>
760 kumaneko 97 <h3><a name="2.2.8">2.2.8. Rebooting your system</a></h3>
761 kumaneko 15
762 kumaneko 16 <p>Now you have finished all preparation. Reboot your system and choose the entry with CaitSith kernel at the GRUB screen, or at whatever other bootloader you have installed:</p>
763 kumaneko 15
764 kumaneko 16 <img src="media/grub-screen.png" alt="grub-screen.png" title="Select CaitSith enabled kernel" width="640" height="480">
765 kumaneko 15
766     <p>If everything was installed properly and the bootloader was correctly configured, the kernel should boot as normal and CaitSith should be activated:</p>
767    
768 kumaneko 16 <img src="media/caitsith-activated.png" alt="caitsith-activated.png" title="CaitSith activated" width="720" height="400">
769 kumaneko 15
770 kumaneko 30 <hr>
771 kumaneko 97 <h3><a name="2.2.9">2.2.9. How can I disable/uninstall CaitSith?</a></h3>
772 kumaneko 15
773 kumaneko 123 <p>If your system becomes unable to boot during the course of this guide or any time in the future, it may be due to policy configuration or something related to CaitSith. If this is the case, it is possible that the kernel can still be booted by disabling CaitSith. This can be done by appending "caitsith=off" to the kernel boot options.</p>
774 kumaneko 15
775     <p>CaitSith fortunately does not require the modification of any existing Linux binaries, libraries or applications. Thus, uninstalling CaitSith is very easy. It is simply a matter of uninstalling the kernel and userspace tools that you installed above. You can reboot with the kernel provided by your distribution and then remove the entry from your bootloader.</p>
776    
777 kumaneko 30 <hr>
778 kumaneko 10 <h2><a name="how_to_develop_policy">3. How to develop policy</a></h2>
779    
780 kumaneko 30 <hr>
781 kumaneko 16 <h3><a name="3.1">3.1. Policy file structure</a></h3>
782 kumaneko 10
783 kumaneko 16 <p>CaitSith's policy file consists with "Header part" and "ACL part".</p>
784 kumaneko 10
785 kumaneko 17 <h4><a name="3.1.1">3.1.1. Header part of policy file</a></h4>
786    
787 kumaneko 16 <p>Header part consists with below lines.</p>
788 kumaneko 10
789 kumaneko 16 <pre>
790     POLICY_VERSION=20120401
791 kumaneko 17 stat $stat_name $stat_value
792 kumaneko 16 quota memory policy $max_byte_for_policy
793     quota memory audit $max_byte_for_audit_logs
794     quota memory query $max_byte_for_query
795     quota audit[$audit_index] allowed=$max_logs_for_allowed_request unmatched=$max_logs_for_unmatched_request denied=$max_logs_for_denied_request
796     string_group $string_group_name $string_group_member
797     number_group $number_group_name $number_group_member
798     ip_group $ip_group_name $ip_group_member
799     </pre>
800 kumaneko 10
801 kumaneko 16 <ul>
802     <li>POLICY_VERSION line defines policy version.</li>
803 kumaneko 17 <li>stat lines are for showing statistics information such as memory usage. $stat_name and $stat_value are simply ignored.</li>
804 kumaneko 16 <li>$max_byte_for_policy is max amount of memory in byte which can be allocated for policy. Default is unlimited.</li>
805     <li>$max_byte_for_audit_logs is max amount of memory in byte which can be allocated for audit logs. Default is unlimited. $max_byte_for_audit_logs=16777216 should be sufficient.</li>
806     <li>$max_byte_for_query is max amount of memory in byte which can be allocated for interactive enforcement. Default is unlimited. $max_byte_for_audit_logs=1048576 should be sufficient.</li>
807     <li>quota audit[$audit_index] lines (0 &lt;= $audit_index &lt;= 255) are max number of audit logs which can be held in the kernel space. $max_logs_for_allowed_request is for allowed requests. $max_logs_for_unmatched_request is for unmatched requests. $max_logs_for_denied_request is for denied requests. Default is 0. Unless you have special reasons, you should set 0 to $max_logs_for_allowed_request. Regarding $max_logs_for_unmatched_request and $max_logs_for_denied_request, 1024 should be sufficient.</li>
808     <li>string_group $string_group_name lines define group of strings. $string_group_member is a member for $string_group_name group.</li>
809     <li>number_group $number_group_name lines define group of numbers. $number_group_member is a member for $number_group_name group.</li>
810     <li>ip_group $ip_group_name lines define group of IP addresses. $ip_group_member is a member for $ip_group_name group.</li>
811     </ul>
812 kumaneko 10
813 kumaneko 17 <h4><a name="3.1.2">3.1.2. ACL part of policy file</a></h4>
814 kumaneko 16
815 kumaneko 17 <p>ACL part consists with 0 or more repetitions of below block.</p>
816    
817 kumaneko 16 <pre>
818     $acl_priority acl $operation $conditions_to_filter
819     audit $audit_index
820     $cond_priority $decision $conditions_to_allow_or_deny
821     </pre>
822    
823     <ul>
824     <li>A block which starts with $acl_priority determines whether to evaluate rules in this block or not.</li>
825     <li>Blocks which start with $acl_priority can be defined as many as you need.</li>
826     <li>$acl_priority is a priority (an integer between 0 and 65535) which controls which block should be evaluated first (among all blocks defined in the policy).</li>
827     <li>Blocks are evaluated from smaller $acl_priority values to larger $acl_priority values.</li>
828     <li>If two blocks have same $acl_priority value, the block which is defined first is evaluated first.</li>
829     <li>$operation is "operation".</li>
830     <li>$conditions_to_filter is "conditional expressions" which can be applied to "operation". Omit $conditions_to_filter to evaluate this block unconditionally.</li>
831     <li>Access requests will be denied if one of deny lines (among all blocks defined in the policy) matches.</li>
832     </ul>
833    
834     <p>$decision lines in a block is evaluated only when the block's $acl_priority line matched.</p>
835    
836     <ul>
837     <li>A line which starts with $cond_priority determines whether to grant the access request or not.</li>
838     <li>Lines which start with $cond_priority can be defined as many as you need.</li>
839     <li>$cond_priority is a priority (an integer between 0 and 65535) which controls which line should be checked first (among all lines defined in the block).</li>
840     <li>Lines are checked from smaller $cond_priority values to larger priority values.</li>
841     <li>If two lines have same $cond_priority value, the line which is defined first is checked first.</li>
842     <li>$decision is either allow or deny.</li>
843     <li>$conditions_to_allow_or_deny is "conditional expressions" which can be applied to "operation". Omit $conditions_to_allow_or_deny to match this line unconditionally.</li>
844     </ul>
845    
846     <p>Checking of $decision lines in a block lasts until it matches a $decision line or it reaches to the end of block.</p>
847    
848     <ul>
849     <li>If $conditions_to_allow_or_deny of a deny line matches, the access request is denied. At the same time, access denied log is generated if memory used for audit logs is smaller than $max_byte_for_audit_logs bytes and number of denied logs which is in the kernel is smaller than $max_logs_for_denied_request of quota audit[$audit_index] line where $audit_index is specified by audit line of this block.</li>
850     <li>If $conditions_to_allow_or_deny of an allow line matches, the evaluation of this block ends and proceeds to next block. At the same time, access allowed log is generated if memory used for audit logs is smaller than $max_byte_for_audit_logs bytes and number of allowed logs which is in the kernel is smaller than $max_logs_for_allowed_request of quota audit[$audit_index] line where $audit_index is specified by audit line of this block.</li>
851     <li>If none of $conditions_to_allow_or_deny matches, the evaluation of this block ends and proceeds to next block. At the same time, access unmatched log is generated if memory used for audit logs is smaller than $max_byte_for_audit_logs bytes and number of unmatched logs which is in the kernel is smaller than $max_logs_for_unmatched_request of quota audit[$audit_index] line where $audit_index is specified by audit line of this block.</li>
852     </ul>
853    
854 kumaneko 30 <p>Access requests will be denied only when "deny" line of "acl" block matched. (There are two exceptions. Regarding permission to change domains manually (i.e. <a href="#5.60">acl manual_domain_transition</a> blocks) and permission to change domains automatically (i.e. <a href="#5.61">acl auto_domain_transition</a> blocks), access requests will be granted only when "allow" line of all blocks match, in order to avoid unintended domain transition.)</p>
855 kumaneko 16
856     <p>$acl_priority and $cond_priority values are used for two purposes. One is for selectively deny operations using "deny" lines. For example,</p>
857    
858     <pre>
859     10 acl read path.fsmagic=0x9FA0
860     audit 0
861     10 deny path="proc:/cmdline"
862     20 allow
863     </pre>
864    
865 kumaneko 22 <p>denies opening <code>/proc/cmdline</code> on the proc filesystem (proc filesystem's magic number is 0x9FA0) for reading while allowing opening all other files.</p>
866 kumaneko 16
867 kumaneko 30 <p>The other is for controlling which "transition=" and "handler=" arguments should be used when these arguments matched more than once. This will be explained in <a href="#advanced_usage">advanced usage</a>.</p>
868 kumaneko 16
869 kumaneko 17 <h4><a name="3.1.3">3.1.3. An example policy file</a></h4>
870    
871 kumaneko 22 <p>Below is an example of <code>/etc/caitsith/policy/current</code> file on CentOS. The content of this file varies depending on environments you are using, and will be updated as you develop policy.</p>
872 kumaneko 16
873     <pre>
874     POLICY_VERSION=20120401
875    
876     quota memory audit 16777216
877     quota memory query 1048576
878     quota audit[1] allowed=0 denied=1024 unmatched=1024
879    
880     10000 acl execute
881     audit 0
882     10 allow path="/sbin/modprobe" transition="/sbin/modprobe"
883     10 allow path="/sbin/init" transition="/sbin/init"
884     10 allow path="/sbin/mingetty" transition="/sbin/mingetty"
885     10 allow path="/sbin/udevd" transition="/sbin/udevd"
886     10 allow path="/usr/sbin/anacron" transition="/usr/sbin/anacron"
887     10 allow path="/usr/sbin/crond" transition="/usr/sbin/crond"
888     10 allow path="/usr/sbin/httpd" transition="/usr/sbin/httpd"
889     10 allow path="/usr/sbin/logrotate" transition="/usr/sbin/logrotate"
890     10 allow path="/usr/sbin/nmbd" transition="/usr/sbin/nmbd"
891     10 allow path="/usr/sbin/smbd" transition="/usr/sbin/smbd"
892     10 allow path="/usr/sbin/sshd" transition="/usr/sbin/sshd"
893     10 allow path="/etc/rc.d/init.d/ntpd" transition="/etc/rc.d/init.d/ntpd"
894     10 allow path="/etc/rc.d/init.d/single" transition="/etc/rc.d/init.d/single"
895     10 allow path="/etc/rc.d/init.d/killall" transition="/etc/rc.d/init.d/killall"
896     10 allow path="/etc/rc.d/init.d/ip6tables" transition="/etc/rc.d/init.d/ip6tables"
897     10 allow path="/etc/rc.d/init.d/halt" transition="/etc/rc.d/init.d/halt"
898     10 allow path="/etc/rc.d/init.d/netfs" transition="/etc/rc.d/init.d/netfs"
899     10 allow path="/etc/rc.d/init.d/messagebus" transition="/etc/rc.d/init.d/messagebus"
900     10 allow path="/etc/rc.d/init.d/sandbox" transition="/etc/rc.d/init.d/sandbox"
901     10 allow path="/etc/rc.d/init.d/rsyslog" transition="/etc/rc.d/init.d/rsyslog"
902     10 allow path="/etc/rc.d/init.d/smb" transition="/etc/rc.d/init.d/smb"
903     10 allow path="/etc/rc.d/init.d/sshd" transition="/etc/rc.d/init.d/sshd"
904     10 allow path="/etc/rc.d/init.d/cgconfig" transition="/etc/rc.d/init.d/cgconfig"
905     10 allow path="/etc/rc.d/init.d/udev-post" transition="/etc/rc.d/init.d/udev-post"
906     10 allow path="/etc/rc.d/init.d/firstboot" transition="/etc/rc.d/init.d/firstboot"
907     10 allow path="/etc/rc.d/init.d/ntpdate" transition="/etc/rc.d/init.d/ntpdate"
908     10 allow path="/etc/rc.d/init.d/crond" transition="/etc/rc.d/init.d/crond"
909     10 allow path="/etc/rc.d/init.d/restorecond" transition="/etc/rc.d/init.d/restorecond"
910     10 allow path="/etc/rc.d/init.d/httpd" transition="/etc/rc.d/init.d/httpd"
911     10 allow path="/etc/rc.d/init.d/rdisc" transition="/etc/rc.d/init.d/rdisc"
912     10 allow path="/etc/rc.d/init.d/postfix" transition="/etc/rc.d/init.d/postfix"
913     10 allow path="/etc/rc.d/init.d/saslauthd" transition="/etc/rc.d/init.d/saslauthd"
914     10 allow path="/etc/rc.d/init.d/netconsole" transition="/etc/rc.d/init.d/netconsole"
915     10 allow path="/etc/rc.d/init.d/network" transition="/etc/rc.d/init.d/network"
916     10 allow path="/etc/rc.d/init.d/avahi-daemon" transition="/etc/rc.d/init.d/avahi-daemon"
917     10 allow path="/etc/rc.d/init.d/auditd" transition="/etc/rc.d/init.d/auditd"
918     10 allow path="/etc/rc.d/init.d/nmb" transition="/etc/rc.d/init.d/nmb"
919     10 allow path="/etc/rc.d/init.d/iptables" transition="/etc/rc.d/init.d/iptables"
920     10 allow path="/etc/rc.d/init.d/cgred" transition="/etc/rc.d/init.d/cgred"
921    
922     0 acl modify_policy
923     audit 1
924     1 deny task.uid!=0
925     1 deny task.euid!=0
926     100 allow task.exe="/usr/sbin/caitsith-loadpolicy"
927     100 allow task.exe="/usr/sbin/caitsith-queryd"
928     10000 deny
929     </pre>
930    
931 kumaneko 30 <hr>
932 kumaneko 16 <h3><a name="3.2">3.2. Updating policy configuration</a></h3>
933    
934     <p>There are two ways to update policy configuration.</p>
935    
936 kumaneko 22 <p>One is to use <code>/sbin/caitsith-init</code> which is automatically called when <code>/sbin/init</code> starts. <code>/sbin/caitsith-init</code> reads policy from <code>/etc/caitsith/policy/current</code> and writes to <code>/proc/caitsith/policy</code> interface. Therefore, you can update policy configuration by updating <code>/etc/caitsith/policy/current</code> and rebooting your system.</p>
937 kumaneko 16
938 kumaneko 22 <p>The other is to use <code>/usr/sbin/caitsith-loadpolicy</code> which is defined for loading policy after your system has booted. <code>/usr/sbin/caitsith-loadpolicy</code> reads policy from standard input and writes to <code>/proc/caitsith/policy</code> interface. Therefore, you can update policy configuration without updating <code>/etc/caitsith/policy/current</code> and rebooting your system. For example, if you want to append a "string_group mygroup1 /" line to <code>/proc/caitsith/policy</code> interface, run below command:</p>
939 kumaneko 16
940     <pre class="command">
941     # echo 'string_group mygroup1 /' | /usr/sbin/caitsith-loadpolicy
942     </pre>
943    
944 kumaneko 22 <p>If you want to delete the "string_group mygroup1 /" line from <code>/proc/caitsith/policy</code> interface, run below command:</p>
945 kumaneko 16
946     <pre class="command">
947     # echo 'delete string_group mygroup1 /' | /usr/sbin/caitsith-loadpolicy
948     </pre>
949    
950 kumaneko 22 <p>The contents in <code>/proc/caitsith/policy</code> will be lost when your system shuts down or reboots. To save <code>/proc/caitsith/policy</code> as <code>/etc/caitsith/policy/current</code>, run below command:</p>
951 kumaneko 16
952     <pre class="command">
953     # /usr/sbin/caitsith-savepolicy
954     </pre>
955    
956 kumaneko 30 <hr>
957 kumaneko 16 <h3><a name="3.3">3.3. Example of simple access restriction rule</a></h3>
958    
959 kumaneko 17 <p>Let's experience how CaitSith restricts access using simple examples.</p>
960    
961     <h4><a name="3.3.1">3.3.1. Telling CaitSith which access requests should be checked</a></h4>
962    
963     <p>By default, CaitSith does not deny access requests. To restrict access requests, you need to tell CaitSith which access requests should be denied.</p>
964    
965 kumaneko 22 <p>Below rule will check access requests which open <code>/tmp/file1</code> for reading.</p>
966 kumaneko 17
967     <pre>
968     100 acl read path="/tmp/file1"
969     audit 1
970     </pre>
971    
972 kumaneko 22 <p>Append above rule using <code>/usr/sbin/caitsith-loadpolicy</code>. Since <code>/usr/sbin/caitsith-loadpolicy</code> reads policy from standard input, you can use ^D (Ctrl-D) to indicate end of input:</p>
973 kumaneko 17
974     <pre class="command">
975     # /usr/sbin/caitsith-loadpolicy
976     </pre>
977     <pre>
978     100 acl read path="/tmp/file1"
979     audit 1
980     ^D
981     </pre>
982    
983     <p>You may use a temporary file if you worry typos.</p>
984    
985     <pre class="command">
986     # cat &gt; ~/policy.tmp
987     </pre>
988     <pre>
989     100 acl read path="/tmp/file1"
990     audit 1
991     ^D
992     </pre>
993     <pre class="command">
994     # /usr/sbin/caitsith-loadpolicy &lt; ~/policy.tmp
995     # rm ~/policy.tmp
996     </pre>
997    
998 kumaneko 22 <p>You can confirm that above rule is appended to <code>/proc/caitsith/policy</code> by reading <code>/proc/caitsith/policy</code>.</p>
999 kumaneko 17
1000     <pre class="command">
1001     # cat /proc/caitsith/policy
1002     </pre>
1003     <pre>
1004     POLICY_VERSION=20120401
1005     stat Policy updated: 7 (Last: 2012/04/08 04:56:45)
1006     stat Requests denied: 0
1007     stat Memory used by policy: 6048
1008     stat Memory used by audit: 0
1009     stat Memory used by query: 0
1010     quota memory audit 16777216
1011     quota memory query 1048576
1012     quota audit[1] allowed=0 denied=1024 unmatched=1024
1013    
1014     10000 acl execute
1015     audit 0
1016     10 allow path="/sbin/modprobe" transition="/sbin/modprobe"
1017     10 allow path="/sbin/init" transition="/sbin/init"
1018     10 allow path="/sbin/mingetty" transition="/sbin/mingetty"
1019     10 allow path="/sbin/udevd" transition="/sbin/udevd"
1020     10 allow path="/usr/sbin/anacron" transition="/usr/sbin/anacron"
1021     10 allow path="/usr/sbin/crond" transition="/usr/sbin/crond"
1022     10 allow path="/usr/sbin/httpd" transition="/usr/sbin/httpd"
1023     10 allow path="/usr/sbin/logrotate" transition="/usr/sbin/logrotate"
1024     10 allow path="/usr/sbin/nmbd" transition="/usr/sbin/nmbd"
1025     10 allow path="/usr/sbin/smbd" transition="/usr/sbin/smbd"
1026     10 allow path="/usr/sbin/sshd" transition="/usr/sbin/sshd"
1027     10 allow path="/etc/rc.d/init.d/ntpd" transition="/etc/rc.d/init.d/ntpd"
1028     10 allow path="/etc/rc.d/init.d/single" transition="/etc/rc.d/init.d/single"
1029     10 allow path="/etc/rc.d/init.d/killall" transition="/etc/rc.d/init.d/killall"
1030     10 allow path="/etc/rc.d/init.d/ip6tables" transition="/etc/rc.d/init.d/ip6tables"
1031     10 allow path="/etc/rc.d/init.d/halt" transition="/etc/rc.d/init.d/halt"
1032     10 allow path="/etc/rc.d/init.d/netfs" transition="/etc/rc.d/init.d/netfs"
1033     10 allow path="/etc/rc.d/init.d/messagebus" transition="/etc/rc.d/init.d/messagebus"
1034     10 allow path="/etc/rc.d/init.d/sandbox" transition="/etc/rc.d/init.d/sandbox"
1035     10 allow path="/etc/rc.d/init.d/rsyslog" transition="/etc/rc.d/init.d/rsyslog"
1036     10 allow path="/etc/rc.d/init.d/smb" transition="/etc/rc.d/init.d/smb"
1037     10 allow path="/etc/rc.d/init.d/sshd" transition="/etc/rc.d/init.d/sshd"
1038     10 allow path="/etc/rc.d/init.d/cgconfig" transition="/etc/rc.d/init.d/cgconfig"
1039     10 allow path="/etc/rc.d/init.d/udev-post" transition="/etc/rc.d/init.d/udev-post"
1040     10 allow path="/etc/rc.d/init.d/firstboot" transition="/etc/rc.d/init.d/firstboot"
1041     10 allow path="/etc/rc.d/init.d/ntpdate" transition="/etc/rc.d/init.d/ntpdate"
1042     10 allow path="/etc/rc.d/init.d/crond" transition="/etc/rc.d/init.d/crond"
1043     10 allow path="/etc/rc.d/init.d/restorecond" transition="/etc/rc.d/init.d/restorecond"
1044     10 allow path="/etc/rc.d/init.d/httpd" transition="/etc/rc.d/init.d/httpd"
1045     10 allow path="/etc/rc.d/init.d/rdisc" transition="/etc/rc.d/init.d/rdisc"
1046     10 allow path="/etc/rc.d/init.d/postfix" transition="/etc/rc.d/init.d/postfix"
1047     10 allow path="/etc/rc.d/init.d/saslauthd" transition="/etc/rc.d/init.d/saslauthd"
1048     10 allow path="/etc/rc.d/init.d/netconsole" transition="/etc/rc.d/init.d/netconsole"
1049     10 allow path="/etc/rc.d/init.d/network" transition="/etc/rc.d/init.d/network"
1050     10 allow path="/etc/rc.d/init.d/avahi-daemon" transition="/etc/rc.d/init.d/avahi-daemon"
1051     10 allow path="/etc/rc.d/init.d/auditd" transition="/etc/rc.d/init.d/auditd"
1052     10 allow path="/etc/rc.d/init.d/nmb" transition="/etc/rc.d/init.d/nmb"
1053     10 allow path="/etc/rc.d/init.d/iptables" transition="/etc/rc.d/init.d/iptables"
1054     10 allow path="/etc/rc.d/init.d/cgred" transition="/etc/rc.d/init.d/cgred"
1055    
1056     100 acl read path="/tmp/file1"
1057     audit 1
1058    
1059     0 acl modify_policy
1060     audit 1
1061     1 deny task.uid!=0
1062     1 deny task.euid!=0
1063     100 allow task.exe="/usr/sbin/caitsith-loadpolicy"
1064     100 allow task.exe="/usr/sbin/caitsith-queryd"
1065     10000 deny
1066     </pre>
1067    
1068     <h4><a name="3.3.2">3.3.2. Access requests which will be implicitly allowed by CaitSith</a></h4>
1069    
1070 kumaneko 22 <p>Make sure that <code>/usr/sbin/caitsith-auditd</code> is running.</p>
1071 kumaneko 17
1072     <pre class="command">
1073     # pidof caitsith-auditd
1074     </pre>
1075     <pre>
1076     3627
1077     </pre>
1078    
1079 kumaneko 22 <p>Now, create <code>/tmp/file1</code> file.</p>
1080 kumaneko 17
1081     <pre class="command">
1082     # touch /tmp/file1
1083     </pre>
1084    
1085 kumaneko 22 <p>Then, open <code>/tmp/file1</code> for reading.</p>
1086 kumaneko 17
1087     <pre class="command">
1088     # cat /tmp/file1
1089     </pre>
1090    
1091 kumaneko 22 <p>Check <code>/var/log/caitsith/unmatched.log</code> for access unmatched log of this access request. You will find an entry like below:</p>
1092 kumaneko 17
1093     <pre class="command">
1094     # grep /tmp/file1 /var/log/caitsith/unmatched.log
1095     </pre>
1096     <pre>
1097     #2012/04/08 04:58:40# global-pid=3678 result=unmatched priority=100 / read path="/tmp/file1" task.pid=3678 task.ppid=3653 task.uid=0 task.gid=0 task.euid=0 task.egid=0 task.suid=0 task.sgid=0 task.fsuid=0 task.fsgid=0 task.type!=execute_handler task.exe="/bin/cat" task.domain="/usr/sbin/sshd" path.uid=0 path.gid=0 path.ino=2113451 path.major=8 path.minor=1 path.perm=0644 path.type=file path.fsmagic=0xEF53 path.parent.uid=0 path.parent.gid=0 path.parent.ino=2097153 path.parent.major=8 path.parent.minor=1 path.parent.perm=01777 path.parent.type=directory path.parent.fsmagic=0xEF53
1098     </pre>
1099    
1100 kumaneko 19 <p>Note the <strong>result=unmatched</strong> part of the entry. This indicates that access request was checked but matched neither "allow" nor "deny" rule.</p>
1101 kumaneko 17
1102 kumaneko 19 <p>Note the <strong>priority=100</strong> part of the entry. This indicates that this entry was generated by rules which have 100 as priority.</p>
1103 kumaneko 17
1104 kumaneko 22 <p>Note the <strong>read path="<code>/tmp/file1</code>"</strong> part of the entry. This indicates that this entry was generated by access request of opening <code>/tmp/file1</code> for reading.</p>
1105 kumaneko 17
1106     <h4><a name="3.3.3">3.3.3. Access requests which will be explicitly denied by CaitSith</a></h4>
1107    
1108     <p>Now, let's add a rule to explicitly deny this request.</p>
1109    
1110     <pre>
1111     100 acl read path="/tmp/file1"
1112     1000 deny
1113     </pre>
1114    
1115 kumaneko 22 <p>Append above rule using <code>/usr/sbin/caitsith-loadpolicy</code>:</p>
1116 kumaneko 17
1117     <pre class="command">
1118     # /usr/sbin/caitsith-loadpolicy
1119     </pre>
1120     <pre>
1121     100 acl read path="/tmp/file1"
1122     1000 deny
1123     ^D
1124     </pre>
1125    
1126 kumaneko 22 <p>Rules that have same priority (in this rule, 100) and same operation (in this rule, read) and same condition (in this rule, path="<code>/tmp/file1</code>") are automatically merged. Therefore, you will find</p>
1127 kumaneko 17
1128     <pre>
1129     100 acl read path="/tmp/file1"
1130     audit 1
1131     1000 deny
1132     </pre>
1133    
1134     <p>rather than</p>
1135    
1136     <pre>
1137     100 acl read path="/tmp/file1"
1138     audit 1
1139    
1140     100 acl read path="/tmp/file1"
1141     1000 deny
1142     </pre>
1143    
1144 kumaneko 22 <p>when you read <code>/proc/caitsith/policy</code>.</p>
1145 kumaneko 17
1146 kumaneko 22 <p>Then, open <code>/tmp/file1</code> for reading.</p>
1147 kumaneko 17
1148     <pre class="command">
1149     # cat /tmp/file1
1150     </pre>
1151     <pre>
1152     cat: /tmp/file1: Operation not permitted
1153     </pre>
1154    
1155     <p>This time, access request was denied by CaitSith.</p>
1156    
1157 kumaneko 22 <p>Check <code>/var/log/caitsith/denied.log</code> for access denied log of this access request. You will find an entry like below:</p>
1158 kumaneko 17
1159     <pre class="command">
1160     # grep /tmp/file1 /var/log/caitsith/denied.log
1161     </pre>
1162     <pre>
1163     #2012/04/08 04:59:53# global-pid=3682 result=denied priority=100 / read path="/tmp/file1" task.pid=3682 task.ppid=3653 task.uid=0 task.gid=0 task.euid=0 task.egid=0 task.suid=0 task.sgid=0 task.fsuid=0 task.fsgid=0 task.type!=execute_handler task.exe="/bin/cat" task.domain="/usr/sbin/sshd" path.uid=0 path.gid=0 path.ino=2113451 path.major=8 path.minor=1 path.perm=0644 path.type=file path.fsmagic=0xEF53 path.parent.uid=0 path.parent.gid=0 path.parent.ino=2097153 path.parent.major=8 path.parent.minor=1 path.parent.perm=01777 path.parent.type=directory path.parent.fsmagic=0xEF53
1164     </pre>
1165    
1166 kumaneko 19 <p>Note the <strong>result=denied</strong> part of the entry. This indicates that access request was checked and matched "deny" rule.</p>
1167 kumaneko 17
1168 kumaneko 100 <p>If <code>/usr/sbin/caitsith-notifyd</code> is running, you will receive a notification mail. The content is same with access denied logs.</p>
1169 kumaneko 17
1170     <pre class="command">
1171     # mail
1172     </pre>
1173     <pre>
1174     Heirloom Mail version 12.4 7/29/08. Type ? for help.
1175     "/var/spool/mail/root": 1 message 1 new
1176     &gt;N 1 root Sun Apr 8 13:59 20/1231 "Notification from caitsith-notifyd"
1177     &amp;
1178     Message 1:
1179     From root@ccsecurity.localdomain Sun Apr 8 13:59:53 2012
1180     Return-Path: &lt;root@ccsecurity.localdomain&gt;
1181     X-Original-To: root@localhost
1182     Delivered-To: root@localhost.localdomain
1183     Date: Sun, 08 Apr 2012 13:59:53 +0900
1184     To: root@localhost.localdomain
1185     Subject: Notification from caitsith-notifyd
1186     User-Agent: Heirloom mailx 12.4 7/29/08
1187     Content-Type: text/plain; charset=us-ascii
1188     From: root@caitsith.localdomain (root)
1189     Status: R
1190    
1191     Q0-0
1192     #2012/04/08 04:59:53# global-pid=3682 result=denied priority=100 / read path="/tmp/file1" task.pid=3682 task.ppid=3653 task.uid=0 task.gid=0 task.euid=0 task.egid=0 task.suid=0 task.sgid=0 task.fsuid=0 task.fsgid=0 task.type!=execute_handler task.exe="/bin/cat" task.domain="/usr/sbin/sshd" path.uid=0 path.gid=0 path.ino=2113451 path.major=8 path.minor=1 path.perm=0644 path.type=file path.fsmagic=0xEF53 path.parent.uid=0 path.parent.gid=0 path.parent.ino=2097153 path.parent.major=8 path.parent.minor=1 path.parent.perm=01777 path.parent.type=directory path.parent.fsmagic=0xEF53
1193     </pre>
1194    
1195     <p>Now, let's remove a rule to explicitly deny this request.</p>
1196    
1197     <pre>
1198     100 acl read path="/tmp/file1"
1199     delete 1000 deny
1200     </pre>
1201    
1202 kumaneko 22 <p>Append above rule using <code>/usr/sbin/caitsith-loadpolicy</code>:</p>
1203 kumaneko 17
1204     <pre class="command">
1205     # /usr/sbin/caitsith-loadpolicy
1206     </pre>
1207     <pre>
1208     100 acl read path="/tmp/file1"
1209     delete 1000 deny
1210     ^D
1211     </pre>
1212    
1213     <p>You will find</p>
1214    
1215     <pre>
1216     100 acl read path="/tmp/file1"
1217     audit 1
1218     </pre>
1219    
1220     <p>rather than</p>
1221    
1222     <pre>
1223     100 acl read path="/tmp/file1"
1224     audit 1
1225     1000 deny
1226     delete 1000 deny
1227     </pre>
1228    
1229 kumaneko 22 <p>when you read <code>/proc/caitsith/policy</code>.</p>
1230 kumaneko 17
1231     <h4><a name="3.3.4">3.3.4. Filtering audit logs</a></h4>
1232    
1233 kumaneko 22 <p>Now, open <code>/tmp/file1</code> for reading.</p>
1234 kumaneko 17
1235     <pre class="command">
1236     # cat /tmp/file1
1237     </pre>
1238    
1239 kumaneko 22 <p>Check <code>/var/log/caitsith/unmatched.log</code> for access unmatched log of this access request. You will find entries like below:</p>
1240 kumaneko 17
1241     <pre class="command">
1242     # grep /tmp/file1 /var/log/caitsith/unmatched.log
1243     </pre>
1244     <pre>
1245     #2012/04/08 04:58:40# global-pid=3678 result=unmatched priority=100 / read path="/tmp/file1" task.pid=3678 task.ppid=3653 task.uid=0 task.gid=0 task.euid=0 task.egid=0 task.suid=0 task.sgid=0 task.fsuid=0 task.fsgid=0 task.type!=execute_handler task.exe="/bin/cat" task.domain="/usr/sbin/sshd" path.uid=0 path.gid=0 path.ino=2113451 path.major=8 path.minor=1 path.perm=0644 path.type=file path.fsmagic=0xEF53 path.parent.uid=0 path.parent.gid=0 path.parent.ino=2097153 path.parent.major=8 path.parent.minor=1 path.parent.perm=01777 path.parent.type=directory path.parent.fsmagic=0xEF53
1246     #2012/04/08 05:01:00# global-pid=3695 result=unmatched priority=100 / read path="/tmp/file1" task.pid=3695 task.ppid=3653 task.uid=0 task.gid=0 task.euid=0 task.egid=0 task.suid=0 task.sgid=0 task.fsuid=0 task.fsgid=0 task.type!=execute_handler task.exe="/bin/cat" task.domain="/usr/sbin/sshd" path.uid=0 path.gid=0 path.ino=2113451 path.major=8 path.minor=1 path.perm=0644 path.type=file path.fsmagic=0xEF53 path.parent.uid=0 path.parent.gid=0 path.parent.ino=2097153 path.parent.major=8 path.parent.minor=1 path.parent.perm=01777 path.parent.type=directory path.parent.fsmagic=0xEF53
1247     </pre>
1248    
1249     <p>The former entry was generated before adding explicit "deny" rule. The latter entry was generated after removing explicit "deny" rule. You might want to filter the output using tail command:</p>
1250    
1251     <pre class="command">
1252     # grep /tmp/file1 /var/log/caitsith/unmatched.log | tail -n 1
1253     </pre>
1254     <pre>
1255     #2012/04/08 05:01:00# global-pid=3695 result=unmatched priority=100 / read path="/tmp/file1" task.pid=3695 task.ppid=3653 task.uid=0 task.gid=0 task.euid=0 task.egid=0 task.suid=0 task.sgid=0 task.fsuid=0 task.fsgid=0 task.type!=execute_handler task.exe="/bin/cat" task.domain="/usr/sbin/sshd" path.uid=0 path.gid=0 path.ino=2113451 path.major=8 path.minor=1 path.perm=0644 path.type=file path.fsmagic=0xEF53 path.parent.uid=0 path.parent.gid=0 path.parent.ino=2097153 path.parent.major=8 path.parent.minor=1 path.parent.perm=01777 path.parent.type=directory path.parent.fsmagic=0xEF53
1256     </pre>
1257    
1258     <h4><a name="3.3.5">3.3.5. Access requests which will be explicitly allowed by CaitSith</a></h4>
1259    
1260     <p>Next, let's see audit logs with explicitly matching "allow" rules.</p>
1261    
1262     <p>By default CaitSith does not generate audit logs with explicitly matching "allow" rules. Change policy configuration to generate such logs.</p>
1263    
1264     <pre>
1265     quota audit[1] allowed=1024
1266     </pre>
1267    
1268 kumaneko 22 <p>Append above rule using <code>/usr/sbin/caitsith-loadpolicy</code>:</p>
1269 kumaneko 17
1270     <pre class="command">
1271     # echo 'quota audit[1] allowed=1024' | /usr/sbin/caitsith-loadpolicy
1272     </pre>
1273    
1274     <p>Preferences that have same name (in this rule, audit[1]) are automatically merged. Therefore, you will find</p>
1275    
1276     <pre>
1277     quota audit[1] allowed=1024 denied=1024 unmatched=1024
1278     </pre>
1279    
1280     <p>rather than</p>
1281    
1282     <pre>
1283     quota audit[1] allowed=0 denied=1024 unmatched=1024
1284     quota audit[1] allowed=1024
1285     </pre>
1286    
1287 kumaneko 22 <p>when you read <code>/proc/caitsith/policy</code>.</p>
1288 kumaneko 17
1289     <pre>
1290     100 acl read path="/tmp/file1"
1291     1000 allow
1292     </pre>
1293    
1294 kumaneko 22 <p>Append above rule using <code>/usr/sbin/caitsith-loadpolicy</code>:</p>
1295 kumaneko 17
1296     <pre class="command">
1297     # /usr/sbin/caitsith-loadpolicy
1298     </pre>
1299     <pre>
1300     100 acl read path="/tmp/file1"
1301     1000 allow
1302     ^D
1303     </pre>
1304    
1305 kumaneko 22 <p>Since audit logs with explicitly matching "allow" rules tend to grow rapidly, by default <code>/usr/sbin/caitsith-auditd</code> discards such logs by writing to <code>/dev/null</code> (specified in <code>/etc/caitsith/tools/auditd.conf</code>).
1306     Therefore, temporarily stop <code>/usr/sbin/caitsith-auditd</code> process in order to read audit logs from <code>/proc/caitsith/audit</code> interface.</p>
1307 kumaneko 17
1308     <pre class="command">
1309     # killall -KILL caitsith-auditd
1310     </pre>
1311    
1312 kumaneko 22 <p>Then, open <code>/tmp/file1</code> for reading.</p>
1313 kumaneko 17
1314     <pre class="command">
1315     # cat /tmp/file1
1316     </pre>
1317    
1318 kumaneko 22 <p>Check <code>/proc/caitsith/audit</code> for audit log of this access request. This time, you will find an entry like below:</p>
1319 kumaneko 17
1320     <pre class="command">
1321     # cat -v /proc/caitsith/audit
1322     </pre>
1323     <pre>
1324     #2012/04/08 05:03:03# global-pid=3720 result=allowed priority=100 / read path="/tmp/file1" task.pid=3720 task.ppid=3653 task.uid=0 task.gid=0 task.euid=0 task.egid=0 task.suid=0 task.sgid=0 task.fsuid=0 task.fsgid=0 task.type!=execute_handler task.exe="/bin/cat" task.domain="/usr/sbin/sshd" path.uid=0 path.gid=0 path.ino=2113451 path.major=8 path.minor=1 path.perm=0644 path.type=file path.fsmagic=0xEF53 path.parent.uid=0 path.parent.gid=0 path.parent.ino=2097153 path.parent.major=8 path.parent.minor=1 path.parent.perm=01777 path.parent.type=directory path.parent.fsmagic=0xEF53
1325     ^@
1326     </pre>
1327    
1328 kumaneko 19 <p>Note the <strong>result=allowed</strong> part of the entry. This indicates that access request was checked and matched "allow" rule.</p>
1329 kumaneko 17
1330 kumaneko 22 <p>Restart <code>/usr/sbin/caitsith-auditd</code> process.</p>
1331 kumaneko 17
1332     <pre class="command">
1333     # /usr/sbin/caitsith-auditd
1334     </pre>
1335    
1336     <p>Also, restore the audit logs configuration:</p>
1337    
1338     <pre>
1339     quota audit[1] allowed=0
1340     </pre>
1341    
1342 kumaneko 22 <p>Append above rule using <code>/usr/sbin/caitsith-loadpolicy</code>:</p>
1343 kumaneko 17
1344     <pre class="command">
1345     # echo 'quota audit[1] allowed=0' | /usr/sbin/caitsith-loadpolicy
1346     </pre>
1347    
1348 kumaneko 30 <hr>
1349 kumaneko 20 <h3><a name="3.4">3.4. Understanding two viewpoints</a></h3>
1350 kumaneko 18
1351 kumaneko 20 <p>CaitSith supports writing access restriction rules from two viewpoints. One is from the point of view of "subject" (a resource which requests access on object). The other is from the point of view of "object" (a resource which subject requests access).</p>
1352    
1353     <p>The advantage of the former approach is that the rules clearly explains and restricts what each subject is allowed to access which object.
1354     This approach is powerful when you can afford identifying all possible subjects and defining the rules for each subject.
1355     But the disadvantage is that it is difficult to identify all possible subjects and define the rules for each subject.
1356     Therefore, in reality, this approach tends to restrict only specific subjects.
1357     If one of subjects which is not restricted by this approach is cracked or misbehaved, nothing can protect objects you want to protect.</p>
1358    
1359     <p>The advantage of the latter approach is that the rules clearly explains and restricts what object might be accessed by which subject.
1360     This approach is powerful when you can afford identifying objects you want to protect and defining rules for each object.
1361 kumaneko 60 This approach can compensate for the disadvantage of the former approach because this approach can restrict access even when it is difficult to
1362 kumaneko 20 identify all possible subjects and define the rules for each possible subjects.</p>
1363    
1364     <h4><a name="3.4.1">3.4.1. Writing access restriction rules from the point of view of "subject".</a></h4>
1365    
1366 kumaneko 22 <p>Below entry is an example of restricting programs which can be executed from <code>/usr/sbin/httpd</code> program.</p>
1367 kumaneko 20
1368     <pre>
1369     0 acl execute task.exe="/usr/sbin/httpd"
1370     audit 1
1371     1 allow path="/var/www/cgi-bin/counter.cgi"
1372     100 deny
1373     </pre>
1374    
1375 kumaneko 22 <p>The <strong>0 acl execute task.exe="<code>/usr/sbin/httpd</code>"</strong> line means check rules for executing programs from <code>/usr/sbin/httpd</code> program. Since <strong>task.exe="<code>/usr/sbin/httpd</code>"</strong> is specified in this line, this line tells CaitSith <strong>check rules for executing programs only if current thread's program name is <code>/usr/sbin/httpd</code></strong>.</p>
1376 kumaneko 20
1377 kumaneko 22 <p>The line <strong>1 allow path="<code>/var/www/cgi-bin/counter.cgi</code>"</strong> means that allow if the pathname of the program to execute is <code>/var/www/cgi-bin/counter.cgi</code>. This line tells CaitSith "allow execution of <code>/var/www/cgi-bin/counter.cgi</code>".</p>
1378 kumaneko 20
1379     <p>The line <strong>100 deny</strong> means deny unconditionally. This tells CaitSith "unconditionally deny execution of programs".</p>
1380    
1381 kumaneko 22 <p>Since the line starting with <strong>1 allow</strong> has higher priority than the line starting with <strong>100 deny</strong>, CaitSith will allow execution of <code>/var/www/cgi-bin/counter.cgi</code>.</p>
1382 kumaneko 20
1383 kumaneko 22 <p>To summarize this rule, <code>/usr/sbin/httpd</code> can execute <strong>only</strong> <code>/var/www/cgi-bin/counter.cgi</code>.</p>
1384 kumaneko 20
1385 kumaneko 22 <p>The line <strong>audit 1</strong> means that use audit rules defined in the <strong>quota audit[1]</strong> line. This line tells CaitSith generate audit logs up to entries defined in the <strong>quota audit[1]</strong> line. The default configuration generated by executing <code>/usr/lib/caitsith/init_policy</code> command is</p>
1386 kumaneko 20
1387     <pre>
1388     quota audit[1] allowed=0 denied=1024 unmatched=1024
1389     </pre>
1390    
1391 kumaneko 22 <p>which means do not generate audit logs if matched an "allow" line and generate audit logs up to 1024 entries if matched a "deny" line and generate audit logs up to 1024 lines if matched neither an "allow" line nor a "deny" line. Though, since the block starting with <strong>0 acl execute task.exe="<code>/usr/sbin/httpd</code>"</strong> is terminated with explicit <strong>100 deny</strong> line, this block shall match either an "allow" line or a "deny" line.</p>
1392 kumaneko 20
1393     <h4><a name="3.4.2">3.4.2. Writing access restriction rules from the point of view of "object".</a></h4>
1394    
1395 kumaneko 22 <p>Below entry is default configuration generated by executing <code>/usr/lib/caitsith/init_policy</code> command.</p>
1396 kumaneko 20
1397     <pre>
1398     0 acl modify_policy
1399     audit 1
1400     1 deny task.uid!=0
1401     1 deny task.euid!=0
1402     100 allow task.exe="/usr/sbin/caitsith-loadpolicy"
1403     100 allow task.exe="/usr/sbin/caitsith-queryd"
1404     10000 deny
1405     </pre>
1406    
1407 kumaneko 22 <p>The <strong>0 acl modify_policy</strong> line means check rules for modifying policy configuration via <code>/proc/caitsith/policy</code> interface. Since no additional conditions are specified in this line, this line tells CaitSith <strong>unconditionally check</strong> rules for modifying policy configuration via <code>/proc/caitsith/policy</code> interface.</p>
1408 kumaneko 20
1409 kumaneko 22 <p>The line <strong>1 deny task.uid!=0</strong> means that deny if current thread's user ID is not 0. This line tells CaitSith "deny modification of policy configuration via <code>/proc/caitsith/policy</code> interface if current thread's user ID is not 0".</p>
1410 kumaneko 20
1411 kumaneko 22 <p>The line <strong>1 deny task.euid!=0</strong> means that deny if current thread's effective user ID is not 0. This line tells CaitSith "deny modification of policy configuration via <code>/proc/caitsith/policy</code> interface if current thread's effective user ID is not 0".</p>
1412 kumaneko 20
1413     <p>Note the difference between</p>
1414    
1415     <pre>
1416     1 deny task.uid!=0
1417     1 deny task.euid!=0
1418     </pre>
1419    
1420     <p>and</p>
1421    
1422     <pre>
1423     1 deny task.uid!=0 task.euid!=0
1424     </pre>
1425    
1426     <p>. The former conditions tell CaitSith "deny if current thread's user ID is not 0 <strong>or</strong> current thread's effective user ID is not 0", while the latter conditions tell CaitSith "deny if current thread's user ID is not 0 <strong>and</strong> current thread's effective user ID is not 0".</p>
1427    
1428 kumaneko 22 <p>The line <strong>100 allow task.exe="<code>/usr/sbin/caitsith-loadpolicy</code>"</strong> means that allow if current thread's program name is <code>/usr/sbin/caitsith-loadpolicy</code>. This tells CaitSith finish evaluation of this block starting with the <strong>0 acl modify_policy</strong> line if current thread's program name is <code>/usr/sbin/caitsith-loadpolicy</code>. If there are more blocks, CaitSith will evaluate them. If there are no more blocks, CaitSith will allow modifying policy configuration via <code>/proc/caitsith/policy</code> interface.</p>
1429 kumaneko 20
1430 kumaneko 22 <p>The line <strong>100 allow task.exe="<code>/usr/sbin/caitsith-queryd</code>"</strong> means that allow if current thread's program name is <code>/usr/sbin/caitsith-queryd</code>. This tells CaitSith finish evaluation of this block starting with the <strong>0 acl modify_policy</strong> line if current thread's program name is <code>/usr/sbin/caitsith-queryd</code>. The usage of <code>/usr/sbin/caitsith-queryd</code> will be explained later.</p>
1431 kumaneko 20
1432 kumaneko 22 <p>The line <strong>10000 deny</strong> means deny unconditionally. This tells CaitSith "unconditionally deny modification of policy configuration via <code>/proc/caitsith/policy</code> interface".</p>
1433 kumaneko 20
1434 kumaneko 22 <p>Since lines starting with <strong>1 deny</strong> have higher priority than lines starting with <strong>100 allow</strong>, CaitSith will deny modifying policy configuration via <code>/proc/caitsith/policy</code> interface if current thread's user ID is not 0 or current thread's effective user ID is not 0. In other words, only root user (where current thread's user ID and effective user ID are both 0) can modify policy configuration via <code>/proc/caitsith/policy</code> interface.</p>
1435 kumaneko 20
1436 kumaneko 22 <p>Since lines starting with <strong>100 allow</strong> have higher priority than a line starting with <strong>10000 deny</strong>, CaitSith will allow modifying policy configuration via <code>/proc/caitsith/policy</code> interface if current thread's program name is <code>/usr/sbin/caitsith-loadpolicy</code> or current thread's program name is <code>/usr/sbin/caitsith-queryd</code>. In other words, other programs such as <code>/bin/sh</code>, <code>/bin/echo</code>, <code>/bin/cat</code> are not allowed to modify policy configuration via <code>/proc/caitsith/policy</code> interface.</p>
1437 kumaneko 20
1438 kumaneko 22 <p>To summarize this rule, only <code>/usr/sbin/caitsith-loadpolicy</code> or <code>/usr/sbin/caitsith-queryd</code> command running as root user can modify policy configuration via <code>/proc/caitsith/policy</code> interface.</p>
1439 kumaneko 20
1440     <p>Note the difference between</p>
1441    
1442     <pre>
1443     0 acl execute task.exe="/usr/sbin/httpd"
1444     audit 1
1445     1 allow path="/var/www/cgi-bin/counter.cgi"
1446     100 deny
1447     </pre>
1448    
1449     <p>and</p>
1450    
1451     <pre>
1452     0 acl execute path="/var/www/cgi-bin/counter.cgi"
1453     audit 1
1454     1 allow task.exe="/usr/sbin/httpd"
1455     100 deny
1456     </pre>
1457    
1458 kumaneko 22 <p>. The former means "<code>/usr/sbin/httpd</code> can execute <strong>only</strong> <code>/var/www/cgi-bin/counter.cgi</code>", while the latter means "<strong>only</strong> <code>/usr/sbin/httpd</code> can execute <code>/var/www/cgi-bin/counter.cgi</code>".</p>
1459 kumaneko 20
1460     <p>CaitSith supports restricting other arguments such as command line arguments and environment variables. Syntax for restricting other arguments will be explained later.</p>
1461    
1462     <h4><a name="3.4.3">3.4.3. Writing access restriction rules from the point of view of both "subject" and "object".</a></h4>
1463    
1464     <p>It is possible to write access restriction rules like</p>
1465    
1466     <pre>
1467     0 acl execute task.exe="/usr/sbin/httpd" path="/var/www/cgi-bin/counter.cgi"
1468     audit 1
1469     1 allow task.uid!=0
1470     100 deny
1471     </pre>
1472    
1473     <p>and</p>
1474    
1475     <pre>
1476     0 acl execute task.uid!=0
1477     audit 1
1478     1 allow task.exe="/usr/sbin/httpd" path="/var/www/cgi-bin/counter.cgi"
1479     100 deny
1480     </pre>
1481    
1482 kumaneko 22 <p>. The former means "<code>/usr/sbin/httpd</code> is allowed to execute <code>/var/www/cgi-bin/counter.cgi</code> only if current thread's user ID is not 0", while the latter means "only execution of <code>/var/www/cgi-bin/counter.cgi</code> from <code>/usr/sbin/httpd</code> is allowed if current thread's user ID is not 0".</p>
1483 kumaneko 20
1484     <p>Also, it is possible to write access restriction rules like</p>
1485    
1486     <pre>
1487     0 acl execute
1488     audit 1
1489     1 allow task.exe="/usr/sbin/httpd" path="/var/www/cgi-bin/counter.cgi"
1490     100 deny
1491     </pre>
1492    
1493 kumaneko 22 <p>which means "any execute requests other than execution of <code>/var/www/cgi-bin/counter.cgi</code> from <code>/usr/sbin/httpd</code> are denied" (DO NOT TRY THIS EXAMPLE, or you will no longer be able to run any commands).</p>
1494 kumaneko 20
1495 kumaneko 30 <hr>
1496 kumaneko 112 <h3><a name="3.5">3.5. Steps for writing access restriction rules</a></h3>
1497    
1498     <p>An example of steps for writing access restriction rules using pathnames is shown here.</p>
1499    
1500     <p>Step 1: Determine resource to restrict access.</p>
1501    
1502     <p>Below example restricts opening <code>/etc/shadow</code> for reading.</p>
1503    
1504     <pre>
1505     100 acl read path="/etc/shadow"
1506     audit 1
1507     </pre>
1508    
1509     <p>Step 2: Gather logs of accessing resources.</p>
1510    
1511     <p>As you operate the system with above example, access unmatched logs are generated and spooled in <code>/proc/caitsith/audit</code> interface when access request of opening <code>/etc/shadow</code> for reading happens. If <code>/usr/sbin/caitsith-auditd</code> is running, access unmatched logs will be moved to <code>/var/log/caitsith/unmatched.log</code>.</p>
1512    
1513     <pre>
1514     #2012/03/02 08:11:51# global-pid=2826 result=unmatched priority=100 / read path="/etc/shadow" task.pid=2826 task.ppid=2814 task.uid=0 task.gid=0 task.euid=0 task.egid=0 task.suid=0 task.sgid=0 task.fsuid=0 task.fsgid=0 task.type!=execute_handler task.exe="/usr/bin/passwd" task.domain="/usr/sbin/sshd" path.uid=0 path.gid=42 path.ino=33708 path.major=8 path.minor=1 path.perm=0640 path.type=file path.fsmagic=0xEF53 path.parent.uid=0 path.parent.gid=0 path.parent.ino=32769 path.parent.major=8 path.parent.minor=1 path.parent.perm=0755 path.parent.type=directory path.parent.fsmagic=0xEF53
1515     </pre>
1516    
1517     <p>Step 3: Decide whether to grant or reject.</p>
1518    
1519     <p>Examine the log and decide whether to grant this access request or not. To grant this request, add an allow line. Below example grants this request to <code>/usr/bin/passwd</code> program.</p>
1520    
1521     <pre>
1522     100 acl read path="/etc/shadow"
1523     audit 1
1524     100 allow task.exe="/usr/bin/passwd"
1525     </pre>
1526    
1527     <p>Step 4: Gather again logs of accessing resources.</p>
1528    
1529     <p>Operate the system again. For example, <code>/usr/sbin/sshd</code> program and <code>/bin/cat</code> program have requested opening <code>/etc/shadow</code> for reading.</p>
1530    
1531     <pre>
1532     #2012/03/02 08:13:06# global-pid=2831 result=unmatched priority=100 / read path="/etc/shadow" task.pid=2831 task.ppid=2691 task.uid=0 task.gid=0 task.euid=0 task.egid=0 task.suid=0 task.sgid=0 task.fsuid=0 task.fsgid=0 task.type!=execute_handler task.exe="/usr/sbin/sshd" task.domain="/usr/sbin/sshd" path.uid=0 path.gid=42 path.ino=33716 path.major=8 path.minor=1 path.perm=0640 path.type=file path.fsmagic=0xEF53 path.parent.uid=0 path.parent.gid=0 path.parent.ino=32769 path.parent.major=8 path.parent.minor=1 path.parent.perm=0755 path.parent.type=directory path.parent.fsmagic=0xEF53
1533     #2012/03/02 08:13:12# global-pid=2837 result=unmatched priority=100 / read path="/etc/shadow" task.pid=2837 task.ppid=2833 task.uid=0 task.gid=0 task.euid=0 task.egid=0 task.suid=0 task.sgid=0 task.fsuid=0 task.fsgid=0 task.type!=execute_handler task.exe="/bin/cat" task.domain="/usr/sbin/sshd" path.uid=0 path.gid=42 path.ino=33716 path.major=8 path.minor=1 path.perm=0640 path.type=file path.fsmagic=0xEF53 path.parent.uid=0 path.parent.gid=0 path.parent.ino=32769 path.parent.major=8 path.parent.minor=1 path.parent.perm=0755 path.parent.type=directory path.parent.fsmagic=0xEF53
1534     </pre>
1535    
1536     <p>Step 5: Decide again whether to grant or reject.</p>
1537    
1538     <p>Add an allow line with <code>/usr/sbin/sshd</code> program in order to allow access by <code>/usr/sbin/sshd</code> program. Also, add a deny line with <code>/bin/cat</code> program in order to deny access by <code>/bin/cat</code> program. Give higher priority (i.e. smaller $cond_priority value) to deny line than allow line so that deny lines are checked before allow lines are checked.</p>
1539    
1540     <pre>
1541     100 acl read path="/etc/shadow"
1542     audit 1
1543     10 deny task.exe="/bin/cat"
1544     100 allow task.exe="/usr/bin/passwd"
1545     100 allow task.exe="/usr/sbin/sshd"
1546     </pre>
1547    
1548     <p>From now on, attempt to read <code>/etc/shadow</code> using <code>/bin/cat</code> should be denied and access denied logs should be generated. If <code>/usr/sbin/caitsith-auditd</code> is running, access denied logs will be moved to <code>/var/log/caitsith/denied.log</code>.</p>
1549    
1550     <pre>
1551     #2012/03/02 08:14:38# global-pid=2842 result=denied priority=100 / read path="/etc/shadow" task.pid=2842 task.ppid=2833 task.uid=0 task.gid=0 task.euid=0 task.egid=0 task.suid=0 task.sgid=0 task.fsuid=0 task.fsgid=0 task.type!=execute_handler task.exe="/bin/cat" task.domain="/usr/sbin/sshd" path.uid=0 path.gid=42 path.ino=33716 path.major=8 path.minor=1 path.perm=0640 path.type=file path.fsmagic=0xEF53 path.parent.uid=0 path.parent.gid=0 path.parent.ino=32769 path.parent.major=8 path.parent.minor=1 path.parent.perm=0755 path.parent.type=directory path.parent.fsmagic=0xEF53
1552     </pre>
1553    
1554     <p>Step 6: Finish up a rule.</p>
1555    
1556     <p>After you have finished enumerating all allow lines and deny lines, add a deny line with lowest priority (i.e. largest $cond_priority value within this block).</p>
1557    
1558     <pre>
1559     100 acl read path="/etc/shadow"
1560     audit 1
1561     10 deny task.exe="/bin/cat"
1562     100 allow task.exe="/usr/bin/passwd"
1563     100 allow task.exe="/usr/sbin/sshd"
1564     10000 deny
1565     </pre>
1566    
1567     <p>A rule for restricting <code>/etc/shadow</code> for opening is now completed. Please do not copy and paste this example, for there must be other programs which need to open <code>/etc/shadow</code> for reading.</p>
1568    
1569     <hr>
1570     <h3><a name="3.6">3.6. Restricting access in various ways</a></h3>
1571    
1572     <p>The rule demonstrated in <a href="#3.5">3.5. Steps for writing access restriction rules</a> alone cannot prevent diverted accesses such as creating a hard link of <code>/etc/shadow</code>. CaitSith supports various variables for writing access restriction rules. If the resource to protect has characteristic attribute, it is recommended to utilize such attributes. (The full list of available variables/attributes will be explained in <a href="#condition_list">4. List of conditions</a>.)</p>
1573    
1574     <p>On several distributions, <code>/etc/shadow</code> is owned by shadow group. In that case, this rule can be modified to below. (Below example assumes that shadow group's group ID is 42.)</p>
1575    
1576     <pre>
1577     100 acl read path.gid=42
1578     audit 1
1579     10 deny task.exe="/bin/cat"
1580     100 allow task.exe="/usr/bin/passwd"
1581     100 allow task.exe="/usr/sbin/sshd"
1582     10000 deny
1583     </pre>
1584    
1585     <p>On several distributions, <code>/etc/shadow</code> is owned by root user and root group and has DAC permissions 0400. In that case, you might want to use a rule like below. (You should check whether there are other files with such attributes.)</p>
1586    
1587     <pre>
1588     100 acl read path.uid=0 path.gid=0 path.perm=0400
1589     audit 1
1590     10 deny task.exe="/bin/cat"
1591     100 allow task.exe="/usr/bin/passwd"
1592     100 allow task.exe="/usr/sbin/sshd"
1593     10000 deny
1594     </pre>
1595    
1596     <p>It is recommended to restrict other operations such as mount, link and rename. For example, a rule to deny creation of hard links which is not owned by the user would look like below. (Note that the variable which refers source pathname of link operation is "old_path" rather than "path" because the operation is "link".)</p>
1597    
1598     <pre>
1599     100 acl link old_path.uid!=task.uid
1600     audit 1
1601     100 deny
1602     </pre>
1603    
1604     <p>If you can split files into different filesystems or different partitions, you might be able to utilize more variables. For example, rules for denying creation of hard links on tmpfs filesystem (tmpfs filesystem's magic number is 0x01021994) would look like below.</p>
1605    
1606     <pre>
1607     100 acl link old_path.fsmagic=0x01021994
1608     audit 1
1609     10 deny
1610     </pre>
1611    
1612     <p>Splitting into different partitions and defining rules based on partition's attributes will help preventing diverted access via creating hard links, for hard links cannot be created across partitions. Separating <code>/home</code> partition from <code>/</code> partition will be useful when protecting resources in <code>/home</code> partition.</p>
1613    
1614     <hr>
1615 kumaneko 29 <h2><a name="condition_list">4. List of conditions</a></h2>
1616 kumaneko 20
1617 kumaneko 30 <hr>
1618 kumaneko 29 <h3><a name="4.1">4.1. Using string arguments in conditions</a></h3>
1619    
1620 kumaneko 18 <p>Arguments such as file's pathnames and command line arguments and environment variables are handled as string argument.</p>
1621    
1622 kumaneko 30 <h4><a name="4.1.1">4.1.1. About string argument representation rule</a></h4>
1623 kumaneko 18
1624     <p>All ASCII printable characters other than \ character (i.e. from 33 to 91 and from 93 to 126) are represented as is.</p>
1625    
1626     <p>All other characters (i.e. from 0 to 32, 92 and from 127 to 255) are represented using \ooo style octal form.</p>
1627    
1628     <table border="1">
1629     <tr>
1630     <td>
1631     <table><tr><td></td><td>Lower 4 bits</td></tr><tr><td>Upper 4 bits</td><td></td></tr></table>
1632     </td>
1633     <th><p>0x0</p></th>
1634     <th><p>0x1</p></th>
1635     <th><p>0x2</p></th>
1636     <th><p>0x3</p></th>
1637     <th><p>0x4</p></th>
1638     <th><p>0x5</p></th>
1639     <th><p>0x6</p></th>
1640     <th><p>0x7</p></th>
1641     <th><p>0x8</p></th>
1642     <th><p>0x9</p></th>
1643     <th><p>0xA</p></th>
1644     <th><p>0xB</p></th>
1645     <th><p>0xC</p></th>
1646     <th><p>0xD</p></th>
1647     <th><p>0xE</p></th>
1648     <th><p>0xF</p></th>
1649     </tr>
1650     <tr>
1651     <th><p>0x0</p></th>
1652     <td><p>\000</p></td>
1653     <td><p>\001</p></td>
1654     <td><p>\002</p></td>
1655     <td><p>\003</p></td>
1656     <td><p>\004</p></td>
1657     <td><p>\005</p></td>
1658     <td><p>\006</p></td>
1659     <td><p>\007</p></td>
1660     <td><p>\010</p></td>
1661     <td><p>\011</p></td>
1662     <td><p>\012</p></td>
1663     <td><p>\013</p></td>
1664     <td><p>\014</p></td>
1665     <td><p>\015</p></td>
1666     <td><p>\016</p></td>
1667     <td><p>\017</p></td>
1668     </tr>
1669     <tr>
1670     <th><p>0x1</p></th>
1671     <td><p>\020</p></td>
1672     <td><p>\021</p></td>
1673     <td><p>\022</p></td>
1674     <td><p>\023</p></td>
1675     <td><p>\024</p></td>
1676     <td><p>\025</p></td>
1677     <td><p>\026</p></td>
1678     <td><p>\027</p></td>
1679     <td><p>\030</p></td>
1680     <td><p>\031</p></td>
1681     <td><p>\032</p></td>
1682     <td><p>\033</p></td>
1683     <td><p>\034</p></td>
1684     <td><p>\035</p></td>
1685     <td><p>\036</p></td>
1686     <td><p>\037</p></td>
1687     </tr>
1688     <tr>
1689     <th><p>0x2</p></th>
1690     <td><p>\040</p></td>
1691     <td><p>!</p></td>
1692     <td><p>"</p></td>
1693     <td><p>#</p></td>
1694     <td><p>$</p></td>
1695     <td><p>%</p></td>
1696     <td><p>&amp;</p></td>
1697     <td><p>'</p></td>
1698     <td><p>(</p></td>
1699     <td><p>)</p></td>
1700     <td><p>*</p></td>
1701     <td><p>+</p></td>
1702     <td><p>,</p></td>
1703     <td><p>-</p></td>
1704     <td><p>.</p></td>
1705     <td><p>/</p></td>
1706     </tr>
1707     <tr>
1708     <th><p>0x3</p></th>
1709     <td><p>0</p></td>
1710     <td><p>1</p></td>
1711     <td><p>2</p></td>
1712     <td><p>3</p></td>
1713     <td><p>4</p></td>
1714     <td><p>5</p></td>
1715     <td><p>6</p></td>
1716     <td><p>7</p></td>
1717     <td><p>8</p></td>
1718     <td><p>9</p></td>
1719     <td><p>:</p></td>
1720     <td><p>;</p></td>
1721     <td><p>&lt;</p></td>
1722     <td><p>=</p></td>
1723     <td><p>&gt;</p></td>
1724     <td><p>?</p></td>
1725     </tr>
1726     <tr>
1727     <th><p>0x4</p></th>
1728     <td><p>@</p></td>
1729     <td><p>A</p></td>
1730     <td><p>B</p></td>
1731     <td><p>C</p></td>
1732     <td><p>D</p></td>
1733     <td><p>E</p></td>
1734     <td><p>F</p></td>
1735     <td><p>G</p></td>
1736     <td><p>H</p></td>
1737     <td><p>I</p></td>
1738     <td><p>J</p></td>
1739     <td><p>K</p></td>
1740     <td><p>L</p></td>
1741     <td><p>M</p></td>
1742     <td><p>N</p></td>
1743     <td><p>O</p></td>
1744     </tr>
1745     <tr>
1746     <th><p>0x5</p></th>
1747     <td><p>P</p></td>
1748     <td><p>Q</p></td>
1749     <td><p>R</p></td>
1750     <td><p>S</p></td>
1751     <td><p>T</p></td>
1752     <td><p>U</p></td>
1753     <td><p>V</p></td>
1754     <td><p>W</p></td>
1755     <td><p>X</p></td>
1756     <td><p>Y</p></td>
1757     <td><p>Z</p></td>
1758     <td><p>[</p></td>
1759     <td><p>\134</p></td>
1760     <td><p>]</p></td>
1761     <td><p>^</p></td>
1762     <td><p>_</p></td>
1763     </tr>
1764     <tr>
1765     <th><p>0x6</p></th>
1766     <td><p>`</p></td>
1767     <td><p>a</p></td>
1768     <td><p>b</p></td>
1769     <td><p>c</p></td>
1770     <td><p>d</p></td>
1771     <td><p>e</p></td>
1772     <td><p>f</p></td>
1773     <td><p>g</p></td>
1774     <td><p>h</p></td>
1775     <td><p>i</p></td>
1776     <td><p>j</p></td>
1777     <td><p>k</p></td>
1778     <td><p>l</p></td>
1779     <td><p>m</p></td>
1780     <td><p>n</p></td>
1781     <td><p>o</p></td>
1782     </tr>
1783     <tr>
1784     <th><p>0x7</p></th>
1785     <td><p>p</p></td>
1786     <td><p>q</p></td>
1787     <td><p>r</p></td>
1788     <td><p>s</p></td>
1789     <td><p>t</p></td>
1790     <td><p>u</p></td>
1791     <td><p>v</p></td>
1792     <td><p>w</p></td>
1793     <td><p>x</p></td>
1794     <td><p>y</p></td>
1795     <td><p>z</p></td>
1796     <td><p>{</p></td>
1797     <td><p>|</p></td>
1798     <td><p>}</p></td>
1799     <td><p>~</p></td>
1800     <td><p>\177</p></td>
1801     </tr>
1802     <tr>
1803     <th><p>0x8</p></th>
1804     <td><p>\200</p></td>
1805     <td><p>\201</p></td>
1806     <td><p>\202</p></td>
1807     <td><p>\203</p></td>
1808     <td><p>\204</p></td>
1809     <td><p>\205</p></td>
1810     <td><p>\206</p></td>
1811     <td><p>\207</p></td>
1812     <td><p>\210</p></td>
1813     <td><p>\211</p></td>
1814     <td><p>\212</p></td>
1815     <td><p>\213</p></td>
1816     <td><p>\214</p></td>
1817     <td><p>\215</p></td>
1818     <td><p>\216</p></td>
1819     <td><p>\217</p></td>
1820     </tr>
1821     <tr>
1822     <th><p>0x9</p></th>
1823     <td><p>\220</p></td>
1824     <td><p>\221</p></td>
1825     <td><p>\222</p></td>
1826     <td><p>\223</p></td>
1827     <td><p>\224</p></td>
1828     <td><p>\225</p></td>
1829     <td><p>\226</p></td>
1830     <td><p>\227</p></td>
1831     <td><p>\230</p></td>
1832     <td><p>\231</p></td>
1833     <td><p>\232</p></td>
1834     <td><p>\233</p></td>
1835     <td><p>\234</p></td>
1836     <td><p>\235</p></td>
1837     <td><p>\236</p></td>
1838     <td><p>\237</p></td>
1839     </tr>
1840     <tr>
1841     <th><p>0xA</p></th>
1842     <td><p>\240</p></td>
1843     <td><p>\241</p></td>
1844     <td><p>\242</p></td>
1845     <td><p>\243</p></td>
1846     <td><p>\244</p></td>
1847     <td><p>\245</p></td>
1848     <td><p>\246</p></td>
1849     <td><p>\247</p></td>
1850     <td><p>\250</p></td>
1851     <td><p>\251</p></td>
1852     <td><p>\252</p></td>
1853     <td><p>\253</p></td>
1854     <td><p>\254</p></td>
1855     <td><p>\255</p></td>
1856     <td><p>\256</p></td>
1857     <td><p>\257</p></td>
1858     </tr>
1859     <tr>
1860     <th><p>0xB</p></th>
1861     <td><p>\260</p></td>
1862     <td><p>\261</p></td>
1863     <td><p>\262</p></td>
1864     <td><p>\263</p></td>
1865     <td><p>\264</p></td>
1866     <td><p>\265</p></td>
1867     <td><p>\266</p></td>
1868     <td><p>\267</p></td>
1869     <td><p>\270</p></td>
1870     <td><p>\271</p></td>
1871     <td><p>\272</p></td>
1872     <td><p>\273</p></td>
1873     <td><p>\274</p></td>
1874     <td><p>\275</p></td>
1875     <td><p>\276</p></td>
1876     <td><p>\277</p></td>
1877     </tr>
1878     <tr>
1879     <th><p>0xC</p></th>
1880     <td><p>\300</p></td>
1881     <td><p>\301</p></td>
1882     <td><p>\302</p></td>
1883     <td><p>\303</p></td>
1884     <td><p>\304</p></td>
1885     <td><p>\305</p></td>
1886     <td><p>\306</p></td>
1887     <td><p>\307</p></td>
1888     <td><p>\310</p></td>
1889     <td><p>\311</p></td>
1890     <td><p>\312</p></td>
1891     <td><p>\313</p></td>
1892     <td><p>\314</p></td>
1893     <td><p>\315</p></td>
1894     <td><p>\316</p></td>
1895     <td><p>\317</p></td>
1896     </tr>
1897     <tr>
1898     <th><p>0xD</p></th>
1899     <td><p>\320</p></td>
1900     <td><p>\321</p></td>
1901     <td><p>\322</p></td>
1902     <td><p>\323</p></td>
1903     <td><p>\324</p></td>
1904     <td><p>\325</p></td>
1905     <td><p>\326</p></td>
1906     <td><p>\327</p></td>
1907     <td><p>\330</p></td>
1908     <td><p>\331</p></td>
1909     <td><p>\332</p></td>
1910     <td><p>\333</p></td>
1911     <td><p>\334</p></td>
1912     <td><p>\335</p></td>
1913     <td><p>\336</p></td>
1914     <td><p>\337</p></td>
1915     </tr>
1916     <tr>
1917     <th><p>0xE</p></th>
1918     <td><p>\340</p></td>
1919     <td><p>\341</p></td>
1920     <td><p>\342</p></td>
1921     <td><p>\343</p></td>
1922     <td><p>\344</p></td>
1923     <td><p>\345</p></td>
1924     <td><p>\346</p></td>
1925     <td><p>\347</p></td>
1926     <td><p>\350</p></td>
1927     <td><p>\351</p></td>
1928     <td><p>\352</p></td>
1929     <td><p>\353</p></td>
1930     <td><p>\354</p></td>
1931     <td><p>\355</p></td>
1932     <td><p>\356</p></td>
1933     <td><p>\357</p></td>
1934     </tr>
1935     <tr>
1936     <th><p>0xF</p></th>
1937     <td><p>\360</p></td>
1938     <td><p>\361</p></td>
1939     <td><p>\362</p></td>
1940     <td><p>\363</p></td>
1941     <td><p>\364</p></td>
1942     <td><p>\365</p></td>
1943     <td><p>\366</p></td>
1944     <td><p>\367</p></td>
1945     <td><p>\370</p></td>
1946     <td><p>\371</p></td>
1947     <td><p>\372</p></td>
1948     <td><p>\373</p></td>
1949     <td><p>\374</p></td>
1950     <td><p>\375</p></td>
1951     <td><p>\376</p></td>
1952     <td><p>\377</p></td>
1953     </tr>
1954     </table>
1955    
1956     <p>Some examples are shown below.</p>
1957    
1958     <pre>
1959     /bin/sh
1960     /home/demo/Documents\040and\040Settings
1961     </pre>
1962    
1963 kumaneko 30 <h4><a name="4.1.2">4.1.2. Grouping string arguments using wildcard expressions.</a></h4>
1964 kumaneko 18
1965     <p>It is possible to use wildcards listed below in order to match string patterns.</p>
1966    
1967     <table border="1">
1968     <tr>
1969     <th><p>Wildcard</p></th>
1970     <th><p>Pattern match</p></th>
1971     <th><p>Examples</p></th>
1972     </tr>
1973     <tr>
1974     <td><p>\*</p></td>
1975     <td><p>0 or more repetitions of characters other than "/"</p></td>
1976     <td><p>/var/log/samba/\*</p></td>
1977     </tr>
1978     <tr>
1979     <td><p>\@</p></td>
1980     <td><p>0 or more repetitions of characters other than "/" or "."</p></td>
1981     <td><p>/var/www/html/\@.html</p></td>
1982     </tr>
1983     <tr>
1984     <td><p>\?</p></td>
1985     <td><p>1 byte character other than "/"</p></td>
1986     <td><p>/tmp/mail.\?\?\?\?\?\?</p></td>
1987     </tr>
1988     <tr>
1989     <td><p>\$</p></td>
1990     <td><p>1 or more repetitions of decimal digits</p></td>
1991     <td><p>/proc/\$/cmdline</p></td>
1992     </tr>
1993     <tr>
1994     <td><p>\+</p></td>
1995     <td><p>1 decimal digit</p></td>
1996     <td><p>/var/tmp/my_work.\+</p></td>
1997     </tr>
1998     <tr>
1999     <td><p>\X</p></td>
2000     <td><p>1 or more repetitions of hexadecimal digits</p></td>
2001     <td><p>/var/tmp/my-work.\X</p></td>
2002     </tr>
2003     <tr>
2004     <td><p>\x</p></td>
2005     <td><p>1 hexadecimal digit</p></td>
2006     <td><p>/tmp/my-work.\x</p></td>
2007     </tr>
2008     <tr>
2009     <td><p>\A</p></td>
2010     <td><p>1 or more repetitions of alphabet characters</p></td>
2011     <td><p>/var/log/my-work/\$-\A-\$.log</p></td>
2012     </tr>
2013     <tr>
2014     <td><p>\a</p></td>
2015     <td><p>1 alphabet character</p></td>
2016     <td><p>/home/users/\a/\*/public_html/\*.html</p></td>
2017     </tr>
2018     <tr>
2019     <td><p>\-</p></td>
2020     <td><p>Pathname subtraction operator (negative match)</p></td>
2021     <td>
2022     <p>/\*\-proc\-sys</p>
2023     <p>This will match /\* except "/proc" and "/sys".</p>
2024     </td>
2025     </tr>
2026     <tr>
2027     <td><p>/\{dir\}/</p></td>
2028     <td><p>Recursive directory matching operator.</p>
2029     <p>Matches "/" and 1 or more repetitions of "dir/".</p></td>
2030     <td>
2031     <p>/var/www/html/\{\*\}/\*.html</p>
2032     <p>This will match all *.html files in subdirectories under /var/www/html/ directory. Note that /var/www/html/\*.html will not match.</p>
2033     </td>
2034     </tr>
2035     <tr>
2036     <td><p>/({dir\)/</p></td>
2037     <td><p>Recursive directory matching operator.</p>
2038     <p>Matches "/" and 0 or more repetitions of "dir/".</p></td>
2039     <td>
2040     <p>/var/www/html/\(\*\)/\*.html</p>
2041     <p>This will match all *.html files under /var/www/html/ directory. Note that /var/www/html/\*.html will match.</p>
2042     </td>
2043     </tr>
2044     </table>
2045    
2046 kumaneko 30 <h4><a name="4.1.3">4.1.3. Grouping string arguments using string_group keyword.</a></h4>
2047 kumaneko 18
2048     <p>It is possible to define groups of string arguments using string_group keyword followed by $string_group_name and $string_group_member.</p>
2049    
2050     <pre>
2051     string_group TMPDIR /tmp
2052     string_group TMPDIR /tmp/\(\*\)/\*
2053     </pre>
2054    
2055 kumaneko 30 <h4><a name="4.1.4">4.1.4. Example of conditions that use string arguments.</a></h4>
2056 kumaneko 18
2057     <p>When string argument is specified in condition part, it is quoted by " character in order to clarify that the argument is a string argument rather than name of variable.</p>
2058    
2059     <table border="1">
2060     <tr><td>Conditions example</td><td>Value of variable "path"</td><td>Comparison result</td></tr>
2061     <tr><td rowspan="5">path="/tmp/\*"</td>
2062     <td>/</td><td>Does not match</td></tr>
2063     <tr><td>/tmp</td><td>Does not match</td></tr>
2064     <tr><td>/tmp/</td><td>Matches</td></tr>
2065     <tr><td>/tmp/rt6bh84t</td><td>Matches</td></tr>
2066     <tr><td>/tmp/349gy08t/y8024fgf</td><td>Does not match</td></tr>
2067     <tr><td rowspan="5">path!="/tmp/\*"</td>
2068     <td>/</td><td>Matches</td></tr>
2069     <tr><td>/tmp</td><td>Matches</td></tr>
2070     <tr><td>/tmp/</td><td>Does not match</td></tr>
2071     <tr><td>/tmp/rt6bh84t</td><td>Does not match</td></tr>
2072     <tr><td>/tmp/349gy08t/y8024fgf</td><td>Matches</td></tr>
2073     </table>
2074    
2075     <p>When string_group argument is specified in condition part, it is prefixed by @ character in order to clarify that the argument is a string_group argument rather than name of variable.</p>
2076    
2077     <table border="1">
2078     <tr><td>Conditions example</td><td>Value of variable "path"</td><td>Values in TMPDIR group</td><td>Comparison result</td></tr>
2079     <tr><td rowspan="4">path=@TMPDIR</td>
2080     <td>/</td><td rowspan="4">/tmp<br>/tmp/\(\*\)/\*</td><td>Does not match</td></tr>
2081     <tr><td>/tmp</td><td>Matches</td></tr>
2082     <tr><td>/tmp/rt6bh84t</td><td>Matches</td></tr>
2083     <tr><td>/tmp/349gy08t/y8024fgf</td><td>Matches</td></tr>
2084     <tr><td rowspan="4">path!=@TMPDIR</td>
2085     <td>/</td><td rowspan="4">/tmp<br>/tmp/\(\*\)/\*</td><td>Matches</td></tr>
2086     <tr><td>/tmp</td><td>Does not match</td></tr>
2087     <tr><td>/tmp/rt6bh84t</td><td>Does not match</td></tr>
2088     <tr><td>/tmp/349gy08t/y8024fgf</td><td>Does not match</td></tr>
2089     </table>
2090    
2091     <p>List of name of variables which reference string data is explained later.</p>
2092    
2093 kumaneko 30 <hr>
2094 kumaneko 29 <h3><a name="4.2">4.2. Using numeric arguments in conditions</a></h3>
2095 kumaneko 18
2096     <p>Arguments such as user ID and process ID are handled as numeric argument.</p>
2097    
2098 kumaneko 30 <h4><a name="4.2.1">4.2.1. About numeric argument representation rule</a></h4>
2099 kumaneko 18
2100     <p>Decimal form, octal form and hexadecimal form are supported. Octal form is prefixed with 0 and Hexadecimal form is prefixed with 0x. For example, 010 in octal form is equivalent with 8 in decimal form, 0x10 in hexadecimal form is equivalent with 16 in decimal form.</p>
2101    
2102     <p>Since numeric data is handled using C language's "unsigned long" type, minimal value is 0 and maximal value is 0xFFFFFFFF (for 32 bit environments) or 0xFFFFFFFFFFFFFFFF (for 64 bit environments).</p>
2103    
2104     <p>It is possible to specify numeric data ranges in $min_value-$max_value form. If specifying in range, $min_value has to be smaller or equals to $max_value. For example, 0-100 is valid but 100-0 is invalid.</p>
2105    
2106     <p>Some examples are shown below.</p>
2107    
2108     <pre>
2109     0
2110     100
2111     0xFFFF
2112     0777
2113     500-1000
2114     0x0-0xFFFFFFFF
2115     00-07777
2116     </pre>
2117    
2118 kumaneko 30 <h4><a name="4.2.2">4.2.2. Grouping numeric arguments using number_group keyword.</a></h4>
2119 kumaneko 18
2120     <p>It is possible to define groups of numeric arguments using number_group keyword followed by $number_group_name and $number_group_member.</p>
2121    
2122     <pre>
2123     number_group ID_GROUP 100
2124     number_group ID_GROUP 200-500
2125     </pre>
2126    
2127 kumaneko 30 <h4><a name="4.2.3">4.2.3. Example of conditions that use numeric arguments.</a></h4>
2128 kumaneko 18
2129     <p>Comparison with numeric value is defined as below.</p>
2130    
2131     <table border="1">
2132     <tr><td>Conditions example</td><td>Value of variable "task.uid"</td><td>Comparison result</td></tr>
2133     <tr><td rowspan="3">task.uid=0</td>
2134     <td>0</td><td>Matches</td></tr>
2135     <tr><td>100</td><td>Does not match</td></tr>
2136     <tr><td>500</td><td>Does not match</td></tr>
2137     <tr><td rowspan="3">task.uid!=0</td>
2138     <td>0</td><td>Does not match</td></tr>
2139     <tr><td>100</td><td>Matches</td></tr>
2140     <tr><td>500</td><td>Matches</td></tr>
2141     </table>
2142    
2143     <p>Comparison with numeric value range is defined as below.</p>
2144    
2145     <table border="1">
2146     <tr><td>Conditions example</td><td>Value of variable "task.gid"</td><td>Comparison result</td></tr>
2147     <tr><td rowspan="3">task.gid=0-100</td>
2148     <td>0</td><td>Matches</td></tr>
2149     <tr><td>100</td><td>Matches</td></tr>
2150     <tr><td>500</td><td>Does not match</td></tr>
2151     <tr><td rowspan="3">task.gid!=0-100</td><td>0</td><td>Does not match</td></tr>
2152     <tr><td>100</td><td>Does not match</td></tr>
2153     <tr><td>500</td><td>Matches</td></tr>
2154     </table>
2155    
2156     <p>It is possible to compare one variable which references numeric value with another variable which references numeric value.</p>
2157    
2158     <table border="1">
2159     <tr><td>Conditions example</td><td>Value of variable "task.uid"</td><td>Value of variable "task.gid"</td><td>Comparison result</td></tr>
2160     <tr><td rowspan="4">task.uid=task.gid</td>
2161     <td>0</td><td>0</td><td>Matches</td></tr>
2162     <tr><td>0</td><td>100</td><td>Does not match</td></tr>
2163     <tr><td>100</td><td>0</td><td>Does not match</td></tr>
2164     <tr><td>100</td><td>100</td><td>Matches</td></tr>
2165     <tr><td rowspan="4">task.uid!=task.gid</td>
2166     <td>0</td><td>0</td><td>Does not match</td></tr>
2167     <tr><td>0</td><td>100</td><td>Matches</td></tr>
2168     <tr><td>100</td><td>0</td><td>Matches</td></tr>
2169     <tr><td>100</td><td>100</td><td>Does not match</td></tr>
2170     </table>
2171    
2172     <p>When number_group argument is specified in condition part, it is prefixed by @ character in order to clarify that the argument is a number_group argument rather than name of variable.</p>