Provided by: dacs_1.4.38a-2build1_amd64 bug

NAME

       dacs - a distributed access control system

SYNOPSIS

       dacs [-v | --verbose] [--checkdigest digest-desc] [--dumpenv] [--digests [digest-name]]
            [--license] [--version]

       dacs dacs-command [dacsoptions[1]] [...]

       dacs-command [-u uri-prefix | -uj jurisdiction-name | -un | -up jurisdiction-name | -us]
                    [-c dacs.conf]
                    [-sc site.conf] [-ll logging-level] [-format fmt] [-q] [-t] [-Dname=value]
                    [-v | --verbose] [--checkdigest digest-desc] [--digests [digest-name]]
                    [--dumpenv] [--enable-dump] [--license] [--std] [--version]

DESCRIPTION

       This program is part of the DACS suite.

       DACS is a general-purpose, Web-based authentication and access control system. It provides
       single sign-on functionality and flexible access control to content and services provided
       by web servers.  DACS consists of an Apache module (mod_auth_dacs[2]) through which Apache
       communicates with DACS to make access control decisions, a suite of CGI programs that
       provide DACS web services, and a collection of utility commands that provide various
       support and administrative functions for DACS. Some of these utilities, such as
       dacshttp(1)[3] and sslclient(1)[4], are completely general-purpose.

       The DACS access control engine and authentication components can also be used from the
       command line, within a CGI environment or completely independently of the Web.

       For important information about DACS, including installation instructions, please see
       dacs.readme(7)[5] and dacs.install(7)[6].

   About DACS
           NO WARRANTY
           This software is provided by Dss "as is" and any express or implied warranties,
           including, but not limited to, the implied warranties of merchantability, fitness for
           a particular purpose, or non-infringement, are disclaimed. In no event shall Dss be
           liable for any direct, indirect, incidental, special, exemplary, or consequential
           damages (including, but not limited to, procurement of substitute goods or services;
           loss of use, data, or profits; or business interruption) however caused and on any
           theory of liability, whether in contract, strict liability, or tort (including
           negligence or otherwise) arising in any way out of the use of this software, even if
           advised of the possibility of such damage.

       By convention, the names of all DACS web services begin with the prefix "dacs_" (e.g.,
       dacs_conf). Starting with release 1.4.17, all commands that implement DACS functionality
       begin with the prefix "dacs" (e.g., dacsconf). Many DACS web services have command
       analogues. The names of web services that are used internally by DACS (i.e., they are
       never called directly by users) begin with "local_" (e.g., local_passwd_authenticate).
       General-purpose web services and commands do not follow a naming convention, other than
       not using any of the previously mentioned prefixes.

       The document type definitions (DTDs) that are maintained in the dtd-xsd directory are used
       to document file formats or describe the arguments to a DACS web service or its reply. In
       the current implementation, these DTD files are not used during XML validation. Attributes
       of type CDATA may have additional constraints on their values; consult the relevant
       documentation. The files are technically not valid DTDs, because they lack a document type
       declaration (DOCTYPE); an appropriate DOCTYPE is generated programmatically at the time a
       DTD is emitted.

           Important
           DACS does not prevent certain kinds of attacks against web sites, such as Denial of
           service attacks[7], Cross-site scripting (XSS)[8] or Cross-site request forgery
           (CSRF)[9]. When combined with appropriate web site protective measures, however, DACS
           does provide mechanisms to make these types of attacks more difficult.

   About the Manual Pages
       The technical documentation for DACS is provided as a set of manual pages. From XML source
       files, HTML, nroff/troff, and nroff output collections are generated during the
       installation procedure. In the HTML collection, an index page[10] includes a table of
       contents, links to special annotations within the technical documentation, and lists of
       variables, configuration directives, and XML Document Type Definitions.

           Tip
           Each HTML manual page contains a font size selection tool near its bottom. If
           JavaScript is enabled, the currently selected font size can be changed and a global
           preference set. To choose a font size for the current page, click on one of the four
           boxes. To make the current selection your preference across manual pages, site visits,
           and browser sessions, click on the "set" button, which will set an HTTP cookie. If a
           preference has not been set in this way (i.e., there is no cookie) and a manual page
           is visited with the query parameter DACSMANFONT set to 0, 1, 2, or 3 (representing
           smallest to largest point sizes), the corresponding font will be selected and the
           preference automatically set (if a preference has been set, the parameter is ignored).

           Tip
           The output of man(1)[11] for these manual pages is likely to contain ANSI escape
           sequences (e.g., for bold face mark up). For these pages to be rendered in a terminal
           window as intended, the pager used for this purpose may need to be given an
           appropriate flag, such as -R for less(1)[12].

       Areas of the documentation labeled "Security" discuss important security considerations;
       please pay special attention to them. Areas labeled "Tip" provide pointers to time-saving
       (and sometimes aggravation-reducing) techniques and recommended practices.

       In pathnames and URLs that appear in examples, the text "..." represents text that has
       been omitted because it is not relevant to the discussion at hand, or which may vary
       depending on configuration details, such as where something has been installed (e.g.,
       .../dacs/bin/dacshttp).

       Unless otherwise stated, URLs used in examples are fictitious and most likely will not
       work. The reserved domain name example.com is often used (RFC 2606[13]).

       In instructions and examples, a '%' is generally used to signify a command line prompt:

           % date
           Sun Apr  1 15:33:11 PDT 2007

       Sometimes another character is used to signify a prompt, however, such as when
       demonstrating the interactive mode of dacsexpr(1)[14]:

           > 1 + 1
           2

       An extended form of BNF notation[15] is used to describe syntax concisely. We hope it is
       both understandable and familiar, but some inconsistencies and ambiguities may occur
       throughout the documentation; this is being improved slowly. A term in a production may
       include a regular expression type specification, with '+' meaning one or more occurrences
       of the term, and '*' zero or more occurrences. Any one of a set of characters is specified
       within square brackets, and a range of consecutive characters (in ASCII code sequence) is
       separated by a hyphen (e.g., [A-Za-z0-9\-_]+ means "one or more alphabetic characters,
       digits, hyphens, or underscores"). In other contexts, square brackets indicate an optional
       term. Single and double quotes specify literal characters. Note that XML DTDs use their
       own syntax, which is somewhat different, and in some cases grammars followed in relevant
       RFCs are respected for clarity or in examples.

   Key Concepts
       Some of the key concepts used throughout the DACS documentation are defined in this
       section.

       account
           A record, usually persistent, that associates an identity (or username) with state
           information (such as whether authentication is enabled or disabled), information that
           is required to authenticate the identity (such as a digest of a password string), and
           possibly other sign-on related information.  DACS does not provide mechanisms to
           administer "foreign" account types. For instance, although it can authenticate against
           them, DACS cannot create, modify, delete, or list Unix or Windows accounts. Note that
           DACS identities do not necessarily have a corresponding account.

       authentication
           The procedure by which a person or program obtains credentials that represent a DACS
           identity, usually by asserting a DACS username that represents an identity and
           providing information that only that identity is likely to know or possess. After
           successful authentication, a person or program is said to have authenticated.  DACS
           can interface with a wide variety of authentication methods and provides some of its
           own; new methods can easily be added.

       authorization
           The procedure that determines, in a particular context, whether a request for a given
           resource or object should be allowed. If an identity is authorized to perform a
           certain operation on the object, access is granted, otherwise it is denied. Access
           control rules are one method of describing which identity or identities should be
           granted - or denied - access to a particular resource. Coarse-grained access control
           involves making a high-level decision of whether access to an object should be
           granted; this is usually an all-or-nothing decision. Fine-grained access control is
           used within a program to decide whether access to a lower-level resource (some data,
           an administrative function, a menu) should be granted.

           Note that unlike some systems, DACS does not predetermine which resources a particular
           user (identity) can and cannot access; that is, an administrator does not make a list
           of what rights each user has. Authorization is always determined by rule evaluation,
           in real time, when a user requests a resource. The only exemptions to this are some
           optional features: Authorization Caching[16] and Rlinks[17].

       credentials
           If authentication is successful, DACS returns information that can be used in
           subsequent operations to represent the authenticated identity. Credentials contain
           information about the identity, such as its name, and meta information, such as the
           time at which the credentials expire and become invalid. Credentials are protected
           cryptographically so that they are difficult to forge or alter. They must be kept
           secret, so that the identity cannot be used by anyone other than its owner, and must
           accompany a request made to a server so that DACS knows who is making the request. The
           particular mechanism used for this is not important provided credentials cannot be
           copied and reused; transporting credentials using the payload of an HTTP cookie over
           an SSL/TLS connection is typical, although sending credentials as the value of an HTTP
           extension header is another possibility.

           Although there is no specific limit on the size of credentials as far as DACS is
           concerned, since they can be encapsulated within an HTTP cookie and returned to a
           browser, constraints on cookies imposed by browsers should be carefully considered.

           Any jurisdiction can understand credentials produced by any other jurisdiction within
           the same federation. Therefore, a user only needs to be authenticated once to access
           web services at any jurisdiction using that identity.

           Note that in DACS, credentials do not give their owner any rights or convey any
           authorization; DACS is not a capability-based system[18]. Credentials simply represent
           a DACS identity.

           Refer to dacs_authenticate(8)[19] for details.

       current request
           The event that has triggered the authorization check being processed by
           dacs_acs(8)[20] is referred to as the current request. For a request for a
           DACS-wrapped web resource, this will be the HTTP request that is received by the web
           server for the resource. In situations where dacs_acs is not involved, such as when
           dacscheck(1)[21] or dacsexpr(1)[14] are used, the current request and its context are
           specified by command line arguments or are obtained from the execution
           environment[22].

           dacs_acs uses ${DACS::URI} as the path component of the current request. It is
           obtained from the uri element of the current request_rec within httpd. This is the
           string that is used to match against access control rules.

           Other DACS components determine the current HTTP request by examining several
           environment variables: HTTP_HOST (or SERVER_NAME and SERVER_PORT), REQUEST_URI,
           QUERY_STRING, and HTTPS.

           The value of ${DACS::URI} and the path component of ${Env::REQUEST_URI} are not
           necessarily the same. After an internal redirect, for example, the latter's value is
           from the original URL, while the former's is from the target of the redirection.

           The current request string is important because it may be used to determine the
           current federation[23] and current jurisdiction[24], and because it is used when
           searching for the access control rule to apply to the request.

       DACS
           Consisting of CGI-based web services, an Apache 2.2/2.4 module, and a collection of
           utilities, DACS provides authentication and authorization functionality. Transparent,
           coarse-grained attribute-based access control is available for web resources.

           Programmatic, general-purpose access control is available for virtually any program
           (using dacscheck(1)[21]). This is completely decoupled from Apache.

       DACS administrator
           An individual (or individuals) responsible for managing the operation of DACS is
           called a DACS administrator (sometimes just "the administrator"). This individual is
           not necessarily a system administrator (e.g., superuser or root), although a small
           number of optional components of DACS must execute as user or group root. The DACS
           administrator need not be an Apache administrator; once Apache has been configured for
           DACS it typically requires very few modifications thereafter. The DACS administrator
           is responsible for configuring and testing DACS (probably installing and upgrading it,
           too), managing user accounts and access control rules, safeguarding security, backing
           up configuration and data files, and so on. The design of DACS allows some delegation
           of responsibility, largely based on file permissions. When invoked as a web service,
           each of the identities configured as a ADMIN_IDENTITY[25] is effectively a DACS
           administrator; in this context, the system superuser has no significance.

       DACS identity
           Each authenticated user is assigned a name that consists of the name of the
           authenticating jurisdiction, its federation name, and a username. Each of these naming
           components must be syntactically correct. In some contexts the federation name is
           implicit; sometimes the jurisdiction name is also implicit. Entities such as
           individuals (people, but also programs, devices, etc.), federations, jurisdictions,
           and groups have names. It is the responsibility of jurisdictions to authenticate
           users. The syntax, meanings, and uniqueness of names is also a jurisdictional issue,
           and perhaps a federation-wide issue as well.

           Each real world entity typically has a unique DACS identity, but this is left up to
           authenticating jurisdictions. Two or more identities are distinct if they do not refer
           to the same real world individual.  Federated identity or single sign-on (SSO) is the
           ability to recognize a user identity across jurisdictions and even across federations.

               Important
               Keep in mind that regardless of the authentication method and account information
               used, two identical usernames (relative to the same jurisdiction and taking into
               account NAME_COMPARE[26]) are implicitly assumed to refer to the same identity by
               DACS. For instance, someone who authenticated as auggie by providing the correct
               Unix password is virtually indistinguishable from someone who authenticated as
               auggie using an Information Card. User credentials include information about the
               authentication method involved in their creation and the user()[27] function can
               be used to obtain this information, but it would be unwise to base identities on
               this. It is strongly advised that a new DACS jurisdiction carefully develop an
               extensible plan for user naming.

       DACS-wrapped
           A web resource is said to be DACS-wrapped if the web server responsible for the
           resource calls DACS (more specifically, dacs_acs(8)[20]) to make an access control
           decision whenever it receives a request for the resource.

       federation
           A DACS federation consists of one or more jurisdictions. The jurisdictions comprising
           a federation coordinate information sharing through light-weight business practices
           implemented as a requirement of membership in a DACS federation; in other words, the
           members of a federation typically agree to observe certain rules of conduct to
           preserve overall security and so that users can obtain maximum benefit. A federation
           consisting of just one jurisdiction is not unusual.

       item type
           An item type is a name that maps to a VFS[28] (virtual filestore) specification that
           configures how and where data is stored. The level of indirection that they provide
           means that access control rules, for example, can be configured to be in regular
           files, a Berkeley DB database, a remote database accessed by HTTP, and so on - all
           that is required is that the item type acls be properly configured. Some item types
           (like acls) are reserved and have special meaning to DACS, while others can be used by
           a DACS administrator for other purposes. An item type name is case sensitive and
           consists of alphanumerics, hyphens, and underscores, but must begin with an alphabetic
           character.

       jurisdiction
           A DACS jurisdiction is an autonomous administrative entity that authenticates its
           users, provides web services, or both. It may correspond to an organization,
           department, web server, or virtual host. Jurisdictions are sometimes created simply as
           an administrative convenience. Each jurisdiction is assigned a unique name within a
           federation.

           A user's home jurisdiction is a jurisdiction that can authenticate that user. In
           situations where a user has multiple credentials obtained from different
           jurisdictions, the effective home jurisdiction for a request depends on which
           credentials are selected during authorization processing. Configuration directives are
           available to restrict the number of sets of credentials that may accompany a request.

       user agent
           A user agent is client-side software that interacts with other software (a server
           application, typically) on behalf of a user. A user is often a person but can also be
           software. A web browser, which is used to interact with a web server, is an example of
           a user agent.

   Naming
       DACS needs to name a variety of things so that they can be referred to in expressions,
       access control rules, configuration directives, and so on. While the URI syntax is used to
       name some kinds of objects within DACS, DACS also has its own concise naming schemes.

           Note
           The terms current federation (current jurisdiction) and this federation (this
           jurisdiction) are used in the documentation to refer to the federation (jurisdiction)
           associated with the configuration context in effect while DACS processes a request.

           In general, the federation-name component of a name is optional; if absent, the
           current federation is assumed. Similarly, the jurisdiction-name may be elided and the
           current jurisdiction is implied.

       Federations
           Syntax:

               federation-name::

           Example:

               DEMO::

           The federation-name (usually obtained from a FEDERATION_NAME[29] configuration
           directive) must begin with an alphabetic character and is followed by zero or more
           alphanumerics, hyphens, and underscores. A federation-name is ordinarily treated case
           sensitively (but see the NAME_COMPARE[26] configuration directive and the user()[27]
           function for alternate behaviours). There is no a priori limit on its length.

           The FEDERATION_DOMAIN[30] directive specifies the domain name suffix common to all
           jurisdictions in a federation.

       Jurisdictions
           Syntax:

               [[federation-name:: | [::]] jurisdiction-name:

           Examples:

               DEMO::DSS:
               ::DSS:
               DSS:

           The jurisdiction-name (usually obtained from a JURISDICTION_NAME[31] configuration
           directive) must begin with an alphabetic character and is followed by zero or more
           alphanumerics, hyphens, and underscores. A jurisdiction-name is ordinarily treated
           case sensitively (but see the NAME_COMPARE[26] configuration directive and the
           user()[27] function for alternate behaviours). There is no a priori limit on its
           length.

       Users
           Syntax:

               [[[federation-name:: | [::]] jurisdiction-name]:username

           Examples:

               DEMO::DSS:auggie
               ::DSS:auggie
               DSS:auggie
               :auggie

           A full DACS identity includes a federation name component and a jurisdiction name
           component, in addition to the username. It is provided to DACS-wrapped programs as the
           value of the DACS_IDENTITY[32] environment variable.

           The username component, which is available to CGI programs as the value of the
           DACS_USERNAME[33] environment variable, consists of one or more ASCII characters from
           the set of upper and lower case alphabetics, digits, and the following punctuation
           characters:

               ! # $ % & ' - . ; ? @ [ ^ _ ` { }

           All characters having a value less than 041 (octal) or greater than 0176 (octal) are
           invalid, as are the following characters:

               * , : + ( ) ~ < > = | \ / "

               Notes
               •   In addition to the alphanumeric characters, RFC 2396[34] allows only the
                   following characters ("pchar") to appear in the path component of a URI:

                       - _ . ! ~ * ' ( ) % : @ & = + $ ,

               •   Some valid email addresses are not valid DACS usernames. For example,
                   *bob*@example.com, "(bob)"@example.com, and \(bob\)@example.com are valid
                   mailbox names as defined by RFC 822[35] (Appendix D) and discussed in RFC
                   3696[36] (Section 3), but both are invalid as DACS usernames. Unless quoted,
                   the local-part component of an email address, which precedes the "@" character
                   in the addr-spec, may not contain any of:

                       ( ) <  > @ , ; : \ " . [ ]

                   Additionally, the space and all US-ASCII control characters (octets 0 - 31)
                   and DEL (127) are disallowed. Without quotes, the local-part may consist of
                   any combination of alphabetics, digits, or any of the following characters:

                       ! # $ % & ' * + - / = ?  ^ _ ` . { | } ~

                   A period (".") may be used, but may not start or end the local-part, nor may
                   two or more consecutive periods appear. Within double quotes, any ASCII
                   character may appear if properly quoted (e.g., Auggie."
                   ".O."\'".Doggie@example.com). The maximum length of the local-part is 64
                   characters, and the maximum length of the domain component that appears after
                   the "@" character is 255 characters.

                   There is currently no way to "quote" a DACS username, so some safe encoding
                   method or transformation must be applied to these names.

               •   DACS may create identities for internal use having username components that
                   include characters that are normally invalid.

               •   A username is case sensitive (but see the NAME_COMPARE[26] configuration
                   directive and the user()[27] function for alternate behaviours). There is no a
                   priori limit on its length.

               •   The recommended practice is for jurisdictions to map their DACS usernames to
                   lower case during the authentication procedure where possible and when the
                   mappings are unique. The EXIT*[37] directive may be used for this purpose.

       Groups
           Syntax:

               [[federation-name:: | [::]] %[jurisdiction-name]:groupname

           A groupname must begin with an alphabetic character and may be followed by any number
           of alphanumeric, hyphen ("-"), and underscore ("_") characters.

           Examples:

               %DEMO::DSS:friends
               %::DSS:friends
               %DSS:friends
               %:friends

       Roles and Role Descriptors
           Syntax:

               Role-Descriptor -> Empty-String | Role-List

               Role-List       -> Role | Role "," Role-List

               Role            -> Basic-Role | Composite-Role

               Basic-Role      -> [A-Za-z0-9\-_]+
               Composite-Role  -> Basic-Role "/" Basic-Role | Basic-Role "/" Composite-Role

               Empty-String    -> ""

           A role descriptor string (also called a role string or a role descriptor) consists of
           a comma separated list of roles. The name of a role (a Basic-Role) is constructed from
           upper and lower case letters, digits, hyphens, and underscores. A Composite-Role is
           constructed from two or more Basic-Role terms, separated by a slash character. Here
           are three examples of a role descriptor:

               admin,wheel,root
               admin/hardware
               networks/programming,computer-science/systems/Project_X

               Note
               A role descriptor string contains no white space characters and may not begin or
               end with a comma or slash character. Two or more consecutive commas are illegal,
               as are two or more consecutive slashes.
           The setvar()[38] function can be used to separate a composite role into its basic
           roles.

           Please refer to dacs.groups(5)[39] for additional information.

       Concise User Syntax
           Syntax:

               ident     -> '{' kwv-list '}' | user
               kwv-list  -> kwv [',' kwv]*
               kwv       -> kwv-user | kwv-group | kwv-attr | kwv-ip | kwv-expires
               kwv-user    -> 'u=' [Q] user [Q]
               kwv-group   -> 'g=' [Q] groups [Q]
               kwv-attr    -> 'a=' [Q] attr [Q]
               kwv-expires -> 'e=' [Q] expires [Q]
               kwv-ip      -> 'ip=' [Q] ip-addr [Q]

               user      -> simple-name | DACS-identity
               groups    -> group [',' group]*
               group     -> groupname | role-descriptor
               attr      -> any-alphabetic
               ip-addr   -> any-IP-addr
               expires   -> +rel-secs | date

           where:

           •   Q is an optional (matched) quote character;

           •   whitespace may optionally precede most tokens;

           •   a DACS-identity is a full or abbreviated DACS identity[40]

           •   a simple-name is the username component of a DACS identity (i.e., without any
               colons); consequently in this context a "special" name, such as auth, is treated
               as :auth

           •   role-descriptor must be a valid DACS role string and groupname must be a valid
               DACS group name (see dacs_authenticate(8)[41] and dacs.groups(5)[42]);

           •   an IP address is expressed in the Internet standard numeric dot notation (e.g.,
               10.0.0.1); and

           •   the lifetime of credentials derived from the identity can be expressed either as a
               given number of seconds (e.g, "e=+3600") or a given date in one of the following
               formats (see strptime(3)[43]):

                   %a, %d-%b-%Y %H:%M:%S GMT
                   %d-%b-%Y
                   %b %d, %Y
                   %b %d
                   %Y-%m-%dT%H:%M:%SZ

               When necessary, dates are interpreted relative to the current time or date. The
               lifetime is converted to its canonical form, which is the absolute time and date
               in seconds since the Epoch, based on the jurisdiction's clock. A date in the past
               can be specified; this might be useful for testing, for instance. If the identity
               is not used to create credentials, the expiry date is ignored, although it must be
               syntactically correct.

           •   the only supported attribute value is "a", which means that the identity should be
               treated as an ADMIN_IDENTITY[25] (refer to the -admin flag of dacscheck(1)[21]).

           A name expressed in the concise syntax, gives a username and, optionally, roles and
           attributes for the identity. It is used by dacscheck(1)[21], for instance.

   The dacs Utility
       DACS utility commands are usually installed as separate binaries, but DACS can (also or
       instead) be built with most of them combined into a single binary that is installed as
       dacs. The various utility programs may then be run as:

           % dacs dacs-command [dacsoptions] [command-options]

       For example:

           % dacs license
           % dacs dacskey -u j1.example.com outfile
           % dacs checkdigest "pbkdf2[a=sha256,count=4098, dklen=20]"
           % dacs checkdigest 14

       Running the dacs utility without arguments will show the list of available sub-commands.

   Start-up Processing
       Most DACS programs perform the following actions when they start:

        1. Determine the "mode" in which they should operate; for example, if the REMOTE_ADDR
           environment variable is present, programs will in general assume they should run as a
           web application rather than as a utility command

        2. Process a standard set of command line arguments (dacsoptions[44])

        3. Set the process umask to 007 to disallow world access for any created files

        4. Disable a core dump so that sensitive information cannot be revealed by examining them
           (but see --enable-dump[45])

        5. Refuse to operate if any configuration file cannot be found or has an error

        6. For web services, make the DACS home directory the current working directory

        7. If "secure mode" has been enabled, web services will only process HTTPS requests

        8. Verify that the version required by a request is compatible with the version of DACS
           receiving the request

        9. Process any program-specific command line arguments.

       DACS programs make an effort to destroy sensitive information (such as passwords) as soon
       as it is no longer needed and not to write potentially sensitive information to log files
       unless specifically configured to do so.

   Internals
       Some DACS components may call other components using HTTP (possibly over SSL/TLS,
       depending on configuration). For example, authentication modules may be invoked as web
       services by dacs_authenticate(8)[41]. In all cases, these "internal" HTTP calls may not
       result in a redirection, such as through a 302 Found status code. Although this can
       sometimes be an inconvenience, it is, in part, a security measure.

           Tip
           When debugging a problem that may involve an internal HTTP request (especially related
           to authentication), verify that DACS is not receiving a redirect. Internal HTTP
           requests may also fail mysteriously because of incorrect or incomplete configuration
           of SSL/TLS parameters. Internal HTTP requests over SSL/TLS use sslclient(1)[4], as
           does the dacshttp(1)[3] command. If you suspect that an https-schemed URL may not be
           working, debug the problem using sslclient and then dacshttp.

       To maintain data consistency, DACS creates exclusive locks using the fcntl(2)[46] system
       call on files written in the directory configured through the TEMP_DIRECTORY[47]
       directive.

   Logging
       Most DACS services and utilities write various kinds of messages to one or more log files.
       These messages can be invaluable when trying to figure out what DACS is doing, for
       security audits, or to see which DACS-wrapped resources are being accessed and in what
       ways.

       Please refer to dacs.conf(5)[48] for information about configuration directives related to
       logging. An assortment of command line flags, described below, are also related to
       logging.

           NoteDACS can emit log messages before configuration processing is complete and
               configuration directives associated with logging are not in effect during this
               startup interval (see --enab le-hush-startup-logging[49]).

           •   Because mod_auth_dacs[2] is an Apache module, the Apache logging directives apply
               to it (and not the DACS directives) and its log messages are written to Apache log
               files.

           •   Log files can quickly become large, especially when the logging level is set to
               debug or trace levels. Consider daily rotation or truncation.

           •   The text of a log message may occasionally span several lines.

       The default value of the LOG_FORMAT[50] directive, which controls the appearance of log
       messages, is defined in include/local.h as LOG_FORMAT_DEFAULT_WEB for DACS web services
       and LOG_FORMAT_DEFAULT_CMD for everything else. Here is a typical log message:

           [Wed Jul 12 12:37:09 2006] [trace] [83648,1060,-] [dacs_acs:"acslib"] Allow
           clause grants access

       Audit-Class Log Messages
           In the case of audit-class messages, a string within parentheses may sometimes follow
           an identity, as in the examples below. This string, called a tracker, associates log
           messages with a particular origin and can be used to trace a user's sequence of
           service requests using log messages throughout a federation. This can be useful when
           debugging, looking for security problems, or forensic analysis.

           For an unauthenticated user, the tracker can only be derived heuristically, from
           elements of the execution context. The user's IP address, user agent string, and SSL
           client certificate, when available, are used. If two of these tracker strings differ,
           the requests are typically coming from different hosts, browsers, or users, but this
           is not necessarily always the case. Similarly, if the same tracker string is
           associated with two log messages, the service requests are not necessarily being
           issued by the same user.

           For an authenticated user, the tracker string consists of the heuristically-derived
           string, followed by a comma, followed by a string uniquely associated with the user's
           credentials. This tracker has a high probability of being unique and having a
           one-to-one mapping with a particular user.

           Consider these (condensed) log file entries:

               [Wed Jul 12 15:56:24 2006] [notice] [83963,1067,A] [dacs_acs:"authlib"]
                *** Access granted to unauthenticated user (7vJLWzv5) from 10.0.0.124
                for /cgi-bin/dacs/dacs_current_credentials

               [Wed Jul 12 15:56:27 2006] [notice] [83965,1073,A] [dacs_acs:"authlib"]
                *** Access granted to unauthenticated user (7vJLWzv5) from 10.0.0.124
                for /cgi-bin/dacs/dacs_authenticate

               [Wed Jul 12 15:56:27 2006] [debug] [83966,172,A] [dacs_authenticate:"authlib"]
                Authentication succeeded for HOME:bobo (7vJLWzv5,wA/Pudyp3f0)

               [Wed Jul 12 15:56:30 2006] [notice] [83973,1078,A] [dacs_acs:"authlib"]
                *** Access granted to DSS::HOME:bobo (7vJLWzv5,wA/Pudyp3f0)
                from 10.0.0.124 for /cgi-bin/dacs/dacs_current_credentials

           In the first two of the log messages above, the tracker 7vJLWzv5 appears, meaning that
           the two requests probably came from the same (unauthenticated) user. With the third
           log message, the user has been authenticated and the tracker 7vJLWzv5,wA/Pudyp3f0 is
           used. Because these trackers all share the same prefix, the first two requests
           probably also came from someone who authenticated as DSS::HOME:bobo. The last request,
           for /cgi-bin/dacs/dacs_current_credentials, definitely came from that user. If this
           user were to signout and then issue more service requests anywhere in the federation
           DSS, each log message would contain the tracker 7vJLWzv5.

               Security
               Tracking the requests of anonymous users reliably is difficult to do well. A
               cookie-based approach may do better in some situations but has its own drawbacks
               (such as being totally ineffective when the user has disabled cookies).

   Tracking User Activity
       DACS includes a feature, enabled as a build-time option (see dacs.install(7)[51]), whereby
       a jurisdiction can track the activity of all of its users (i.e., those users that
       authenticate at the jurisdiction). Each successful authentication event, explicit signout
       event, and user-submitted web service request event can be recorded at the user's home
       jurisdiction in the format defined by dacs_user_info.dtd[52]. This information can be
       valuable for better understanding what is happening throughout a federation, including
       helping to diagnose performance and security issues. It is the basis of features like
       displays of recent account activity, and it might also be used to create new capabilities,
       such as a concurrent login limit or an adaptive authentication component to implement
       layered authentication or risk-based authentication.

       To specify where and how a home jurisdiction should maintain these records, the user_info
       item type must be defined at that jurisdiction; if it is not defined, no records will be
       written at that jurisdiction, although the jurisdiction will still try to send event
       records to other jurisdictions. For maximum benefit, the feature should be enabled at all
       jurisdictions in a federation; all user activity throughout the federation can then be
       logged.

       If a jurisdiction wants to monitor the activity of its users at other jurisdictions, it
       must allow those jurisdictions to invoke its dacs_vfs(8)[53] service by adding an
       appropriate access control rule.

           Security
           It is critical for any such rule to require the dacs_admin()[54] predicate.

           Note
           •   Because the records are currently not keyed, at present only the file item type is
               supported for this purpose. A configuration directive similar to the following
               would be used:

                   VFS "[user_info]file://${Conf::FEDERATIONS_ROOT}/${Conf::FEDERATION_DOMAIN}/${Conf::JURISDICTION_NAME}/user_info"

           •   The dacs_admin(8)[55] tools provides an interface to these records. It should
               eventually be extended to collect and organize records found at all jurisdictions
               in a federation to facilitate analysis. Because they are text files with a
               relatively simple format, administrators should not find it difficult to apply
               common text processing tools or write short, custom programs for this purpose.
               Commands analogous to last(1)[56], who(1)[57], and sa(8)[58] are being considered.

           •   Each jurisdiction should write records to its own place (i.e., jurisdictions
               should not share the same VFS object for user_info).

           •   This database will grow indefinitely; an administrator is responsible for rotating
               or truncating it. If previous and active sign on information is important (see
               dacs_current_credentials(8)[59]), prune only the request records (i.e., the acs
               elements). Another acceptable method is to discard (or archive) some proportion of
               older records (say, half) and keep some of the newer records.

           •   The data format is subject to change.

           •   A directive to enable or disable this feature at run-time may be added.

           •   Internal administrative events are not recorded.

           •   Because signing off (via dacs_signout(8)[60]) is optional, the end of a session
               can sometimes only be inferred or approximated from the expiry of credentials or
               the time of the last recorded event.

OPTIONS

       DACS programs and web services get much of their run-time configuration information by
       reading configuration files and examining environment variables. Some configuration
       information can be provided at compile-time. Several command line flags may be used to
       override default behaviour.

           Note
           •   All dacsoptions flags are processed left-to-right and must appear before any
               command-specific flag or argument. The first flag or argument that is not
               recognized as one of the dacsoptions terminates the list.

           •   The most important dacsoptions are those that specify the location of
               configuration files and identify the jurisdiction section to use within a
               configuration file. Depending on the program and how it is used, configuration
               information may not be needed, may be optional, or may be required.

           •   At most one of the command line flags to select a jurisdiction section can be
               specified. Refer to dacs.conf(5)[48] for additional information on the
               configuration file and configuration processing.

       Many DACS utilities recognize the following standard options, which are called
       dacsoptions:

       -c dacs.conf
           This tells DACS where it can find a configuration file for the jurisdiction on whose
           behalf it is acting. If this argument is not present, depending on how it was built,
           DACS may either try to use a compile-time specified file or it will try to use the
           value of the environment variable DACS_CONF[61]. For details, refer to Locating
           dacs.conf and site.conf[62].

       -Dname=value
           The effect of this flag is to define variable name (which must be syntactically valid)
           in the DACS namespace to have the value value. Any quotes around value are retained,
           provided the shell has not already stripped them off. This flag may be repeated. These
           variables can subsequently be tested during configuration processing and rule
           processing; for example, the value of a configuration directive might depend on the
           value of a dacsoptions flag. Defining a name that happens to correspond to a
           dacsoptions flag has no effect other than to create the variable.

           All dacsoptions flags (excluding this one) are automatically added to the DACS
           namespace as they are processed. A flag that is a "singleton" (e.g., -q) is initially
           assigned a value of one and is incremented on each subsequent appearance. A flag of
           the form -flag value is equivalent to -D-flag=value. Unused flags are undefined; if -q
           is not given, ${DACS::-q} will not be defined. For those flags that have synonyms, a
           variable for each synonym is created. If the name is used, explicitly or implicitly,
           later values replace earlier ones.

           For example, if the dacsoptions are:

               -c www.example.com -v --verbose -Dfoo="baz" -ll debug -D-ll=trace

           then variables will be defined as follows:

               ${DACS::-c} is "www.example.com"
               ${DACS::-v} is "2"
               ${DACS::--verbose} is "2"
               ${DACS::foo} is "\"baz\""
               ${DACS::-ll} is "trace"

           The debugging level will be debug and not trace.

       --checkdigest digest-desc
           Validate the syntax of digest descriptor digest-desc, as it might appear as the value
           of the PASSWORD_DIGEST[63] directive. In addition to the digest name, the given
           argument names and values are checked. A numeric algorithm identifier can be given as
           a synonym for the algorithm name. The descriptor is printed in canonical form.

       --digests [digest-name]
           With no digest-name, list information about all available cryptographic digest
           algorithms, otherwise only digest-name. The information includes:

           •   the canonical name for the digest

           •   the digest's block size, in bytes ("bsize"),

           •   the digest size, in bytes ("dsize"),

           •   the internal password algorithm identifier ("alg", an unsigned integer), and

           •   its attributes: whether the algorithm can be used with PASSWORD_DIGEST[63]
               ("Password"), HMAC constructs ("HMAC"), digital signatures ("Sign"), scrypt
               ("scrypt"), PBKDF2 ("PBKDF2"), if it requires parameters ("Parameters"), whether
               it produces a variable-length digest ("Varlen"), and its implementation
               ("OpenSSL", "DACS", or "System").

           A digest size of zero also indicates that there is a variable-length output, which may
           depend on any of the arguments to the digest function. After printing to stdout, the
           program exits immediately. For convenience, --digest is a synonym.

       --dumpenv
           Print all environment variables to stdout and then exit immediately.

       --enable-dump
           By default, DACS web services and most commands disable core dump generation as a
           security precaution. Because a core dump can be useful when debugging, this flag
           allows it to be created. As programs that are allowed to produce a core dump must
           change to the DACS_HOME directory, core dumps will be written there. Use this flag
           with care.

       -format fmt
           The output format is set to fmt, which is one of the following keywords (case
           insensitive): file, html, json, php, plain, text, xml, xmldtd, xmlsimple, xmlschema,
           uri, or url. Not all output formats are supported by all programs. This flag overrides
           any FORMAT[64] argument to a web service, which in turn overrides a program's default
           format. The default format depends on the particular program and way it is invoked.
           For additional information, refer to the description of the FORMAT argument[64].

       -ll logging-level
           The logging level is set to log-level, which is one of the keywords recognized by the
           LOG_FILTER[65] directive.

       --license
           Print the license for DACS to stdout and then exit immediately.

       -q
           Be quiet. This is equivalent to setting the logging level to warn.

       -sc site.conf
           This tells DACS that it can find a configuration file for the jurisdiction on whose
           behalf it is acting. If this argument is not present, depending on how it was built,
           DACS may either try to use a compile-time specified file or it will try to use the
           value of the environment variable DACS_CONF[61]. For details, refer to Locating
           dacs.conf and site.conf[62].

       --std
           This flags the end of the common arguments. The next command line argument, if any, is
           specific to the program.

       -t
           Emit tracing information. This is equivalent to setting the logging level to trace.
           (Also see debug_dacs[66].)

       -u config-uri
           This instructs DACS to use config-uri to select the jurisdiction section to use in the
           configuration file. For details, refer to The Jurisdiction Section[67].

       -uj jurisdiction-name
           This instructs DACS to use the jurisdiction name jurisdiction-name to select the
           jurisdiction section to use in the configuration file. For details, refer to The
           Jurisdiction Section[67].

       -un
           This instructs DACS not to process site.conf or dacs.conf. This may only be used with
           a small number of commands, such as dacsacl(1)[68] and sslclient(1)[4].

       -up jurisdiction-name
           NOT IMPLEMENTED. This instructs DACS to use the jurisdiction name jurisdiction-name to
           select the jurisdiction section to use in the configuration file and tells it that the
           web server is acting as a forward proxy; that is, jurisdiction-name does not
           necessarily "own" the requested URL. For details, refer to The Jurisdiction
           Section[67].

       -us
           This instructs DACS to use the one-and-only jurisdiction section that appears in the
           configuration file. That is, the configuration file must contain exactly one
           jurisdiction section and that is the one that should be used. For details, refer to
           The Jurisdiction Section[67].

       -v
       --verbose
           Be more verbose, relative to the current logging level. This flag may be repeated.

       --version
           Print version information to stderr immediately and then exit. If the -v (--verbose)
           flag appeared earlier on the command line, also print version information for each
           DACS source code file used by this program that was compiled with a recognized
           revision identifier string. This information can be helpful when debugging suspected
           build problems.

               Note
               Complete version information is available only for statically linked programs.
               Also see dacsversion(1)[69] and dacs_version(8)[70].

           Tip
           If no command line flag is given to specify the jurisdiction section, the value of the
           environment variable DEFAULT_JURISDICTION will be used as if given with the -uj flag.
           This can be particularly useful when a host has only one jurisdiction configured
           because it makes it unnecessary to always specify the jurisdiction for DACS commands.

ENVIRONMENT

       SERVER_NAME, SERVER_PORT, REQUEST_URI
           May be used to determine the applicable jurisdiction.

FILES

       dacs.conf

       site.conf

SEE ALSO

       DACS manual pages[71], dacs_admin(8)[55], dacs.install(7)[6], dacs.readme(7)[5],
       dacs.services(8)[72]

NOTES

       Whether using DACS, Apache, or both for authentication and authorization, always test that
       resources are being protected according to your requirements. This is especially important
       when upgrading or reconfiguring DACS or Apache.

       Compatibility and interoperability with Apache authentication/authorization features and
       configuration may change as Apache evolves. For a particular set of DACS-wrapped resources
       (e.g., URLs in the scope of a given Location section), it is easiest, safest, and most
       predictable if as much as possible is delegated to DACS rather than combining DACS with
       Apache authentication/authorization modules and directives beyond the minimal
       configuration. Non-minimal combinations may cause DACS or Apache to function incorrectly,
       so they should be avoided or used with care. This is particularly important with respect
       to Apache 2.4, which has greatly expanded the number of directives associated with
       authentication and authorization.

BUGS

       There should be some assistance for administering user activity records[73].

AUTHOR

       Distributed Systems Software (www.dss.ca[74])

COPYING

       Copyright2003-2016 Distributed Systems Software. See the LICENSE[75] file that accompanies
       the distribution for licensing information.

NOTES

        1. dacsoptions
           http://dacs.dss.ca/man/dacs.1.html#dacsoptions

        2. mod_auth_dacs
           http://dacs.dss.ca/man/mod_auth_dacs.html

        3. dacshttp(1)
           http://dacs.dss.ca/man/dacshttp.1.html

        4. sslclient(1)
           http://dacs.dss.ca/man/sslclient.1.html

        5. dacs.readme(7)
           http://dacs.dss.ca/man/dacs.readme.7.html

        6. dacs.install(7)
           http://dacs.dss.ca/man/dacs.install.7.html

        7. Denial of service attacks
           http://en.wikipedia.org/wiki/Denial-of-service_attack

        8. Cross-site scripting (XSS)
           http://en.wikipedia.org/wiki/Cross-site_scripting

        9. Cross-site request forgery (CSRF)
           http://en.wikipedia.org/wiki/Cross-site_request_forgery

       10. index page
           http://dacs.dss.ca/man/index.html

       11. man(1)
           http://www.freebsd.org/cgi/man.cgi?query=man&apropos=0&sektion=1&manpath=FreeBSD+10.3-RELEASE&format=html

       12. less(1)
           http://www.freebsd.org/cgi/man.cgi?query=less&apropos=0&sektion=1&manpath=FreeBSD+10.3-RELEASE&format=html

       13. RFC 2606
           http://www.rfc-editor.org/rfc/rfc2606.txt

       14. dacsexpr(1)
           http://dacs.dss.ca/man/dacsexpr.1.html

       15. BNF notation
           http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form

       16. Authorization Caching
           http://dacs.dss.ca/man/dacs_acs.8.html#authorization_caching

       17. Rlinks
           http://dacs.dss.ca/man/dacs_acs.8.html#rlinks

       18. capability-based system
           http://en.wikipedia.org/wiki/Capabilities

       19. dacs_authenticate(8)
           http://dacs.dss.ca/man/dacs_authenticate.8.html#credentials

       20. dacs_acs(8)
           http://dacs.dss.ca/man/dacs_acs.8.html

       21. dacscheck(1)
           http://dacs.dss.ca/man/dacscheck.1.html

       22. execution environment
           http://www.freebsd.org/cgi/man.cgi?query=environ&apropos=0&sektion=7&manpath=FreeBSD+10.3-RELEASE&format=html

       23. current federation
           http://dacs.dss.ca/man/#current_federation

       24. current jurisdiction
           http://dacs.dss.ca/man/#current_jurisdiction

       25. ADMIN_IDENTITY
           http://dacs.dss.ca/man/dacs.conf.5.html#ADMIN_IDENTITY

       26. NAME_COMPARE
           http://dacs.dss.ca/man/dacs.conf.5.html#NAME_COMPARE

       27. user()
           http://dacs.dss.ca/man/dacs.exprs.5.html#user

       28. VFS
           http://dacs.dss.ca/man/dacs.conf.5.html#VFS

       29. FEDERATION_NAME
           http://dacs.dss.ca/man/dacs.conf.5.html#FEDERATION_NAME

       30. FEDERATION_DOMAIN
           http://dacs.dss.ca/man/dacs.conf.5.html#FEDERATION_DOMAIN

       31. JURISDICTION_NAME
           http://dacs.dss.ca/man/dacs.conf.5.html#JURISDICTION_NAME

       32. DACS_IDENTITY
           http://dacs.dss.ca/man/dacs_acs.8.html#var_env_dacs_identity

       33. DACS_USERNAME
           http://dacs.dss.ca/man/dacs_acs.8.html#var_env_dacs_username

       34. RFC 2396
           http://www.rfc-editor.org/rfc/rfc2396.txt

       35. RFC 822
           http://www.rfc-editor.org/rfc/rfc822.txt

       36. RFC 3696
           http://www.rfc-editor.org/rfc/rfc3696.txt

       37. EXIT*
           http://dacs.dss.ca/man/dacs_authenticate.8.html#auth_directive_index

       38. setvar()
           http://dacs.dss.ca/man/dacs.exprs.5.html#setvar

       39. dacs.groups(5)
           http://dacs.dss.ca/man/dacs.groups.5.html#roles

       40. DACS identity
           http://dacs.dss.ca/man/#dacs_identity

       41. dacs_authenticate(8)
           http://dacs.dss.ca/man/dacs_authenticate.8.html

       42. dacs.groups(5)
           http://dacs.dss.ca/man/dacs.groups.5.html

       43. strptime(3)
           http://www.freebsd.org/cgi/man.cgi?query=strptime&apropos=0&sektion=3&manpath=FreeBSD+10.3-RELEASE&format=html

       44. dacsoptions
           http://dacs.dss.ca/man/#dacsoptions

       45. --enable-dump
           http://dacs.dss.ca/man/#enable-dump-arg

       46. fcntl(2)
           http://www.freebsd.org/cgi/man.cgi?query=fcntl&apropos=0&sektion=2&manpath=FreeBSD+10.3-RELEASE&format=html

       47. TEMP_DIRECTORY
           http://dacs.dss.ca/man/dacs.conf.5.html#TEMP_DIRECTORY

       48. dacs.conf(5)
           http://dacs.dss.ca/man/dacs.conf.5.html

       49. --enab le-hush-startup-logging
           http://dacs.dss.ca/man/dacs.install.7.html#build_flag_--enable-hush-startup-logging

       50. LOG_FORMAT
           http://dacs.dss.ca/man/dacs.conf.5.html#LOG_FORMAT

       51. dacs.install(7)
           http://dacs.dss.ca/man/dacs.install.7.html#configure_options

       52. dacs_user_info.dtd
           http://dacs.dss.ca/man/../dtd-xsd/dacs_user_info.dtd

       53. dacs_vfs(8)
           http://dacs.dss.ca/man/dacs_vfs.8.html

       54. dacs_admin()
           http://dacs.dss.ca/man/dacs.exprs.5.html#DACS_ADMIN

       55. dacs_admin(8)
           http://dacs.dss.ca/man/dacs_admin.8.html

       56. last(1)
           http://www.freebsd.org/cgi/man.cgi?query=last&apropos=0&sektion=1&manpath=FreeBSD+10.3-RELEASE&format=html

       57. who(1)
           http://www.freebsd.org/cgi/man.cgi?query=who&apropos=0&sektion=1&manpath=FreeBSD+10.3-RELEASE&format=html

       58. sa(8)
           http://www.freebsd.org/cgi/man.cgi?query=sa&apropos=0&sektion=8&manpath=FreeBSD+10.3-RELEASE&format=html

       59. dacs_current_credentials(8)
           http://dacs.dss.ca/man/dacs_current_credentials.8.html

       60. dacs_signout(8)
           http://dacs.dss.ca/man/dacs_signout.8.html

       61. DACS_CONF
           http://dacs.dss.ca/man/dacs_acs.8.html#var_env_dacs_conf

       62. Locating dacs.conf and site.conf
           http://dacs.dss.ca/man/dacs.conf.5.html#locating_dacs.conf

       63. PASSWORD_DIGEST
           http://dacs.dss.ca/man/dacs.conf.5.html#PASSWORD_DIGEST

       64. FORMAT
           http://dacs.dss.ca/man/dacs.services.8.html#FORMAT

       65. LOG_FILTER
           http://dacs.dss.ca/man/dacs.conf.5.html#logging_levels

       66. debug_dacs
           http://dacs.dss.ca/man/dacs_acs.8.html#debug_dacs

       67. The Jurisdiction Section
           http://dacs.dss.ca/man/dacs.conf.5.html#jurisdiction_section

       68. dacsacl(1)
           http://dacs.dss.ca/man/dacsacl.1.html

       69. dacsversion(1)
           http://dacs.dss.ca/man/dacsversion.1.html

       70. dacs_version(8)
           http://dacs.dss.ca/man/dacs_version.8.html

       71. DACS manual pages
           http://dacs.dss.ca/man/../man/index.html

       72. dacs.services(8)
           http://dacs.dss.ca/man/dacs.services.8.html

       73. user activity records
           http://dacs.dss.ca/man/#tracking_user_activity

       74. www.dss.ca
           http://www.dss.ca

       75. LICENSE
           http://dacs.dss.ca/man/../misc/LICENSE