mirror of
https://github.com/apache/httpd.git
synced 2025-11-22 21:22:39 +03:00
Merge from branches/authz-dev Basically here is a list of what has been done: - Convert all of the authz modules from hook based to provider based - Remove the ap_requires field from the core_dir_config structure - Remove the function ap_requires() since its functionality is no longer supported or necessary in the refactoring - Remove the calls to ap_some_auth_required() in the core request handling to allow the hooks to be called in all cases. - Add the new module mod_authz_core which will act as the authorization provider vector and contain common authz directives such as 'Require', 'Reject' and '<RequireAlias>' - Add the new module mod_authn_core which will contain common authentication directives such as 'AuthType', 'AuthName' and '<AuthnProviderAlias>' - Move the check for METHOD_MASK out of the authz providers and into the authz_core provider vector - Define the status codes that can be returned by the authz providers as AUTHZ_DENIED, AUTHZ_GRANTED and AUTHZ_GENERAL_ERROR - Remove the 'Satisfy' directive - Implement the '<RequireAll>', '<RequireOne>' block directives to handle the 'and' and 'or' logic for authorization. - Remove the 'AuthzXXXAuthoritative' directives from all of the authz providers - Implement the 'Reject' directive that will deny authorization if the argument is true - Fold the 'Reject' directive into the '<RequireAll>', '<RequireOne>' logic - Reimplement the host based authorization functionality provided by 'allow', 'deny' and 'order' as authz providers - Remove the 'allow', 'deny' and 'order' directives - Merge mod_authn_alias into mod_authn_core - Add '<RequireAlias>' functionality which is similar to '<AuthnProviderAlias>' but specific to authorization aliasing - Remove all of the references to the 'authzxxxAuthoritative' directives from the documentation - Remove the 'Satisfy' directive from the documentation - Remove 'Allow', 'Deny', 'Order' directives from the documentation - Document '<RequireAll>', '<RequireOne>', 'Reject' directives - Reimplement the APIs ap_auth_type(), ap_auth_name() as optional functions and move the actual implementation into mod_authn_core - Reimplement the API ap_some_auth_required() as an optional function and move the actual implementation into mod_authz_core Major Changes: - Added the directives <RequireAll>, <RequireOne>, <RequireAlias>, Reject - Expanded the functionality of the directive 'Require' to handle all authorization and access control - Added the new authz providers 'env', 'ip', 'host', 'all' to handle host-based access control - Removed the directives 'Allow', 'Deny', 'Order', 'Satisfy', 'AuthzXXXAuthoritative' - Removed the ap_require() API - Moved the directives 'AuthType', 'AuthName' out of mod_core and into mod_authn_core - Moved the directive 'Require' out of mod_core and into mod_authz_core - Merged mod_authn_alias into mod_authn_core - Renamed mod_authz_dbm authz providers from 'group' and 'file-group' to 'dbm-group' and 'dbm-file-group' Benefits: - All authorization and access control is now handle through two directives, 'Require' and 'Reject' - Authorization has been expanded to allow for complex 'AND/OR' control logic through the directives '<RequireAll>' and '<RequireOne>' - Configuration is now much simpler and consistent across the board - Other modules like mod_ssl and mod_proxy should be able to plug into and take advantage of the same provider based authorization mechanism by implementing their own providers Issues: - Backwards compatibility between 2.2 and 2.3 configurations will be broken in the area of authorization and access control due to the fact that the directives 'allow', 'deny', 'order' and 'satisfy' have been removed. When moving from 2.2 to 2.3 these directives will have to be changed to 'Require all granted', 'Require all denied' or some variation of the authz host-based providers. - Existing third party authorization modules will have to adapt to the new structure. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@368027 13f79535-47bb-0310-9956-ffa450edef68
221 lines
9.9 KiB
XML
221 lines
9.9 KiB
XML
<?xml version="1.0" encoding="UTF-8" ?>
|
|
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
|
|
<?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?>
|
|
<!-- $LastChangedRevision$ -->
|
|
|
|
<!--
|
|
Copyright 2003-2005 The Apache Software Foundation or its licensors, as
|
|
applicable.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
-->
|
|
|
|
<manualpage metafile="request.xml.meta">
|
|
<parentdocument href="./">Developer Documentation</parentdocument>
|
|
|
|
<title>Request Processing in Apache 2.0</title>
|
|
|
|
<summary>
|
|
<note type="warning"><title>Warning</title>
|
|
<p>Warning - this is a first (fast) draft that needs further
|
|
revision!</p>
|
|
</note>
|
|
|
|
<p>Several changes in Apache 2.0 affect the internal request
|
|
processing mechanics. Module authors need to be aware of these
|
|
changes so they may take advantage of the optimizations and
|
|
security enhancements.</p>
|
|
|
|
<p>The first major change is to the subrequest and redirect
|
|
mechanisms. There were a number of different code paths in
|
|
Apache 1.3 to attempt to optimize subrequest or redirect
|
|
behavior. As patches were introduced to 2.0, these
|
|
optimizations (and the server behavior) were quickly broken due
|
|
to this duplication of code. All duplicate code has been folded
|
|
back into <code>ap_process_request_internal()</code> to prevent
|
|
the code from falling out of sync again.</p>
|
|
|
|
<p>This means that much of the existing code was 'unoptimized'.
|
|
It is the Apache HTTP Project's first goal to create a robust
|
|
and correct implementation of the HTTP server RFC. Additional
|
|
goals include security, scalability and optimization. New
|
|
methods were sought to optimize the server (beyond the
|
|
performance of Apache 1.3) without introducing fragile or
|
|
insecure code.</p>
|
|
</summary>
|
|
|
|
<section id="processing"><title>The Request Processing Cycle</title>
|
|
<p>All requests pass through <code>ap_process_request_internal()</code>
|
|
in <code>request.c</code>, including subrequests and redirects. If a module
|
|
doesn't pass generated requests through this code, the author is cautioned
|
|
that the module may be broken by future changes to request
|
|
processing.</p>
|
|
|
|
<p>To streamline requests, the module author can take advantage
|
|
of the hooks offered to drop out of the request cycle early, or
|
|
to bypass core Apache hooks which are irrelevant (and costly in
|
|
terms of CPU.)</p>
|
|
</section>
|
|
|
|
<section id="parsing"><title>The Request Parsing Phase</title>
|
|
<section id="unescape"><title>Unescapes the URL</title>
|
|
<p>The request's <code>parsed_uri</code> path is unescaped, once and only
|
|
once, at the beginning of internal request processing.</p>
|
|
|
|
<p>This step is bypassed if the proxyreq flag is set, or the
|
|
<code>parsed_uri.path</code> element is unset. The module has no further
|
|
control of this one-time unescape operation, either failing to
|
|
unescape or multiply unescaping the URL leads to security
|
|
reprecussions.</p>
|
|
</section>
|
|
|
|
<section id="strip"><title>Strips Parent and This Elements from the
|
|
URI</title>
|
|
<p>All <code>/../</code> and <code>/./</code> elements are
|
|
removed by <code>ap_getparents()</code>. This helps to ensure
|
|
the path is (nearly) absolute before the request processing
|
|
continues.</p>
|
|
|
|
<p>This step cannot be bypassed.</p>
|
|
</section>
|
|
|
|
<section id="inital-location-walk"><title>Initial URI Location Walk</title>
|
|
<p>Every request is subject to an
|
|
<code>ap_location_walk()</code> call. This ensures that
|
|
<directive type="section" module="core">Location</directive> sections
|
|
are consistently enforced for all requests. If the request is an internal
|
|
redirect or a sub-request, it may borrow some or all of the processing
|
|
from the previous or parent request's ap_location_walk, so this step
|
|
is generally very efficient after processing the main request.</p>
|
|
</section>
|
|
|
|
<section id="translate_name"><title>translate_name</title>
|
|
<p>Modules can determine the file name, or alter the given URI
|
|
in this step. For example, <module>mod_vhost_alias</module> will
|
|
translate the URI's path into the configured virtual host,
|
|
<module>mod_alias</module> will translate the path to an alias path,
|
|
and if the request falls back on the core, the <directive module="core"
|
|
>DocumentRoot</directive> is prepended to the request resource.</p>
|
|
|
|
<p>If all modules <code>DECLINE</code> this phase, an error 500 is
|
|
returned to the browser, and a "couldn't translate name" error is logged
|
|
automatically.</p>
|
|
</section>
|
|
|
|
<section id="map_to_storage"><title>Hook: map_to_storage</title>
|
|
<p>After the file or correct URI was determined, the
|
|
appropriate per-dir configurations are merged together. For
|
|
example, <module>mod_proxy</module> compares and merges the appropriate
|
|
<directive module="mod_proxy" type="section">Proxy</directive> sections.
|
|
If the URI is nothing more than a local (non-proxy) <code>TRACE</code>
|
|
request, the core handles the request and returns <code>DONE</code>.
|
|
If no module answers this hook with <code>OK</code> or <code>DONE</code>,
|
|
the core will run the request filename against the <directive
|
|
module="core" type="section">Directory</directive> and <directive
|
|
module="core" type="section">Files</directive> sections. If the request
|
|
'filename' isn't an absolute, legal filename, a note is set for
|
|
later termination.</p>
|
|
</section>
|
|
|
|
<section id="location-walk"><title>URI Location Walk</title>
|
|
<p>Every request is hardened by a second
|
|
<code>ap_location_walk()</code> call. This reassures that a
|
|
translated request is still subjected to the configured
|
|
<directive module="core" type="section">Location</directive> sections.
|
|
The request again borrows some or all of the processing from its previous
|
|
<code>location_walk</code> above, so this step is almost always very
|
|
efficient unless the translated URI mapped to a substantially different
|
|
path or Virtual Host.</p>
|
|
</section>
|
|
|
|
<section id="header_parser"><title>Hook: header_parser</title>
|
|
<p>The main request then parses the client's headers. This
|
|
prepares the remaining request processing steps to better serve
|
|
the client's request.</p>
|
|
</section>
|
|
</section>
|
|
|
|
<section id="security"><title>The Security Phase</title>
|
|
<p>Needs Documentation. Code is:</p>
|
|
|
|
<example><pre>
|
|
if ((access_status = ap_run_access_checker(r)) != 0) {
|
|
return decl_die(access_status, "check access", r);
|
|
}
|
|
|
|
if ((access_status = ap_run_check_user_id(r)) != 0) {
|
|
return decl_die(access_status, "check user", r);
|
|
}
|
|
|
|
if ((access_status = ap_run_auth_checker(r)) != 0) {
|
|
return decl_die(access_status, "check authorization", r);
|
|
}
|
|
</pre>
|
|
</example>
|
|
</section>
|
|
|
|
<section id="preparation"><title>The Preparation Phase</title>
|
|
<section id="type_checker"><title>Hook: type_checker</title>
|
|
<p>The modules have an opportunity to test the URI or filename
|
|
against the target resource, and set mime information for the
|
|
request. Both <module>mod_mime</module> and
|
|
<module>mod_mime_magic</module> use this phase to compare the file
|
|
name or contents against the administrator's configuration and set the
|
|
content type, language, character set and request handler. Some modules
|
|
may set up their filters or other request handling parameters at this
|
|
time.</p>
|
|
|
|
<p>If all modules <code>DECLINE</code> this phase, an error 500 is
|
|
returned to the browser, and a "couldn't find types" error is logged
|
|
automatically.</p>
|
|
</section>
|
|
|
|
<section id="fixups"><title>Hook: fixups</title>
|
|
<p>Many modules are 'trounced' by some phase above. The fixups
|
|
phase is used by modules to 'reassert' their ownership or force
|
|
the request's fields to their appropriate values. It isn't
|
|
always the cleanest mechanism, but occasionally it's the only
|
|
option.</p>
|
|
</section>
|
|
</section>
|
|
|
|
<section id="handler"><title>The Handler Phase</title>
|
|
<p>This phase is <strong>not</strong> part of the processing in
|
|
<code>ap_process_request_internal()</code>. Many
|
|
modules prepare one or more subrequests prior to creating any
|
|
content at all. After the core, or a module calls
|
|
<code>ap_process_request_internal()</code> it then calls
|
|
<code>ap_invoke_handler()</code> to generate the request.</p>
|
|
|
|
<section id="insert_filter"><title>Hook: insert_filter</title>
|
|
<p>Modules that transform the content in some way can insert
|
|
their values and override existing filters, such that if the
|
|
user configured a more advanced filter out-of-order, then the
|
|
module can move its order as need be. There is no result code,
|
|
so actions in this hook better be trusted to always succeed.</p>
|
|
</section>
|
|
|
|
<section id="hook_handler"><title>Hook: handler</title>
|
|
<p>The module finally has a chance to serve the request in its
|
|
handler hook. Note that not every prepared request is sent to
|
|
the handler hook. Many modules, such as <module>mod_autoindex</module>,
|
|
will create subrequests for a given URI, and then never serve the
|
|
subrequest, but simply lists it for the user. Remember not to
|
|
put required teardown from the hooks above into this module,
|
|
but register pool cleanups against the request pool to free
|
|
resources as required.</p>
|
|
</section>
|
|
</section>
|
|
</manualpage>
|
|
|