home *** CD-ROM | disk | FTP | other *** search
/ PC World 2003 November / PCWorld_2003-11_cd.bin / Komunik / apache / apache_2.0.47-win32-x86-no_ssl.msi / Data.Cab / F250694_suexec.xml < prev    next >
Extensible Markup Language  |  2003-06-22  |  21KB  |  560 lines

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
  3. <?xml-stylesheet type="text/xsl" href="./style/manual.en.xsl"?>
  4.  
  5. <manualpage metafile="suexec.xml.meta">
  6.  
  7.   <title>suEXEC Support</title>
  8.  
  9.   <summary>
  10.     <p>The <strong>suEXEC</strong> feature provides
  11.     Apache users the ability
  12.     to run <strong>CGI</strong> and <strong>SSI</strong> programs
  13.     under user IDs different from the user ID of the calling
  14.     web-server. Normally, when a CGI or SSI program executes, it
  15.     runs as the same user who is running the web server.</p>
  16.  
  17.     <p>Used properly, this feature can reduce
  18.     considerably the security risks involved with allowing users to
  19.     develop and run private CGI or SSI programs. However, if suEXEC
  20.     is improperly configured, it can cause any number of problems
  21.     and possibly create new holes in your computer's security. If
  22.     you aren't familiar with managing setuid root programs and the
  23.     security issues they present, we highly recommend that you not
  24.     consider using suEXEC.</p>
  25.   </summary>
  26.  
  27. <section id="before"><title>Before we begin</title>
  28.  
  29.     <p>Before jumping head-first into this document,
  30.     you should be aware of the assumptions made on the part of the
  31.     Apache Group and this document.</p>
  32.  
  33.     <p>First, it is assumed that you are using a UNIX
  34.     derivative operating system that is capable of
  35.     <strong>setuid</strong> and <strong>setgid</strong> operations.
  36.     All command examples are given in this regard. Other platforms,
  37.     if they are capable of supporting suEXEC, may differ in their
  38.     configuration.</p>
  39.  
  40.     <p>Second, it is assumed you are familiar with
  41.     some basic concepts of your computer's security and its
  42.     administration. This involves an understanding of
  43.     <strong>setuid/setgid</strong> operations and the various
  44.     effects they may have on your system and its level of
  45.     security.</p>
  46.  
  47.     <p>Third, it is assumed that you are using an
  48.     <strong>unmodified</strong> version of suEXEC code. All code
  49.     for suEXEC has been carefully scrutinized and tested by the
  50.     developers as well as numerous beta testers. Every precaution
  51.     has been taken to ensure a simple yet solidly safe base of
  52.     code. Altering this code can cause unexpected problems and new
  53.     security risks. It is <strong>highly</strong> recommended you
  54.     not alter the suEXEC code unless you are well versed in the
  55.     particulars of security programming and are willing to share
  56.     your work with the Apache Group for consideration.</p>
  57.  
  58.     <p>Fourth, and last, it has been the decision of
  59.     the Apache Group to <strong>NOT</strong> make suEXEC part of
  60.     the default installation of Apache. To this end, suEXEC
  61.     configuration requires of the administrator careful attention
  62.     to details. After due consideration has been given to the
  63.     various settings for suEXEC, the administrator may install
  64.     suEXEC through normal installation methods. The values for
  65.     these settings need to be carefully determined and specified by
  66.     the administrator to properly maintain system security during
  67.     the use of suEXEC functionality. It is through this detailed
  68.     process that the Apache Group hopes to limit suEXEC
  69.     installation only to those who are careful and determined
  70.     enough to use it.</p>
  71.  
  72.     <p>Still with us? Yes? Good. Let's move on!</p>
  73. </section>
  74.  
  75. <section id="model"><title>suEXEC Security Model</title>
  76.  
  77.     <p>Before we begin configuring and installing
  78.     suEXEC, we will first discuss the security model you are about
  79.     to implement. By doing so, you may better understand what
  80.     exactly is going on inside suEXEC and what precautions are
  81.     taken to ensure your system's security.</p>
  82.  
  83.     <p><strong>suEXEC</strong> is based on a setuid
  84.     "wrapper" program that is called by the main Apache web server.
  85.     This wrapper is called when an HTTP request is made for a CGI
  86.     or SSI program that the administrator has designated to run as
  87.     a userid other than that of the main server. When such a
  88.     request is made, Apache provides the suEXEC wrapper with the
  89.     program's name and the user and group IDs under which the
  90.     program is to execute.</p>
  91.  
  92.     <p>The wrapper then employs the following process
  93.     to determine success or failure -- if any one of these
  94.     conditions fail, the program logs the failure and exits with an
  95.     error, otherwise it will continue:</p>
  96.  
  97.     <ol>
  98.       <li>
  99.         <strong>Was the wrapper called with the proper number of
  100.         arguments?</strong> 
  101.  
  102.         <p class="indent">
  103.           The wrapper will only execute if it is given the proper
  104.           number of arguments. The proper argument format is known
  105.           to the Apache web server. If the wrapper is not receiving
  106.           the proper number of arguments, it is either being
  107.           hacked, or there is something wrong with the suEXEC
  108.           portion of your Apache binary.
  109.         </p>
  110.       </li>
  111.  
  112.       <li>
  113.         <strong>Is the user executing this wrapper a valid user of
  114.         this system?</strong> 
  115.  
  116.         <p class="indent">
  117.           This is to ensure that the user executing the wrapper is
  118.           truly a user of the system.
  119.         </p>
  120.       </li>
  121.  
  122.       <li>
  123.         <strong>Is this valid user allowed to run the
  124.         wrapper?</strong> 
  125.  
  126.         <p class="indent">
  127.           Is this user the user allowed to run this wrapper? Only
  128.           one user (the Apache user) is allowed to execute this
  129.           program.
  130.         </p>
  131.       </li>
  132.  
  133.       <li>
  134.         <strong>Does the target program have an unsafe hierarchical
  135.         reference?</strong> 
  136.  
  137.         <p class="indent">
  138.           Does the target program contain a leading '/' or have a
  139.           '..' backreference? These are not allowed; the target
  140.           program must reside within the Apache webspace.
  141.         </p>
  142.       </li>
  143.  
  144.       <li>
  145.         <strong>Is the target user name valid?</strong> 
  146.  
  147.         <p class="indent">
  148.           Does the target user exist?
  149.         </p>
  150.       </li>
  151.  
  152.       <li>
  153.         <strong>Is the target group name valid?</strong> 
  154.  
  155.         <p class="indent">
  156.           Does the target group exist?
  157.         </p>
  158.       </li>
  159.  
  160.       <li>
  161.         <strong>Is the target user <em>NOT</em> superuser?</strong>
  162.  
  163.  
  164.         <p class="indent">
  165.           Presently, suEXEC does not allow 'root' to execute
  166.           CGI/SSI programs.
  167.         </p>
  168.       </li>
  169.  
  170.       <li>
  171.         <strong>Is the target userid <em>ABOVE</em> the minimum ID
  172.         number?</strong> 
  173.  
  174.         <p class="indent">
  175.           The minimum user ID number is specified during
  176.           configuration. This allows you to set the lowest possible
  177.           userid that will be allowed to execute CGI/SSI programs.
  178.           This is useful to block out "system" accounts.
  179.         </p>
  180.       </li>
  181.  
  182.       <li>
  183.         <strong>Is the target group <em>NOT</em> the superuser
  184.         group?</strong> 
  185.  
  186.         <p class="indent">
  187.           Presently, suEXEC does not allow the 'root' group to
  188.           execute CGI/SSI programs.
  189.         </p>
  190.       </li>
  191.  
  192.       <li>
  193.         <strong>Is the target groupid <em>ABOVE</em> the minimum ID
  194.         number?</strong> 
  195.  
  196.         <p class="indent">
  197.           The minimum group ID number is specified during
  198.           configuration. This allows you to set the lowest possible
  199.           groupid that will be allowed to execute CGI/SSI programs.
  200.           This is useful to block out "system" groups.
  201.         </p>
  202.       </li>
  203.  
  204.       <li>
  205.         <strong>Can the wrapper successfully become the target user
  206.         and group?</strong> 
  207.  
  208.         <p class="indent">
  209.           Here is where the program becomes the target user and
  210.           group via setuid and setgid calls. The group access list
  211.           is also initialized with all of the groups of which the
  212.           user is a member.
  213.         </p>
  214.       </li>
  215.  
  216.       <li>
  217.         <strong>Does the directory in which the program resides
  218.         exist?</strong> 
  219.  
  220.         <p class="indent">
  221.           If it doesn't exist, it can't very well contain files.
  222.         </p>
  223.       </li>
  224.  
  225.       <li>
  226.         <strong>Is the directory within the Apache
  227.         webspace?</strong> 
  228.  
  229.         <p class="indent">
  230.           If the request is for a regular portion of the server, is
  231.           the requested directory within the server's document
  232.           root? If the request is for a UserDir, is the requested
  233.           directory within the user's document root?
  234.         </p>
  235.       </li>
  236.  
  237.       <li>
  238.         <strong>Is the directory <em>NOT</em> writable by anyone
  239.         else?</strong> 
  240.  
  241.         <p class="indent">
  242.           We don't want to open up the directory to others; only
  243.           the owner user may be able to alter this directories
  244.           contents.
  245.         </p>
  246.       </li>
  247.  
  248.       <li>
  249.         <strong>Does the target program exist?</strong> 
  250.  
  251.         <p class="indent">
  252.           If it doesn't exists, it can't very well be executed.
  253.         </p>
  254.       </li>
  255.  
  256.       <li>
  257.         <strong>Is the target program <em>NOT</em> writable by
  258.         anyone else?</strong> 
  259.  
  260.         <p class="indent">
  261.           We don't want to give anyone other than the owner the
  262.           ability to change the program.
  263.         </p>
  264.       </li>
  265.  
  266.       <li>
  267.         <strong>Is the target program <em>NOT</em> setuid or
  268.         setgid?</strong> 
  269.  
  270.         <p class="indent">
  271.           We do not want to execute programs that will then change
  272.           our UID/GID again.
  273.         </p>
  274.       </li>
  275.  
  276.       <li>
  277.         <strong>Is the target user/group the same as the program's
  278.         user/group?</strong> 
  279.  
  280.         <p class="indent">
  281.           Is the user the owner of the file?
  282.         </p>
  283.       </li>
  284.  
  285.       <li>
  286.         <strong>Can we successfully clean the process environment
  287.         to ensure safe operations?</strong> 
  288.  
  289.         <p class="indent">
  290.           suEXEC cleans the process' environment by establishing a
  291.           safe execution PATH (defined during configuration), as
  292.           well as only passing through those variables whose names
  293.           are listed in the safe environment list (also created
  294.           during configuration).
  295.         </p>
  296.       </li>
  297.  
  298.       <li>
  299.         <strong>Can we successfully become the target program and
  300.         execute?</strong> 
  301.  
  302.         <p class="indent">
  303.           Here is where suEXEC ends and the target program begins.
  304.         </p>
  305.       </li>
  306.     </ol>
  307.  
  308.     <p>This is the standard operation of the
  309.     suEXEC wrapper's security model. It is somewhat stringent and
  310.     can impose new limitations and guidelines for CGI/SSI design,
  311.     but it was developed carefully step-by-step with security in
  312.     mind.</p>
  313.  
  314.     <p>For more information as to how this security
  315.     model can limit your possibilities in regards to server
  316.     configuration, as well as what security risks can be avoided
  317.     with a proper suEXEC setup, see the <a
  318.     href="#jabberwock">"Beware the Jabberwock"</a> section of this
  319.     document.</p>
  320. </section>
  321.  
  322. <section id="install"><title>Configuring & Installing
  323.     suEXEC</title>
  324.  
  325.     <p>Here's where we begin the fun.</p>
  326.  
  327.     <p><strong>suEXEC configuration
  328.     options</strong><br />
  329.     </p>
  330.  
  331.     <dl>
  332.       <dt><code>--enable-suexec</code></dt>
  333.  
  334.       <dd>This option enables the suEXEC feature which is never
  335.       installed or activated by default. At least one
  336.       --with-suexec-xxxxx option has to be provided together with the
  337.       --enable-suexec option to let APACI accept your request for
  338.       using the suEXEC feature.</dd>
  339.  
  340.       <dt><code>--with-suexec-bin=<em>PATH</em></code></dt>
  341.  
  342.       <dd>The path to the suexec binary must be hard-coded in
  343.       the server for security reasons. Use this option to override
  344.       the default path. <em>e.g.</em>
  345.       <code>--with-suexec-bin=/usr/sbin/suexec</code></dd>
  346.  
  347.       <dt><code>--with-suexec-caller=<em>UID</em></code></dt>
  348.  
  349.       <dd>The <a href="mod/mpm_common.html#user">username</a> under which
  350.       Apache normally runs. This is the only user allowed to
  351.       execute this program.</dd>
  352.  
  353.       <dt><code>--with-suexec-userdir=<em>DIR</em></code></dt>
  354.  
  355.       <dd>Define to be the subdirectory under users' home
  356.       directories where suEXEC access should be allowed. All
  357.       executables under this directory will be executable by suEXEC
  358.       as the user so they should be "safe" programs. If you are
  359.       using a "simple" UserDir directive (ie. one without a "*" in
  360.       it) this should be set to the same value. suEXEC will not
  361.       work properly in cases where the UserDir directive points to
  362.       a location that is not the same as the user's home directory
  363.       as referenced in the passwd file. Default value is
  364.       "public_html".<br />
  365.        If you have virtual hosts with a different UserDir for each,
  366.       you will need to define them to all reside in one parent
  367.       directory; then name that parent directory here. <strong>If
  368.       this is not defined properly, "~userdir" cgi requests will
  369.       not work!</strong></dd>
  370.  
  371.       <dt><code>--with-suexec-docroot=<em>DIR</em></code></dt>
  372.  
  373.       <dd>Define as the DocumentRoot set for Apache. This will be
  374.       the only hierarchy (aside from UserDirs) that can be used for
  375.       suEXEC behavior. The default directory is the --datadir value
  376.       with the suffix "/htdocs", <em>e.g.</em> if you configure
  377.       with "<code>--datadir=/home/apache</code>" the directory
  378.       "/home/apache/htdocs" is used as document root for the suEXEC
  379.       wrapper.</dd>
  380.  
  381.       <dt><code>--with-suexec-uidmin=<em>UID</em></code></dt>
  382.  
  383.       <dd>Define this as the lowest UID allowed to be a target user
  384.       for suEXEC. For most systems, 500 or 100 is common. Default
  385.       value is 100.</dd>
  386.  
  387.       <dt><code>--with-suexec-gidmin=<em>GID</em></code></dt>
  388.  
  389.       <dd>Define this as the lowest GID allowed to be a target
  390.       group for suEXEC. For most systems, 100 is common and
  391.       therefore used as default value.</dd>
  392.  
  393.       <dt><code>--with-suexec-logfile=<em>FILE</em></code></dt>
  394.  
  395.       <dd>This defines the filename to which all suEXEC
  396.       transactions and errors are logged (useful for auditing and
  397.       debugging purposes). By default the logfile is named
  398.       "suexec_log" and located in your standard logfile directory
  399.       (--logfiledir).</dd>
  400.  
  401.       <dt><code>--with-suexec-safepath=<em>PATH</em></code></dt>
  402.  
  403.       <dd>Define a safe PATH environment to pass to CGI
  404.       executables. Default value is
  405.       "/usr/local/bin:/usr/bin:/bin".</dd>
  406.     </dl>
  407.  
  408.     <p><strong>Checking your suEXEC
  409.     setup</strong><br />
  410.      Before you compile and install the suEXEC wrapper you can
  411.     check the configuration with the --layout option.<br />
  412.      Example output:</p>
  413.  
  414. <example>
  415.     suEXEC setup:<br />
  416.             suexec binary: /usr/local/apache/sbin/suexec<br />
  417.             document root: /usr/local/apache/share/htdocs<br />
  418.            userdir suffix: public_html<br />
  419.                   logfile: /usr/local/apache/var/log/suexec_log<br />
  420.                 safe path: /usr/local/bin:/usr/bin:/bin<br />
  421.                 caller ID: www<br />
  422.           minimum user ID: 100<br />
  423.          minimum group ID: 100<br />
  424. </example>
  425.  
  426.     <p><strong>Compiling and installing the suEXEC
  427.     wrapper</strong><br />
  428.      If you have enabled the suEXEC feature with the
  429.     --enable-suexec option the suexec binary (together with Apache
  430.     itself) is automatically built if you execute the command
  431.     "make".<br />
  432.      After all components have been built you can execute the
  433.     command "make install" to install them. The binary image
  434.     "suexec" is installed in the directory defined by the --sbindir
  435.     option. Default location is
  436.     "/usr/local/apache/sbin/suexec".<br />
  437.      Please note that you need <strong><em>root
  438.     privileges</em></strong> for the installation step. In order
  439.     for the wrapper to set the user ID, it must be installed as
  440.     owner <code><em>root</em></code> and must have the setuserid
  441.     execution bit set for file modes.</p>
  442.  
  443. </section>
  444.  
  445. <section id="enable"><title>Enabling & Disabling
  446.     suEXEC</title>
  447.  
  448.     <p>Upon startup of Apache, it looks for the file
  449.     "suexec" in the "sbin" directory (default is
  450.     "/usr/local/apache/sbin/suexec"). If Apache finds a properly
  451.     configured suEXEC wrapper, it will print the following message
  452.     to the error log:</p>
  453. <example>
  454.     [notice] suEXEC mechanism enabled (wrapper: <em>/path/to/suexec</em>)
  455. </example>
  456.     <p>If you don't see this message at server startup, the server is
  457.     most likely not finding the wrapper program where it expects
  458.     it, or the executable is not installed <em>setuid root</em>.</p>
  459.  
  460.      <p>If you want to enable the suEXEC mechanism for the first time
  461.     and an Apache server is already running you must kill and
  462.     restart Apache. Restarting it with a simple HUP or USR1 signal
  463.     will not be enough. </p>
  464.      <p>If you want to disable suEXEC you should kill and restart
  465.     Apache after you have removed the "suexec" file. </p>
  466. </section>
  467.  
  468. <section id="usage"><title>Using suEXEC</title>
  469.  
  470.     <p><strong>Virtual Hosts:</strong><br /> One way to use the suEXEC
  471.     wrapper is through the <directive
  472.     module="mod_suexec">SuexecUserGroup</directive> directive in
  473.     <directive module="core">VirtualHost</directive> definitions.  By
  474.     setting this directive to values different from the main server
  475.     user ID, all requests for CGI resources will be executed as the
  476.     <em>User</em> and <em>Group</em> defined for that <directive
  477.     module="core" type="section">VirtualHost</directive>. If this
  478.     directive is not specified for a <directive module="core"
  479.     type="section">VirtualHost</directive> then the main server userid
  480.     is assumed.</p>
  481.  
  482.     <p><strong>User directories:</strong><br />
  483.      The suEXEC wrapper can also be used to execute CGI programs as
  484.     the user to which the request is being directed. This is
  485.     accomplished by using the "<strong><code>~</code></strong>"
  486.     character prefixing the user ID for whom execution is desired.
  487.     The only requirement needed for this feature to work is for CGI
  488.     execution to be enabled for the user and that the script must
  489.     meet the scrutiny of the <a href="#model">security checks</a>
  490.     above.</p>
  491. </section>
  492.  
  493. <section id="debug"><title>Debugging suEXEC</title>
  494.  
  495.     <p>The suEXEC wrapper will write log information
  496.     to the file defined with the --with-suexec-logfile option as
  497.     indicated above. If you feel you have configured and installed
  498.     the wrapper properly, have a look at this log and the error_log
  499.     for the server to see where you may have gone astray.</p>
  500.  
  501. </section>
  502.  
  503. <section id="jabberwock"><title>Beware the Jabberwock:
  504.     Warnings & Examples</title>
  505.  
  506.     <p><strong>NOTE!</strong> This section may not be
  507.     complete. For the latest revision of this section of the
  508.     documentation, see the Apache Group's <a
  509.     href="http://httpd.apache.org/docs-2.0/suexec.html">Online
  510.     Documentation</a> version.</p>
  511.  
  512.     <p>There are a few points of interest regarding
  513.     the wrapper that can cause limitations on server setup. Please
  514.     review these before submitting any "bugs" regarding suEXEC.</p>
  515.  
  516.     <ul>
  517.       <li><strong>suEXEC Points Of Interest</strong></li>
  518.  
  519.       <li>
  520.         Hierarchy limitations 
  521.  
  522.         <p class="indent">
  523.           For security and efficiency reasons, all suexec requests
  524.           must remain within either a top-level document root for
  525.           virtual host requests, or one top-level personal document
  526.           root for userdir requests. For example, if you have four
  527.           VirtualHosts configured, you would need to structure all
  528.           of your VHosts' document roots off of one main Apache
  529.           document hierarchy to take advantage of suEXEC for
  530.           VirtualHosts. (Example forthcoming.)
  531.         </p>
  532.       </li>
  533.  
  534.       <li>
  535.         suEXEC's PATH environment variable 
  536.  
  537.         <p class="indent">
  538.           This can be a dangerous thing to change. Make certain
  539.           every path you include in this define is a
  540.           <strong>trusted</strong> directory. You don't want to
  541.           open people up to having someone from across the world
  542.           running a trojan horse on them.
  543.         </p>
  544.       </li>
  545.  
  546.       <li>
  547.         Altering the suEXEC code 
  548.  
  549.         <p class="indent">
  550.           Again, this can cause <strong>Big Trouble</strong> if you
  551.           try this without knowing what you are doing. Stay away
  552.           from it if at all possible.
  553.         </p>
  554.       </li>
  555.     </ul>
  556.  
  557. </section>
  558.  
  559. </manualpage>
  560.