]> granicus.if.org Git - apache/blob - docs/manual/suexec.html
5c0ebef684a04e1d63af0409ce236fc57e917503
[apache] / docs / manual / suexec.html
1 <html><head>
2 <title>Apache SetUserID Support</title>
3 </head><body>
4
5 <!--#include virtual="header.html" -->
6 <h1>Apache SetUserID Support</h1>
7
8 <hr>
9
10 <h2>What is suEXEC?</h2>
11 The <b>suEXEC</b> feature, introduced in Apache 1.2 provides the ability to
12 run <b>CGI</b> programs under user ids different from the user id of the
13 calling webserver. Used properly, this feature can reduce considerably the
14 insecurity of allowing users to run CGI programs. At the same time, improperly
15 configured, this facility can crash your computer, burn your house down and
16 steal all the money from your retirement fund. <b>:-)</b> If you aren't 
17 familar with managing setuid root programs and the security issues they
18 present, we highly recommend that you not consider using this feature.<p>
19
20 <h2>Enabling suEXEC Support</h2>
21 Having said all that, enabling this feature is purposefully difficult with
22 the intent that it will only be installed by users determined to use it and
23 is not part of the normal install/compile process.<p>
24
25 <ul>
26 <h3>Configuring the suEXEC wrapper</h3>
27 From the toplevel of the Apache source tree, type:&nbsp;&nbsp;<b><code>cd support [ENTER]</code></b><p>
28 Edit the <code>suexec.h</code> file and change the following macros to match your
29 local Apache installation.<p>
30 <i>From support/suexec.h</i>
31 <code>
32 <pre>
33 /*
34  * HTTPD_USER -- Define as the username under which Apache normally
35  *               runs.  This is the only user allowed to execute
36  *               this program.
37  */
38 #define HTTPD_USER "www"
39
40 /*
41  * LOG_EXEC -- Define this as a filename if you want all suEXEC
42  *             transactions and errors logged for auditing and
43  *             debugging purposes.
44  */
45 #define LOG_EXEC "/usr/local/etc/httpd/logs/cgi.log"
46
47 /*
48  * DOC_ROOT -- Define as the DocuemntRoot set for Apache.  This
49  *             will be the only hierarchy (aside from UserDirs)
50  *             that can be used for suEXEC behaviour.
51  */
52 #define DOC_ROOT "/usr/local/etc/httpd/htdocs"
53
54 /*
55  * NNAME -- Define this as the name for the nobody account
56  *          on your operating system.  Most systems will just
57  *          need the default 'nobody'.
58  */
59 #define NNAME "nobody"
60
61 /* NGID -- Define this as the *number* for the nogroup group
62  *         on your operating system.  Most systems will have
63  *         a -1 or -2.  Others might have something above
64  *         65000.
65  */
66 #define NGID -1
67 </pre>
68 </code>
69
70 <h3>Compiling the suEXEC wrapper</h3>
71 At the shell command prompt, type:&nbsp;&nbsp;<b><code>cc suexec.c -o suexec [ENTER]</code></b>.<p>
72 This should create the <b><em>suexec</em></b> wrapper executable.
73
74 <h3>Compiling Apache for suEXEC support</h3>
75 By default, Apache is compiled to look for the suEXEC wrapper in the following
76 location.<p>
77 <i>From src/httpd.h</i>
78 <code>
79 <pre>
80 /* The path to the suEXEC wrapper */
81 #ifndef SUEXEC_BIN
82 #define SUEXEC_BIN "/usr/local/etc/httpd/sbin/suexec"
83 #endif
84 </pre>
85 </code>
86 <p>
87 If your installation requires location of the wrapper program in a different
88 directory, edit src/httpd.h and recompile your Apache server. See <a href="install.html">Compiling and Installing Apache</a> for more info on this process.<p>
89
90 <h3>Installing the suEXEC wrapper</h3>
91 Copy the <b><em>suexec</em></b> executable created in the exercise above to the defined
92 location for <b>SUEXEC_BIN</b>.<p>
93 In order for the wrapper to set the user id for execution requests it must me installed
94 as owner <b><em>root</em></b> and must have the setuserid execution bit set for file modes.
95 If you are not running a <b><em>root</em></b> user shell, do so now and execute the following
96 commands.<p>
97
98 <b><code>chown root /usr/local/etc/httpd/sbin/suexec [ENTER]</code></b><p>
99 <b><code>chmod 4711 /usr/local/etc/httpd/sbin/suexec [ENTER]</code></b><p>
100
101 <i>Change the path to the suEXEC wrapper to match your system installation.</i>
102 </ul>
103
104 <a name="model"></a>
105 <h2>Security Model of suEXEC</h2>
106 The <b>suEXEC</b> wrapper supplied with Apache performs the following security
107 checks before it will execute any program passed to it for execution.
108 <ol>
109 <li>User executing the wrapper <b>must be a valid user on this system</b>.
110 <li>User executing the wrapper <b>must be the compiled in HTTPD_USER</b>.
111 <li>The command that the request wishes to execute <b>must not contain a /</b>.
112 <li>The command being executed <b>must reside under the compiled in DOC_ROOT</b>.
113 <li>The current working directory <b>must be a directory</b>.
114 <li>The current working directory <b>must not be writable by <em>group</em> or <em>other</em></b>.
115 <li>The command being executed <b>cannot be a symbolic link</b>.
116 <li>The command being executed <b>cannot be writeable by <em>group</em> or <em>other</em></b>.
117 <li>The command being executed <b>cannot be a <em>setuid</em> or <em>setgid</em> program</b>.
118 <li>The target UID and GID <b>must be a valid user and group on this system</b>.
119 <li>The target UID and GID to execute as, <b>must match the UID and GID of the directory</b>.
120 <li>The target execution UID and GID <b>must not be the privledged ID 0</b>.
121 <li>Group access list is set to NOGROUP and the command is executed.
122 </ol>
123 If any of these issues are too restrictive, or do not seem restrictive enough, you are
124 welcome to install your own version of the wrapper. We've given you the rope, now go
125 have fun with it. <b>:-)</b>
126
127 <h2>Using suEXEC</h2>
128 After properly installing the <b>suexec</b> wrapper executable, you must kill and restart
129 the Apache server. A simple <code><b>kill -1 `cat httpd.pid`</b></code> will not be enough.
130 Upon startup of the webserver, if Apache finds a properly configured <b>suexec</b> wrapper,
131 it will print the following message to the console.<p>
132
133 <code>Configuring Apache for use with suexec wrapper.</code><p>
134
135 If you don't see this message at server startup, the server is most likely not finding the
136 wrapper program where it expects it, or the executable is not installed <b><em>setuid root</em></b>. Check your installation and try again.<p>
137
138 One way to use <b>suEXEC</b> is through the <a href="mod/core.html#user"><b>User</b></a> and <a href="mod/core.html#group"><b>Group</b></a> directives in <a href="mod_core.html#virtualhost"><b>VirtualHost</b></a> definitions. By setting these directives to values
139 different from the main server user id, all requests for CGI resources will be executed as
140 the <b>User</b> and <b>Group</b> defined for that <b>&lt;VirtualHost&gt;</b>. If only one or
141 neither of these directives are specified for a <b>&lt;VirtualHost&gt;</b> then the main
142 server userid is assumed.<p>
143
144 <b>suEXEC</b> can also be used to to execute CGI programs as the user to which the request
145 is being directed. This is accomplished by using the <b>~</b> character prefixing the
146 user id for whom execution is desired. The only requirement needed for this feature to work
147 is for CGI execution to be enabled for the user and that the script must meet the scrutiny of the <a href="#model">security checks</a> above.
148
149 <h2>Debugging suEXEC</h2>
150 The suEXEC wrapper will write log information to the location defined in the <code>suexec.h</code> as indicated above. If you feel you have configured and installed the wrapper properly,
151 have a look at this log and the error_log for the server to see where you may have gone astray.
152 <!--#include virtual="footer.html" -->
153
154 </BODY>
155 </HTML>
156