randy 96/12/01 12:04:02
Modified: htdocs/manual suexec.html Log: First of cut of suexec docs Revision Changes Path 1.2 +139 -3 apache/htdocs/manual/suexec.html Index: suexec.html =================================================================== RCS file: /export/home/cvs/apache/htdocs/manual/suexec.html,v retrieving revision 1.1 retrieving revision 1.2 diff -C3 -r1.1 -r1.2 *** suexec.html 1996/12/01 17:06:57 1.1 --- suexec.html 1996/12/01 20:04:00 1.2 *************** *** 7,20 **** <hr> ! <h2>What is SUExec?</h2> ! <h2>Enabling SUExec Support</h2> ! <h2>When SUExec Is Used</h2> <!--#include virtual="footer.html" --> </BODY> </HTML> --- 7,156 ---- <hr> ! <h2>What is suEXEC?</h2> ! The <b>suEXEC</b> feature, introduced in Apache 1.2 provides the ability to ! run <b>CGI</b> programs under user ids different from the user id of the ! calling webserver. Used properly, this feature can reduce considerably the ! insecurity of allowing users to run CGI programs. At the same time, improperly ! configured, this facility can crash your computer, burn your house down and ! steal all the money from your retirement fund. <b>:-)</b> If you aren't ! familar with managing setuid root programs and the security issues they ! present, we highly recommend that you not consider using this feature.<p> ! <h2>Enabling suEXEC Support</h2> ! Having said all that, enabling this feature is purposefully difficult with ! the intent that it will only be installed by users determined to use it and ! is not part of the normal install/compile process.<p> ! <ul> ! <h3>Configuring the suEXEC wrapper</h3> ! From the toplevel of the Apache source tree, type: <b><code>cd support [ENTER]</code></b><p> ! Edit the <code>suexec.h</code> file and change the following macros to match your ! local Apache installation.<p> ! <i>From support/suexec.h</i> ! <code> ! <pre> ! /* ! * HTTPD_USER -- Define as the username under which Apache normally ! * runs. This is the only user allowed to execute ! * this program. ! */ ! #define HTTPD_USER "www" + /* + * LOG_EXEC -- Define this as a filename if you want all suEXEC + * transactions and errors logged for auditing and + * debugging purposes. + */ + #define LOG_EXEC "/usr/local/etc/httpd/logs/cgi.log" + /* + * DOC_ROOT -- Define as the DocuemntRoot set for Apache. This + * will be the only hierarchy (aside from UserDirs) + * that can be used for suEXEC behaviour. + */ + #define DOC_ROOT "/usr/local/etc/httpd/htdocs" + + /* + * NNAME -- Define this as the name for the nobody account + * on your operating system. Most systems will just + * need the default 'nobody'. + */ + #define NNAME "nobody" + + /* NGID -- Define this as the *number* for the nogroup group + * on your operating system. Most systems will have + * a -1 or -2. Others might have something above + * 65000. + */ + #define NGID -1 + </pre> + </code> + + <h3>Compiling the suEXEC wrapper</h3> + At the shell command prompt, type: <b><code>cc suexec.c -o suexec [ENTER]</code></b>.<p> + This should create the <b><em>suexec</em></b> wrapper executable. + + <h3>Compiling Apache for suEXEC support</h3> + By default, Apache is compiled to look for the suEXEC wrapper in the following + location.<p> + <i>From src/httpd.h</i> + <code> + <pre> + /* The path to the suEXEC wrapper */ + #ifndef SUEXEC_BIN + #define SUEXEC_BIN "/usr/local/etc/httpd/sbin/suexec" + #endif + </pre> + </code> + <p> + If your installation requires location of the wrapper program in a different + 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> + + <h3>Installing the suEXEC wrapper</h3> + Copy the <b><em>suexec</em></b> executable created in the exercise above to the defined + location for <b>SUEXEC_BIN</b>.<p> + In order for the wrapper to set the user id for execution requests it must me installed + as owner <b><em>root</em></b> and must have the setuserid execution bit set for file modes. + If you are not running a <b><em>root</em></b> user shell, do so now and execute the following + commands.<p> + + <b><code>chown root /usr/local/etc/httpd/sbin/suexec [ENTER]</code></b><p> + <b><code>chmod 4711 /usr/local/etc/httpd/sbin/suexec [ENTER]</code></b><p> + + <i>Change the path to the suEXEC wrapper to match your system installation.</i> + </ul> + + <a name="model"></a> + <h2>Security Model of suEXEC</h2> + The <b>suEXEC</b> wrapper supplied with Apache performs the following security + checks before it will execute any program passed to it for execution. + <ol> + <li>User executing the wrapper <b>must be a valid user on this system</b>. + <li>User executing the wrapper <b>must be the compiled in HTTPD_USER</b>. + <li>The command that the request wishes to execute <b>must not contain a /</b>. + <li>The command being executed <b>must reside under the compiled in DOC_ROOT</b>. + <li>The current working directory <b>must be a directory</b>. + <li>The current working directory <b>must not be writable by <em>group</em> or <em>other</em></b>. + <li>The command being executed <b>cannot be a symbolic link</b>. + <li>The command being executed <b>cannot be writeable by <em>group</em> or <em>other</em></b>. + <li>The command being executed <b>cannot be a <em>setuid</em> or <em>setgid</em> program</b>. + <li>The target UID and GID <b>must be a valid user and group on this system</b>. + <li>The target UID and GID to execute as, <b>must match the UID and GID of the directory</b>. + <li>The target execution UID and GID <b>must not be the privledged ID 0</b>. + <li>Group access list is set to NOGROUP and the command is executed. + </ol> + If any of these issues are too restrictive, or do not seem restrictive enough, you are + welcome to install your own version of the wrapper. We've given you the rope, now go + have fun with it. <b>:-)</b> + + <h2>Using suEXEC</h2> + After properly installing the <b>suexec</b> wrapper executable, you must kill and restart + the Apache server. A simple <code><b>kill -1 `cat httpd.pid`</b></code> will not be enough. + Upon startup of the webserver, if Apache finds a properly configured <b>suexec</b> wrapper, + it will print the following message to the console.<p> + + <code>Configuring Apache for use with suexec wrapper.</code><p> + + If you don't see this message at server startup, the server is most likely not finding the + 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> + + 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 + different from the main server user id, all requests for CGI resources will be executed as + the <b>User</b> and <b>Group</b> defined for that <b><VirtualHost></b>. If only one or + neither of these directives are specified for a <b><VirtualHost></b> then the main + server userid is assumed.<p> + + <b>suEXEC</b> can also be used to to execute CGI programs as the user to which the request + is being directed. This is accomplished by using the <b>~</b> character prefixing the + user id for whom execution is desired. The only requirement needed for this feature to work + 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. + + <h2>Debugging suEXEC</h2> + 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, + have a look at this log and the error_log for the server to see where you may have gone astray. <!--#include virtual="footer.html" --> + </BODY> </HTML>