Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /tags/htdocs/index.html

Parent Directory Parent Directory | Revision Log Revision Log


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