NAME
    Apache::Access::Headers - mod_perl HTTP header authorization module
SYNOPSIS
     # in httpd.conf
     PerlSetVar HeadersAccessConf conf/headers_access.conf
        
     DocumentRoot /usr/local/apache/htdocs
     
        PerlModule Apache::Access::Headers
        PerlAccessHandler Apache::Access::Headers
     
DESCRIPTION
    This module is intended to be used as a mod_perl PerlAccessHandler. It's
    function is to authorize requests for server resources based on the
    existence of and content of HTTP headers.
    Authorizing HTTP headers may be be set by a web browser, a software
    agent, or an authenitcating proxy server. This module was originally
    written to work with the latter.
    Note: The default reponse from the handler is currently FORBIDDEN. This
    behavior is not yet configurable.
CONFIGURING APACHE
    Module configuration is simple ( read: limited ). Currently, the module
    only works with a single configuration file, and works best when
    configured for a server's document root. See the LIMITATIONS section for
    an explanation of the modules current short-comings.
    Add the following line to httpd.conf outside all Directory, Location and
    VirtualHost blocks:
     PerlSetVar HeadersAccessConf /path/to/conf/headers_access.conf
 
    And add the following lines to the DocumentRoot Directory block:
      PerlModule Apache::Access::Headers
      PerlAccessHandler Apache::Access::Headers 
CONFIGURATION FILE
  General Options
    Although the modules is currently limited to a single xml-based
    configuration file, this configuration file is quite flexible.
    The shell of the conf file is:
     
      
      [...]
      
       
    The important part of the conf file is the  blocks within the
     block. Each  block must contain two items: an  tag
    and a  tag.
    The  tag specifies the name of the HTTP header that that must be set
    to allow access to the urls matched by the  tags.  tags are
    treated as regular expressions ( i.e., m|^$k$| where $k is the value of
    the  tag ).
    Using the Sample Configuration File below, a request for
    /secrets/index.html must contain an X-Can-View-Secret-Stuff header with
    a non-zero value in order to be successfully authorized.
    Likewise, a request for /secrets.html requires that either an
    X-Can-View-Secret-Stuff header or an X-Can-View-Super-Secret-Stuff
    header is present and set to a non-zero value.
    As mentioned above,  tags are treated as regular expressions.
    You'll notice, then, that the  tag for X-Secret-User-I1 in the
    sample conf contains parantheses. Parentheses tells the module to
    require that the value assigned to the needed header ( i.e.
    X-Secret-User-ID ) equal $1.
    For example, using the sample conf, a request for /users/jeffo/ must
    have an X-Secret-User-ID header set to 'jeffo'. If X-Secret-User-ID
    header is present but set to 'tori', the request will be denied.
  Other Options
    There are three special configuration options. They are outlined here:
    ALL
       If the  of a  block is 'ALL', then _all_ requests for
       resources matched by the attached  tags. This is useful for
       allowing access to / and index.html, etc.
    REFERER
       If the  of a  block is 'REFERER', then the referer header
       is checked against an array of referer values specified by 
       tags in the  block.
       For example, using the sample conf file, requests for
       /images/background.gif coming from a page on http://www.rulez.com/,
       or http://www.picnicman.com/ will be accepted.
        tags are treated as regexes ( like  tags ). The regex
       used is 'm|^$ar|' where $ar is the contents of the  tags.
       One little trick is to use 'https?://' at the start of the regex to
       allow connections from either secure or insecure pages.
       Note: If the referer is not matched, FORBIDDEN will not be
       automatically returned. In this case, the module continues to loop
       over  values, looking for a secondary match.
       i.e. if a request for /images/button.gif does not come from a valid
       referer, but contains a X-Can-View-Secret-Stuff header, the image
       will be served.
       This behavior is open to debate. Admittedly, it's a hack meant to
       overcome some problems with the original spec. If you don't like it,
       then don't use REFERER as an . :)
    
       You'll notice a commented-out  tag in the sample conf file.
       The prefix tag was added because some - *cough* - authenticating
       proxies prepend a string to header values defined in the
       authtencation database.
       If the  tag is set, then all header checks will look for
       $PREFIX . $HEADER.
       For example, if  is set to 'Rulez-', requests for
       /secret/index.html would require not a X-Can-View-Secret-Stuff
       header, but a Rulez-X-Can-View-Secret-Stuff header.
  Sample Configuration File
     
      
       
       
       
        REFERER
        https?://www.rulez.com/
        https?://ww.picnicman.com/
        /images/.*
        /cgi/*.cgi
       
       
        X-Can-View-Secret-Stuff
        /secret/.*
        /secrets.html
        /images/.*
       
       
        X-Can-View-Super-Secret-Stuff
        /super-secret/.*
        /secrets.html
       
       
        X-Secret-User-ID
        /users/(.*?)/.*(
       
      
    
  Configuration File DTD
     
     
      
      
      
      
      
     ]>
TESTING & DEBUGGING
    If you set Apache's LogLevel to 'debug', the module will spit out a
    bunch of information regarding it's handling of the request.
     ErrorLog ./logs/error_log
     LogLevel debug
    This is particularly useful if you're creating complicated  tag
    regexes, or if you really have no idea why a request is getting though.
    :)
LIMITATIONS & THE FUTURE
    This module was originally written to cover the entire document root of
    a web server. And right now, that's all it does. This was a
    security-driven decision. The down-side is that the module is not
    VirtualHost or Directory friendly.
    I wanted to release this first version before adding support for use in
    VirtualHosts and Directory blocks with separate conf files.
    If interest - and time - allow, these will be the key features of the
    next release. ( Not to mention configuration of the default return
    policy and inversion of deny, allow rules, etc. )
RESOURCES
    For an example of a commercial authentication proxy, see
    SecureComputing's PremierAccess product. http://securecomputing.com/. I
    don't necessarily recommend it; I just know it because I wrote this to
    work with it. :)
AUTHOR
    Jeffrey O'Connell, Jr. 
COPYRIGHT
    Copyright (c) 2003 Jeffrey O'Connell, Jr., Rulez New Media
    This library is free software; you can redistribute it and/or modify it
    under the same terms as Perl itself.