From: Todd C. Miller <Todd.Miller@courtesan.com>
Date: Sun, 20 Jan 2008 21:18:56 +0000 (+0000)
Subject: Reorganize the first section a bit.  Substitute the proper path for
X-Git-Tag: SUDO_1_7_0~216
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a48e85e1ab04aeeafd5ed7542863bbf7859e1cfe;p=sudo

Reorganize the first section a bit.  Substitute the proper path for
/etc/sudoers.
---

diff --git a/sudoers.ldap.cat b/sudoers.ldap.cat
index 590aecbd0..d650c33ec 100644
--- a/sudoers.ldap.cat
+++ b/sudoers.ldap.cat
@@ -15,17 +15,9 @@ DDEESSCCRRIIPPTTIIOONN
        Using LDAP for _s_u_d_o_e_r_s has several benefits:
 
        +o   ssuuddoo no longer needs to read _s_u_d_o_e_r_s in its entirety.
-           Parsing of _/_e_t_c_/_s_u_d_o_e_r_s requires the entire file to be
-           read.  When LDAP is used, there are only two or three
-           LDAP queries per invocation.  This makes it especially
-           fast and particularly usable in LDAP environments.
-           The first query is to parse global options (see
-           below).  The second is to match against the user's
-           name and the groups that the user belongs to.  (The
-           special ALL tag is matched in this query too.)  If no
-           match is returned for the user's name and groups, a
-           third query returns all entries contain user netgroups
-           and checks to see if the user belongs to any of them.
+           When LDAP is used, there are only two or three LDAP
+           queries per invocation.  This makes it especially fast
+           and particularly usable in LDAP environments.
 
        +o   ssuuddoo no longer exits if there is a typo in _s_u_d_o_e_r_s.
            It is not possible to load LDAP data into the server
@@ -34,23 +26,13 @@ DDEESSCCRRIIPPTTIIOONN
            typos in a user or host name, but this will not pre-
            vent ssuuddoo from running.
 
-       +o   Options inside of entries now override global default
-           options.  _/_e_t_c_/_s_u_d_o_e_r_s only supports default options
-           and limited options associated with user/host/commands
-           and aliases.  The syntax is complicated and can be
-           difficult for users to understand.
-
-           Sudo first looks for an entry called cn=default in the
-           SUDOers container.  If found, the multi-valued sudoOp-
-           tion attribute is parsed the same way the global
-           Defaults line in _/_e_t_c_/_s_u_d_o_e_r_s is parsed.
-
-           If, on the second or third query, a response contains
-           a sudoRole which matches against the user, host, and
-           command, then the matched object is scanned for a
-           additional options that override the top-level
-           defaults.  See the example LDAP content below for more
-           information.
+       +o   It is possible to specify per-entry options that over-
+           ride the global default options.  _/_e_t_c_/_s_u_d_o_e_r_s only
+           supports default options and limited options associ-
+           ated with user/host/commands/aliases.  The syntax is
+           complicated and can be difficult for users to under-
+           stand.  Placing the options directly in the entry is
+           more natural.
 
        +o   vviissuuddoo is no longer needed.  vviissuuddoo provides locking
            and syntax checking of the _/_e_t_c_/_s_u_d_o_e_r_s file.  Since
@@ -59,35 +41,34 @@ DDEESSCCRRIIPPTTIIOONN
            inserted into LDAP, there is no need for a specialized
            tool to check syntax.
 
+       Another major difference between LDAP and file-based _s_u_d_o_-
+       _e_r_s is that in LDAP, ssuuddoo-specific Aliases are not sup-
+       ported.
 
+       For the most part, there is really no need for ssuuddoo-spe-
+       cific Aliases.  Unix groups or user netgroups can be used
+       in place of User_Aliases and RunasAliases.  Host netgroups
+       can be used in place of HostAliases.  Since Unix groups
+       and netgroups can also be stored in LDAP there is no real
+       need for ssuuddoo-specific aliases.
+
+       Cmnd_Aliases are not really required either since it is
+       possible to have multiple users listed in a sudoRole.
+       Instead of defining a Cmnd_Alias that is referenced by
+       multiple users, one can create a sudoRole that contains
+       the commands and assign multiple users to it.
 
-1.7                      January 20, 2008                       1
 
 
 
+1.7                      January 20, 2008                       1
 
 
-SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 
 
-       +o   Aliases are no longer needed.  User, Host, and Cmnd
-           Aliases were designed to simplify organization of
-           _s_u_d_o_e_r_s files and to improve readability.  Since an
-           LDAP _s_u_d_o_e_r_s entry allows multiple values for each of
-           its attributes, and since most LDAP browsers are
-           graphical and easy to work with, these aliases are no
-           longer needed.
 
-           If you wish to specify a large number of users into an
-           entry or wish to have similar entries with identical
-           users, then either use groups or user netgroups.
-           Alternately, they can all just be pasted into the LDAP
-           record.
+SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 
-           If you need to specify a large number of hosts in an
-           entry, use netgroups or IP address matches
-           (10.2.3.4/255.255.0.0).  Alternately, they can all
-           just be pasted into the LDAP record.
 
        SSUUDDOOeerrss LLDDAAPP ccoonnttaaiinneerr
 
@@ -111,52 +92,57 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
        The equivalent of a sudoer in LDAP is a sudoRole.  It con-
        sists of the following components:
 
-       sudoUser
+       ssuuddooUUsseerr
            A user name, uid (prefixed with '#'), Unix group (pre-
            fixed with a '%') or user netgroup (prefixed with a
            '+').
 
-       sudoHost
+       ssuuddooHHoosstt
            A host name, IP address, IP network, or host netgroup
            (prefixed with a '+').  The special value ALL will
            match any host.
 
-       sudoCommand
+       ssuuddooCCoommmmaanndd
            A Unix command with optional command line arguments,
            potentially including globbing characters (aka wild
+           cards).  The special value ALL will match any command.
+           If a command is prefixed with an exclamation point
+           '!', the user will be prohibited from running that
+           command.
 
+       ssuuddooOOppttiioonn
+           Identical in function to the global options described
+           above, but specific to the sudoRole in which it
+           resides.
 
+       ssuuddooRRuunnAAssUUsseerr
+           A user name or uid (prefixed with '#') that commands
+           may be run as or a Unix group (prefixed with a '%') or
+           user netgroup (prefixed with a '+') that contains a
+           list of users that commands may be run as.  The spe-
+           cial value ALL will match any user.
 
-1.7                      January 20, 2008                       2
+       ssuuddooRRuunnAAssGGrroouupp
+           A Unix group or gid (prefixed with '#') that commands
 
 
 
+1.7                      January 20, 2008                       2
 
 
-SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 
 
-           cards).  The special value ALL will match any command.
 
-       sudoOption
-           Similar to the global options described above, but
-           specific to the sudoRole in which it resides.
+SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 
-       sudoRunAsUser
-           A user name or uid (prefixed with '#') that commands
-           may be run as or a Unix group (prefixed with a '%') or
-           user netgroup (prefixed with a '+') that contains a
-           list of users that commands may be run as.  The spe-
-           cial value ALL will match any user.
 
-       sudoRunAsGroup
-           A Unix group or gid (prefixed with '#') that commands
            may be run as.  The special value ALL will match any
            group.
 
-       Each entry listed above contains a single value, but may
-       be repeated multiple times.  A sudoRole must contain at
-       least one sudoUser, sudoHost and sudoCommand.
+       Each component listed above should contain a single value,
+       but there may be multiple instances of each component
+       type.  A sudoRole must contain at least one sudoUser,
+       sudoHost and sudoCommand.
 
        The following example allows users in group wheel to run
        any command on any host via ssuuddoo:
@@ -169,16 +155,27 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
            sudoHost: ALL
            sudoCommand: ALL
 
+       AAnnaattoommyy ooff LLDDAAPP ssuuddooeerrss llooookkuupp
+
+       When looking up a sudoer using LDAP there are only two or
+       three LDAP queries per invocation.  The first query is to
+       parse the global options.  The second is to match against
+       the user's name and the groups that the user belongs to.
+       (The special ALL tag is matched in this query too.)  If no
+       match is returned for the user's name and groups, a third
+       query returns all entries containing user netgroups and
+       checks to see if the user belongs to any of them.
+
        DDiiffffeerreenncceess bbeettwweeeenn LLDDAAPP aanndd nnoonn--LLDDAAPP ssuuddooeerrss
 
        There are some subtle differences in the way sudoers is
        handled once in LDAP.  Probably the biggest is that
-       according to the RFC, LDAP's ordering is arbitrary and you
+       according to the RFC, LDAP ordering is arbitrary and you
        cannot expect that Attributes and Entries are returned in
-       any order.  If there are conflicting command rules on an
-       entry, the negative takes precedence.  This is called
-       paranoid behavior (not necessarily the most specific
-       match).
+       any specific order.  If there are conflicting command
+       rules on an entry, the negative takes precedence.  This is
+       called paranoid behavior (not necessarily the most spe-
+       cific match).
 
        Here is an example:
 
@@ -193,6 +190,9 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 
 
 
+
+
+
 1.7                      January 20, 2008                       3
 
 
@@ -202,7 +202,7 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 
 
-           # LDAP equivalent of Johnny
+           # LDAP equivalent of johnny
            # Allows all commands except shell
            dn: cn=role1,ou=Sudoers,dc=my-domain,dc=com
            objectClass: sudoRole
@@ -213,7 +213,7 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
            sudoCommand: ALL
            sudoCommand: !/bin/sh
 
-           # LDAP equivalent of Puddles
+           # LDAP equivalent of puddles
            # Notice that even though ALL comes last, it still behaves like
            # role1 since the LDAP code assumes the more paranoid configuration
            dn: cn=role2,ou=Sudoers,dc=my-domain,dc=com
@@ -227,7 +227,7 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 
        Another difference is that negations on the Host, User or
        Runas are currently ignorred.  For example, the following
-       attributes do not do what they might appear to do.
+       attributes do not behave the way one might expect.
 
            # does not match all but joe
            # rather, does not match anyone
@@ -286,7 +286,7 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
        options are listed below in upper case but are parsed in a
        case-independent manner.
 
-       URI ldap[s]://[hostname[:port]] ...
+       UURRII ldap[s]://[hostname[:port]] ...
            Specifies a whitespace-delimited list of one or more
            URIs describing the LDAP server(s) to connect to.  The
            _p_r_o_t_o_c_o_l may be either llddaapp or llddaappss, the latter being
@@ -299,7 +299,7 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
            libraries used on most commercial versions of Unix are
            only capable of supporting one or the other.
 
-       HOST name[:port] ...
+       HHOOSSTT name[:port] ...
            If no UURRII is specified, the HHOOSSTT parameter specifies a
            whitespace-delimited list of LDAP servers to connect
            to.  Each host may include an optional _p_o_r_t separated
@@ -307,7 +307,7 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
            favor of the UURRII specification and is included for
            backwards compatibility.
 
-       PORT port_number
+       PPOORRTT port_number
            If no UURRII is specified, the PPOORRTT parameter specifies
            the default port to connect to on the LDAP server if a
            HHOOSSTT parameter does not specify the port itself.  If
@@ -316,7 +316,7 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
            parameter is deprecated in favor of the UURRII specifica-
            tion and is included for backwards compatibility.
 
-       BIND_TIMELIMIT seconds
+       BBIINNDD__TTIIMMEELLIIMMIITT seconds
            The BBIINNDD__TTIIMMEELLIIMMIITT parameter specifies the amount of
            time, in seconds, to wait while trying to connect to
            an LDAP server.  If multiple UURRIIs or HHOOSSTTs are speci-
@@ -334,16 +334,16 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 
 
-       TIMELIMIT seconds
+       TTIIMMEELLIIMMIITT seconds
            The TTIIMMEELLIIMMIITT parameter specifies the amount of time,
            in seconds, to wait for a response to an LDAP query.
 
-       SUDOERS_BASE base
+       SSUUDDOOEERRSS__BBAASSEE base
            The base DN to use when performing ssuuddoo LDAP queries.
            Typically this is of the form ou=SUDOers,dc=exam-
            ple,dc=com for the domain example.com.
 
-       SUDOERS_DEBUG debug_level
+       SSUUDDOOEERRSS__DDEEBBUUGG debug_level
            This sets the debug level for ssuuddoo LDAP queries.
            Debugging information is printed to the standard
            error.  A value of 1 results in a moderate amount of
@@ -352,7 +352,7 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
            be set in a production environment as the extra infor-
            mation is likely to confuse users.
 
-       BINDDN DN
+       BBIINNDDDDNN DN
            The BBIINNDDDDNN parameter specifies the identity, in the
            form of a Distinguished Name (DN), to use when per-
            forming LDAP operations.  If not specified, LDAP oper-
@@ -360,12 +360,12 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
            default, most LDAP servers will allow anonymous
            access.
 
-       BINDPW secret
+       BBIINNDDPPWW secret
            The BBIINNDDPPWW parameter specifies the password to use
            when performing LDAP operations.  This is typically
            used in conjunction with the BBIINNDDDDNN parameter.
 
-       ROOTBINDDN DN
+       RROOOOTTBBIINNDDDDNN DN
            The RROOOOTTBBIINNDDDDNN parameter specifies the identity, in
            the form of a Distinguished Name (DN), to use when
            performing privileged LDAP operations, such as _s_u_d_o_e_r_s
@@ -373,18 +373,18 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
            should be stored in _/_e_t_c_/_l_d_a_p_._s_e_c_r_e_t.  If not speci-
            fied, the BBIINNDDDDNN identity is used (if any).
 
-       LDAP_VERSION number
+       LLDDAAPP__VVEERRSSIIOONN number
            The version of the LDAP protocol to use when connect-
            ing to the server.  The default value is protocol ver-
            sion 3.
 
-       SSL on/true/yes/off/false/no
+       SSSSLL on/true/yes/off/false/no
            If the SSSSLL parameter is set to on, true or yes, TLS
            (SSL) encryption is always used when communicating
            with the LDAP server.  Typically, this involves con-
            necting to the server on port 636 (ldaps).
 
-       SSL start_tls
+       SSSSLL start_tls
            If the SSSSLL parameter is set to start_tls, the LDAP
            server connection is initiated normally and TLS
            encryption is begun before the bind credentials are
@@ -405,7 +405,7 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
            ter is only supported by LDAP servers that honor the
            start_tls extension, such as the OpenLDAP server.
 
-       TLS_CHECKPEER on/true/yes/off/false/no
+       TTLLSS__CCHHEECCKKPPEEEERR on/true/yes/off/false/no
            If enabled, TTLLSS__CCHHEECCKKPPEEEERR will cause the LDAP server's
            TLS certificated to be verified.  If the server's TLS
            certificate cannot be verified (usually because it is
@@ -413,14 +413,14 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
            be unable to connect to it.  If TTLLSS__CCHHEECCKKPPEEEERR is dis-
            abled, no check is made.
 
-       TLS_CACERTFILE file name
+       TTLLSS__CCAACCEERRTTFFIILLEE file name
            The path to a certificate authority bundle which con-
            tains the certificates for all the Certificate Author-
            ities the client knows to be valid, e.g.
            _/_e_t_c_/_s_s_l_/_c_a_-_b_u_n_d_l_e_._p_e_m.  This option is only supported
            by the OpenLDAP libraries.
 
-       TLS_CACERTDIR directory
+       TTLLSS__CCAACCEERRTTDDIIRR directory
            Similar to TTLLSS__CCAACCEERRTTFFIILLEE but instead of a file, it is
            a directory containing individual Certificate Author-
            ity certificates, e.g. _/_e_t_c_/_s_s_l_/_c_e_r_t_s.  The directory
@@ -428,32 +428,32 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
            EERRTTFFIILLEE.  This option is only supported by the OpenL-
            DAP libraries.
 
-       TLS_CERT file name
+       TTLLSS__CCEERRTT file name
            The path to a file containing the client certificate
            which can be used to authenticate the client to the
-           LDAP server.
+           LDAP server.  The certificate type depends on the LDAP
+           libraries used.
 
-           OpenLDAP          tls_cert /etc/ssl/client_cert.pem
+           OpenLDAP:
+               tls_cert /etc/ssl/client_cert.pem
 
-           Netscape-derived  tls_cert /var/ldap/cert7.db
+           Netscape-derived:
+               tls_cert /var/ldap/cert7.db
 
            When using Netscape-derived libraries, this file may
            also contain Certificate Authority certificates.
 
-       TLS_KEY file name
+       TTLLSS__KKEEYY file name
            The path to a file containing the private key which
            matches the certificate specified by TTLLSS__CCEERRTT.  The
-           private key must not be password-protected.
+           private key must not be password-protected.  The key
+           type depends on the LDAP libraries used.
 
-           OpenLDAP          tls_cert /etc/ssl/client_key.pem
+           OpenLDAP:
+               tls_cert /etc/ssl/client_key.pem
 
-           Netscape-derived  tls_cert /var/ldap/key3.db
-
-       TLS_RANDFILE file name
-           The TTLLSS__RRAANNDDFFIILLEE parameter specifies the path to an
-           entropy source for systems that lack a random device.
-           It is generally used in conjunction with _p_r_n_g_d or _e_g_d.
-           This option is only supported by the OpenLDAP
+           Netscape-derived:
+               tls_cert /var/ldap/key3.db
 
 
 
@@ -466,38 +466,43 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 
 
+       TTLLSS__RRAANNDDFFIILLEE file name
+           The TTLLSS__RRAANNDDFFIILLEE parameter specifies the path to an
+           entropy source for systems that lack a random device.
+           It is generally used in conjunction with _p_r_n_g_d or _e_g_d.
+           This option is only supported by the OpenLDAP
            libraries.
 
-       TLS_CIPHERS cipher list
+       TTLLSS__CCIIPPHHEERRSS cipher list
            The TTLLSS__CCIIPPHHEERRSS parameter allows the administer to
            restrict which encryption algorithms may be used for
            TLS (SSL) connections.  See the OpenSSL manual for a
            list of valid ciphers.  This option is only supported
            by the OpenLDAP libraries.
 
-       USE_SASL on/true/yes/off/false/no
+       UUSSEE__SSAASSLL on/true/yes/off/false/no
            Enable UUSSEE__SSAASSLL for LDAP servers that support SASL
            authentication.
 
-       SASL_AUTH_ID identity
+       SSAASSLL__AAUUTTHH__IIDD identity
            The SASL user name to use when connecting to the LDAP
            server.  By default, ssuuddoo will use an anonymous con-
            nection.
 
-       ROOTUSE_SASL on/true/yes/off/false/no
+       RROOOOTTUUSSEE__SSAASSLL on/true/yes/off/false/no
            Enable RROOOOTTUUSSEE__SSAASSLL to enable SASL authentication when
            connecting to an LDAP server from a privileged pro-
            cess, such as ssuuddoo.
 
-       ROOTSASL_AUTH_ID identity
+       RROOOOTTSSAASSLL__AAUUTTHH__IIDD identity
            The SASL user name to use when RROOOOTTUUSSEE__SSAASSLL is
            enabled.
 
-       SASL_SECPROPS none/properties
+       SSAASSLL__SSEECCPPRROOPPSS none/properties
            SASL security properties or _n_o_n_e for no properties.
            See the SASL programmer's manual for details.
 
-       KRB5_CCNAME file name
+       KKRRBB55__CCCCNNAAMMEE file name
            The path to the Kerberos 5 credential cache to use
            when authenticating with the remote server.
 
@@ -514,12 +519,7 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 
        The following sources are recognized:
 
-           files       read sudoers from a file (usually F</etc/sudoers>)
-           ldap        read sudoers from LDAP
 
-       In addition, the entry [NOTFOUND=return] will short-cir-
-       cuit the search if the user was not found in the preceding
-       source.
 
 
 
@@ -532,6 +532,13 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 
 
+           files       read sudoers from F</etc/sudoers>
+           ldap        read sudoers from LDAP
+
+       In addition, the entry [NOTFOUND=return] will short-cir-
+       cuit the search if the user was not found in the preceding
+       source.
+
        To consult LDAP first followed by the local sudoers file
        (if it exists), use:
 
@@ -574,13 +581,6 @@ EEXXAAMMPPLLEESS
 
 
 
-
-
-
-
-
-
-
 
 
 
@@ -803,10 +803,14 @@ SUDOERS.LDAP(4)        MAINTENANCE COMMANDS       SUDOERS.LDAP(4)
 
 
 SSEEEE AALLSSOO
-       _l_d_a_p_._c_o_n_f(4), _s_u_d_o_e_r_s(4)
+       _l_d_a_p_._c_o_n_f(4), _s_u_d_o_e_r_s(5)
 
 CCAAVVEEAATTSS
-       parsing differences between LDAP and file sudoers
+       The way that _s_u_d_o_e_r_s is parsed differs between Note that
+       there are differences in the way that LDAP-based _s_u_d_o_e_r_s
+       is parsed compared to file-based _s_u_d_o_e_r_s.  See the "Dif-
+       ferences between LDAP and non-LDAP sudoers" section for
+       more information.
 
 BBUUGGSS
        If you feel you have found a bug in ssuuddoo, please submit a
@@ -844,10 +848,6 @@ DDIISSCCLLAAIIMMEERR
 
 
 
-
-
-
-
 
 
 
diff --git a/sudoers.ldap.man.in b/sudoers.ldap.man.in
index d1952a680..a9ba18438 100644
--- a/sudoers.ldap.man.in
+++ b/sudoers.ldap.man.in
@@ -157,16 +157,10 @@ in a large, distributed environment.
 .PP
 Using \s-1LDAP\s0 for \fIsudoers\fR has several benefits:
 .IP "\(bu" 4
-\&\fBsudo\fR no longer needs to read \fIsudoers\fR in its entirety.  Parsing
-of \fI/etc/sudoers\fR requires the entire file to be read.  When \s-1LDAP\s0
-is used, there are only two or three \s-1LDAP\s0 queries per invocation.
+\&\fBsudo\fR no longer needs to read \fIsudoers\fR in its entirety.  When
+\&\s-1LDAP\s0 is used, there are only two or three \s-1LDAP\s0 queries per invocation.
 This makes it especially fast and particularly usable in \s-1LDAP\s0
-environments.  The first query is to parse global options (see
-below).  The second is to match against the user's name and the
-groups that the user belongs to.  (The special \s-1ALL\s0 tag is matched
-in this query too.)  If no match is returned for the user's name
-and groups, a third query returns all entries contain user netgroups
-and checks to see if the user belongs to any of them.
+environments.
 .IP "\(bu" 4
 \&\fBsudo\fR no longer exits if there is a typo in \fIsudoers\fR.
 It is not possible to load \s-1LDAP\s0 data into the server that does
@@ -174,42 +168,32 @@ not conform to the sudoers schema, so proper syntax is guaranteed.
 It is still possible to have typos in a user or host name, but
 this will not prevent \fBsudo\fR from running.
 .IP "\(bu" 4
-Options inside of entries now override global default options.
-\&\fI/etc/sudoers\fR only supports default options and limited options
-associated with user/host/commands and aliases.  The syntax is
-complicated and can be difficult for users to understand.
-.Sp
-Sudo first looks for an entry called \f(CW\*(C`cn=default\*(C'\fR in the \f(CW\*(C`SUDOers\*(C'\fR
-container.  If found, the multi-valued \f(CW\*(C`sudoOption\*(C'\fR attribute is
-parsed the same way the global \f(CW\*(C`Defaults\*(C'\fR line in \fI/etc/sudoers\fR
-is parsed.
-.Sp
-If, on the second or third query, a response contains a sudoRole
-which matches against the user, host, and command, then the matched
-object is scanned for a additional options that override the top-level
-defaults.  See the example \s-1LDAP\s0 content below for more information.
+It is possible to specify per-entry options that override the global
+default options.  \fI@sysconfdir@/sudoers\fR only supports default options and
+limited options associated with user/host/commands/aliases.  The
+syntax is complicated and can be difficult for users to understand.
+Placing the options directly in the entry is more natural.
 .IP "\(bu" 4
 \&\fBvisudo\fR is no longer needed.  \fBvisudo\fR provides locking and
-syntax checking of the \fI/etc/sudoers\fR file.  Since \s-1LDAP\s0 updates
+syntax checking of the \fI@sysconfdir@/sudoers\fR file.  Since \s-1LDAP\s0 updates
 are atomic, locking is no longer necessary.  Because syntax is
 checked when the data is inserted into \s-1LDAP\s0, there is no need
 for a specialized tool to check syntax.
-.IP "\(bu" 4
-Aliases are no longer needed.  User, Host, and Cmnd Aliases were
-designed to simplify organization of \fIsudoers\fR files and to
-improve readability.  Since an \s-1LDAP\s0 \fIsudoers\fR entry allows multiple
-values for each of its attributes, and since most \s-1LDAP\s0 browsers are
-graphical and easy to work with, these aliases are no longer
-needed.
-.Sp
-If you wish to specify a large number of users into an entry or
-wish to have similar entries with identical users, then either use
-groups or user netgroups.  Alternately, they can all just be pasted
-into the \s-1LDAP\s0 record.
-.Sp
-If you need to specify a large number of hosts in an entry, use
-netgroups or \s-1IP\s0 address matches (10.2.3.4/255.255.0.0).  Alternately,
-they can all just be pasted into the \s-1LDAP\s0 record.
+.PP
+Another major difference between \s-1LDAP\s0 and file-based \fIsudoers\fR
+is that in \s-1LDAP\s0, \fBsudo\fR\-specific Aliases are not supported.
+.PP
+For the most part, there is really no need for \fBsudo\fR\-specific
+Aliases.  Unix groups or user netgroups can be used in place of
+User_Aliases and RunasAliases.  Host netgroups can be used in place
+of HostAliases.  Since Unix groups and netgroups can also be stored
+in \s-1LDAP\s0 there is no real need for \fBsudo\fR\-specific aliases.
+.PP
+Cmnd_Aliases are not really required either since it is possible
+to have multiple users listed in a sudoRole.  Instead of defining
+a Cmnd_Alias that is referenced by multiple users, one can create
+a sudoRole that contains the commands and assign multiple users
+to it.
 .Sh "SUDOers \s-1LDAP\s0 container"
 .IX Subsection "SUDOers LDAP container"
 The \fIsudoers\fR configuration is contained in the \f(CW\*(C`ou=SUDOers\*(C'\fR \s-1LDAP\s0
@@ -217,7 +201,7 @@ container.
 .PP
 Sudo first looks for the \f(CW\*(C`cn=default\*(C'\fR entry in the SUDOers container.
 If found, the multi-valued \f(CW\*(C`sudoOption\*(C'\fR attribute is parsed in the
-same manner as a global \f(CW\*(C`Defaults\*(C'\fR line in \fI/etc/sudoers\fR.  In
+same manner as a global \f(CW\*(C`Defaults\*(C'\fR line in \fI@sysconfdir@/sudoers\fR.  In
 the following example, the \f(CW\*(C`SSH_AUTH_SOCK\*(C'\fR variable will be preserved
 in the environment for all users.
 .PP
@@ -232,39 +216,41 @@ in the environment for all users.
 .PP
 The equivalent of a sudoer in \s-1LDAP\s0 is a \f(CW\*(C`sudoRole\*(C'\fR.  It consists of
 the following components:
-.IP "sudoUser" 4
+.IP "\fBsudoUser\fR" 4
 .IX Item "sudoUser"
 A user name, uid (prefixed with \f(CW'#'\fR), Unix group (prefixed with
 a \f(CW'%'\fR) or user netgroup (prefixed with a \f(CW'+'\fR).
-.IP "sudoHost" 4
+.IP "\fBsudoHost\fR" 4
 .IX Item "sudoHost"
 A host name, \s-1IP\s0 address, \s-1IP\s0 network, or host netgroup (prefixed
 with a \f(CW'+'\fR).
 The special value \f(CW\*(C`ALL\*(C'\fR will match any host.
-.IP "sudoCommand" 4
+.IP "\fBsudoCommand\fR" 4
 .IX Item "sudoCommand"
 A Unix command with optional command line arguments, potentially
 including globbing characters (aka wild cards).
 The special value \f(CW\*(C`ALL\*(C'\fR will match any command.
-.IP "sudoOption" 4
+If a command is prefixed with an exclamation point \f(CW'!'\fR, the
+user will be prohibited from running that command.
+.IP "\fBsudoOption\fR" 4
 .IX Item "sudoOption"
-Similar to the global options described above, but specific to the
-\&\f(CW\*(C`sudoRole\*(C'\fR in which it resides.
-.IP "sudoRunAsUser" 4
+Identical in function to the global options described above, but
+specific to the \f(CW\*(C`sudoRole\*(C'\fR in which it resides.
+.IP "\fBsudoRunAsUser\fR" 4
 .IX Item "sudoRunAsUser"
 A user name or uid (prefixed with \f(CW'#'\fR) that commands may be run
 as or a Unix group (prefixed with a \f(CW'%'\fR) or user netgroup (prefixed
 with a \f(CW'+'\fR) that contains a list of users that commands may be
 run as.
 The special value \f(CW\*(C`ALL\*(C'\fR will match any user.
-.IP "sudoRunAsGroup" 4
+.IP "\fBsudoRunAsGroup\fR" 4
 .IX Item "sudoRunAsGroup"
 A Unix group or gid (prefixed with \f(CW'#'\fR) that commands may be run as.
 The special value \f(CW\*(C`ALL\*(C'\fR will match any group.
 .PP
-Each entry listed above contains a single value, but may be repeated
-multiple times.  A sudoRole must contain at least one \f(CW\*(C`sudoUser\*(C'\fR,
-\&\f(CW\*(C`sudoHost\*(C'\fR and \f(CW\*(C`sudoCommand\*(C'\fR.
+Each component listed above should contain a single value, but there
+may be multiple instances of each component type.  A sudoRole must
+contain at least one \f(CW\*(C`sudoUser\*(C'\fR, \f(CW\*(C`sudoHost\*(C'\fR and \f(CW\*(C`sudoCommand\*(C'\fR.
 .PP
 The following example allows users in group wheel to run any command
 on any host via \fBsudo\fR:
@@ -278,14 +264,24 @@ on any host via \fBsudo\fR:
 \&    sudoHost: ALL
 \&    sudoCommand: ALL
 .Ve
+.Sh "Anatomy of \s-1LDAP\s0 sudoers lookup"
+.IX Subsection "Anatomy of LDAP sudoers lookup"
+When looking up a sudoer using \s-1LDAP\s0 there are only two or three
+\&\s-1LDAP\s0 queries per invocation.  The first query is to parse the global
+options.  The second is to match against the user's name and the
+groups that the user belongs to.  (The special \s-1ALL\s0 tag is matched
+in this query too.)  If no match is returned for the user's name
+and groups, a third query returns all entries containing user
+netgroups and checks to see if the user belongs to any of them.
 .Sh "Differences between \s-1LDAP\s0 and non-LDAP sudoers"
 .IX Subsection "Differences between LDAP and non-LDAP sudoers"
 There are some subtle differences in the way sudoers is handled
 once in \s-1LDAP\s0.  Probably the biggest is that according to the \s-1RFC\s0,
-\&\s-1LDAP\s0's ordering is arbitrary and you cannot expect that Attributes
-and Entries are returned in any order.  If there are conflicting
-command rules on an entry, the negative takes precedence.  This is
-called paranoid behavior (not necessarily the most specific match).
+\&\s-1LDAP\s0 ordering is arbitrary and you cannot expect that Attributes
+and Entries are returned in any specific order.  If there are
+conflicting command rules on an entry, the negative takes precedence.
+This is called paranoid behavior (not necessarily the most specific
+match).
 .PP
 Here is an example:
 .PP
@@ -298,7 +294,7 @@ Here is an example:
 .Ve
 .PP
 .Vb 10
-\&    # LDAP equivalent of Johnny
+\&    # LDAP equivalent of johnny
 \&    # Allows all commands except shell
 \&    dn: cn=role1,ou=Sudoers,dc=my-domain,dc=com
 \&    objectClass: sudoRole
@@ -311,7 +307,7 @@ Here is an example:
 .Ve
 .PP
 .Vb 11
-\&    # LDAP equivalent of Puddles
+\&    # LDAP equivalent of puddles
 \&    # Notice that even though ALL comes last, it still behaves like
 \&    # role1 since the LDAP code assumes the more paranoid configuration
 \&    dn: cn=role2,ou=Sudoers,dc=my-domain,dc=com
@@ -326,7 +322,7 @@ Here is an example:
 .PP
 Another difference is that negations on the Host, User or Runas are
 currently ignorred.  For example, the following attributes do not
-do what they might appear to do.
+behave the way one might expect.
 .PP
 .Vb 3
 \&    # does not match all but joe
@@ -374,7 +370,7 @@ values specified in \fI/etc/openldap/ldap.conf\fR or the user's
 Only those options explicitly listed in \fI@ldap_conf@\fR that are
 supported by \fBsudo\fR are honored.  Configuration options are listed
 below in upper case but are parsed in a case-independent manner.
-.IP "\s-1URI\s0 ldap[s]://[hostname[:port]] ..." 4
+.IP "\fB\s-1URI\s0\fR ldap[s]://[hostname[:port]] ..." 4
 .IX Item "URI ldap[s]://[hostname[:port]] ..."
 Specifies a whitespace-delimited list of one or more URIs describing
 the \s-1LDAP\s0 server(s) to connect to.  The \fIprotocol\fR may be either \fBldap\fR
@@ -385,14 +381,14 @@ encryption.  If no \fIport\fR is specified, the default is port 389 for
 libraries support the mixing of \f(CW\*(C`ldap://\*(C'\fR and \f(CW\*(C`ldaps://\*(C'\fR URIs.
 The Netscape-derived libraries used on most commercial versions of
 Unix are only capable of supporting one or the other.
-.IP "\s-1HOST\s0 name[:port] ..." 4
+.IP "\fB\s-1HOST\s0\fR name[:port] ..." 4
 .IX Item "HOST name[:port] ..."
 If no \fB\s-1URI\s0\fR is specified, the \fB\s-1HOST\s0\fR parameter specifies a
 whitespace-delimited list of \s-1LDAP\s0 servers to connect to.  Each host
 may include an optional \fIport\fR separated by a colon (':').  The
 \&\fB\s-1HOST\s0\fR parameter is deprecated in favor of the \fB\s-1URI\s0\fR specification
 and is included for backwards compatibility.
-.IP "\s-1PORT\s0 port_number" 4
+.IP "\fB\s-1PORT\s0\fR port_number" 4
 .IX Item "PORT port_number"
 If no \fB\s-1URI\s0\fR is specified, the \fB\s-1PORT\s0\fR parameter specifies the
 default port to connect to on the \s-1LDAP\s0 server if a \fB\s-1HOST\s0\fR parameter
@@ -400,22 +396,22 @@ does not specify the port itself.  If no \fB\s-1PORT\s0\fR parameter is used,
 the default is port 389 for \s-1LDAP\s0 and port 636 for \s-1LDAP\s0 over \s-1TLS\s0
 (\s-1SSL\s0).  The \fB\s-1PORT\s0\fR parameter is deprecated in favor of the \fB\s-1URI\s0\fR
 specification and is included for backwards compatibility.
-.IP "\s-1BIND_TIMELIMIT\s0 seconds" 4
+.IP "\fB\s-1BIND_TIMELIMIT\s0\fR seconds" 4
 .IX Item "BIND_TIMELIMIT seconds"
 The \fB\s-1BIND_TIMELIMIT\s0\fR parameter specifies the amount of time, in seconds,
 to wait while trying to connect to an \s-1LDAP\s0 server.  If multiple \fB\s-1URI\s0\fRs or
 \&\fB\s-1HOST\s0\fRs are specified, this is the amount of time to wait before trying
 the next one in the list.
-.IP "\s-1TIMELIMIT\s0 seconds" 4
+.IP "\fB\s-1TIMELIMIT\s0\fR seconds" 4
 .IX Item "TIMELIMIT seconds"
 The \fB\s-1TIMELIMIT\s0\fR parameter specifies the amount of time, in seconds,
 to wait for a response to an \s-1LDAP\s0 query.
-.IP "\s-1SUDOERS_BASE\s0 base" 4
+.IP "\fB\s-1SUDOERS_BASE\s0\fR base" 4
 .IX Item "SUDOERS_BASE base"
 The base \s-1DN\s0 to use when performing \fBsudo\fR \s-1LDAP\s0 queries.  Typically
 this is of the form \f(CW\*(C`ou=SUDOers,dc=example,dc=com\*(C'\fR for the domain
 \&\f(CW\*(C`example.com\*(C'\fR.
-.IP "\s-1SUDOERS_DEBUG\s0 debug_level" 4
+.IP "\fB\s-1SUDOERS_DEBUG\s0\fR debug_level" 4
 .IX Item "SUDOERS_DEBUG debug_level"
 This sets the debug level for \fBsudo\fR \s-1LDAP\s0 queries.  Debugging
 information is printed to the standard error.  A value of 1 results
@@ -423,35 +419,35 @@ in a moderate amount of debugging information.  A value of 2 shows
 the results of the matches themselves.  This parameter should not
 be set in a production environment as the extra information is
 likely to confuse users.
-.IP "\s-1BINDDN\s0 \s-1DN\s0" 4
+.IP "\fB\s-1BINDDN\s0\fR \s-1DN\s0" 4
 .IX Item "BINDDN DN"
 The \fB\s-1BINDDN\s0\fR parameter specifies the identity, in the form of a
 Distinguished Name (\s-1DN\s0), to use when performing \s-1LDAP\s0 operations.
 If not specified, \s-1LDAP\s0 operations are performed with an anonymous
 identity.  By default, most \s-1LDAP\s0 servers will allow anonymous access.
-.IP "\s-1BINDPW\s0 secret" 4
+.IP "\fB\s-1BINDPW\s0\fR secret" 4
 .IX Item "BINDPW secret"
 The \fB\s-1BINDPW\s0\fR parameter specifies the password to use when performing
 \&\s-1LDAP\s0 operations.  This is typically used in conjunction with the
 \&\fB\s-1BINDDN\s0\fR parameter.
-.IP "\s-1ROOTBINDDN\s0 \s-1DN\s0" 4
+.IP "\fB\s-1ROOTBINDDN\s0\fR \s-1DN\s0" 4
 .IX Item "ROOTBINDDN DN"
 The \fB\s-1ROOTBINDDN\s0\fR parameter specifies the identity, in the form of
 a Distinguished Name (\s-1DN\s0), to use when performing privileged \s-1LDAP\s0
 operations, such as \fIsudoers\fR queries.  The password corresponding
 to the identity should be stored in \fI@ldap_secret@\fR.
 If not specified, the \fB\s-1BINDDN\s0\fR identity is used (if any).
-.IP "\s-1LDAP_VERSION\s0 number" 4
+.IP "\fB\s-1LDAP_VERSION\s0\fR number" 4
 .IX Item "LDAP_VERSION number"
 The version of the \s-1LDAP\s0 protocol to use when connecting to the server.
 The default value is protocol version 3.
-.IP "\s-1SSL\s0 on/true/yes/off/false/no" 4
+.IP "\fB\s-1SSL\s0\fR on/true/yes/off/false/no" 4
 .IX Item "SSL on/true/yes/off/false/no"
 If the \fB\s-1SSL\s0\fR parameter is set to \f(CW\*(C`on\*(C'\fR, \f(CW\*(C`true\*(C'\fR or \f(CW\*(C`yes\*(C'\fR, \s-1TLS\s0
 (\s-1SSL\s0) encryption is always used when communicating with the \s-1LDAP\s0
 server.  Typically, this involves connecting to the server on port
 636 (ldaps).
-.IP "\s-1SSL\s0 start_tls" 4
+.IP "\fB\s-1SSL\s0\fR start_tls" 4
 .IX Item "SSL start_tls"
 If the \fB\s-1SSL\s0\fR parameter is set to \f(CW\*(C`start_tls\*(C'\fR, the \s-1LDAP\s0 server
 connection is initiated normally and \s-1TLS\s0 encryption is begun before
@@ -459,20 +455,20 @@ the bind credentials are sent.  This has the advantage of not
 requiring a dedicated port for encrypted communications.  This
 parameter is only supported by \s-1LDAP\s0 servers that honor the \f(CW\*(C`start_tls\*(C'\fR
 extension, such as the OpenLDAP server.
-.IP "\s-1TLS_CHECKPEER\s0 on/true/yes/off/false/no" 4
+.IP "\fB\s-1TLS_CHECKPEER\s0\fR on/true/yes/off/false/no" 4
 .IX Item "TLS_CHECKPEER on/true/yes/off/false/no"
 If enabled, \fB\s-1TLS_CHECKPEER\s0\fR will cause the \s-1LDAP\s0 server's \s-1TLS\s0
 certificated to be verified.  If the server's \s-1TLS\s0 certificate cannot
 be verified (usually because it is signed by an unknown certificate
 authority), \fBsudo\fR will be unable to connect to it.  If \fB\s-1TLS_CHECKPEER\s0\fR
 is disabled, no check is made.
-.IP "\s-1TLS_CACERTFILE\s0 file name" 4
+.IP "\fB\s-1TLS_CACERTFILE\s0\fR file name" 4
 .IX Item "TLS_CACERTFILE file name"
 The path to a certificate authority bundle which contains the certificates
 for all the Certificate Authorities the client knows to be valid,
 e.g. \fI/etc/ssl/ca\-bundle.pem\fR.
 This option is only supported by the OpenLDAP libraries.
-.IP "\s-1TLS_CACERTDIR\s0 directory" 4
+.IP "\fB\s-1TLS_CACERTDIR\s0\fR directory" 4
 .IX Item "TLS_CACERTDIR directory"
 Similar to \fB\s-1TLS_CACERTFILE\s0\fR but instead of a file, it is a
 directory containing individual Certificate Authority certificates,
@@ -480,69 +476,63 @@ e.g. \fI/etc/ssl/certs\fR.
 The directory specified by \fB\s-1TLS_CACERTDIR\s0\fR is checked after
 \&\fB\s-1TLS_CACERTFILE\s0\fR.
 This option is only supported by the OpenLDAP libraries.
-.IP "\s-1TLS_CERT\s0 file name" 4
+.IP "\fB\s-1TLS_CERT\s0\fR file name" 4
 .IX Item "TLS_CERT file name"
 The path to a file containing the client certificate which can
 be used to authenticate the client to the \s-1LDAP\s0 server.
-.RS 4
-.IP "OpenLDAP" 18
-.IX Item "OpenLDAP"
-\&\f(CW\*(C`tls_cert /etc/ssl/client_cert.pem\*(C'\fR
-.IP "Netscape-derived" 18
-.IX Item "Netscape-derived"
-\&\f(CW\*(C`tls_cert /var/ldap/cert7.db\*(C'\fR
-.RE
-.RS 4
+The certificate type depends on the \s-1LDAP\s0 libraries used.
+.Sp
+OpenLDAP:
+    \f(CW\*(C`tls_cert /etc/ssl/client_cert.pem\*(C'\fR
+.Sp
+Netscape\-derived:
+    \f(CW\*(C`tls_cert /var/ldap/cert7.db\*(C'\fR
 .Sp
 When using Netscape-derived libraries, this file may also contain
 Certificate Authority certificates.
-.RE
-.IP "\s-1TLS_KEY\s0 file name" 4
+.IP "\fB\s-1TLS_KEY\s0\fR file name" 4
 .IX Item "TLS_KEY file name"
 The path to a file containing the private key which matches the
 certificate specified by \fB\s-1TLS_CERT\s0\fR.  The private key must not be
-password\-protected.
-.RS 4
-.IP "OpenLDAP" 18
-.IX Item "OpenLDAP"
-\&\f(CW\*(C`tls_cert /etc/ssl/client_key.pem\*(C'\fR
-.IP "Netscape-derived" 18
-.IX Item "Netscape-derived"
-\&\f(CW\*(C`tls_cert /var/ldap/key3.db\*(C'\fR
-.RE
-.RS 4
-.RE
-.IP "\s-1TLS_RANDFILE\s0 file name" 4
+password\-protected.  The key type depends on the \s-1LDAP\s0 libraries
+used.
+.Sp
+OpenLDAP:
+    \f(CW\*(C`tls_cert /etc/ssl/client_key.pem\*(C'\fR
+.Sp
+Netscape\-derived:
+    \f(CW\*(C`tls_cert /var/ldap/key3.db\*(C'\fR
+.IP "\fB\s-1TLS_RANDFILE\s0\fR file name" 4
 .IX Item "TLS_RANDFILE file name"
 The \fB\s-1TLS_RANDFILE\s0\fR parameter specifies the path to an entropy
 source for systems that lack a random device.  It is generally used
 in conjunction with \fIprngd\fR or \fIegd\fR.
 This option is only supported by the OpenLDAP libraries.
-.IP "\s-1TLS_CIPHERS\s0 cipher list" 4
+.IP "\fB\s-1TLS_CIPHERS\s0\fR cipher list" 4
 .IX Item "TLS_CIPHERS cipher list"
 The \fB\s-1TLS_CIPHERS\s0\fR parameter allows the administer to restrict
 which encryption algorithms may be used for \s-1TLS\s0 (\s-1SSL\s0) connections.
 See the OpenSSL manual for a list of valid ciphers.
 This option is only supported by the OpenLDAP libraries.
-.IP "\s-1USE_SASL\s0 on/true/yes/off/false/no" 4
+.IP "\fB\s-1USE_SASL\s0\fR on/true/yes/off/false/no" 4
 .IX Item "USE_SASL on/true/yes/off/false/no"
 Enable \fB\s-1USE_SASL\s0\fR for \s-1LDAP\s0 servers that support \s-1SASL\s0 authentication.
-.IP "\s-1SASL_AUTH_ID\s0 identity" 4
+.IP "\fB\s-1SASL_AUTH_ID\s0\fR identity" 4
 .IX Item "SASL_AUTH_ID identity"
 The \s-1SASL\s0 user name to use when connecting to the \s-1LDAP\s0 server.
 By default, \fBsudo\fR will use an anonymous connection.
-.IP "\s-1ROOTUSE_SASL\s0 on/true/yes/off/false/no" 4
+.IP "\fB\s-1ROOTUSE_SASL\s0\fR on/true/yes/off/false/no" 4
 .IX Item "ROOTUSE_SASL on/true/yes/off/false/no"
 Enable \fB\s-1ROOTUSE_SASL\s0\fR to enable \s-1SASL\s0 authentication when connecting
 to an \s-1LDAP\s0 server from a privileged process, such as \fBsudo\fR.
-.IP "\s-1ROOTSASL_AUTH_ID\s0 identity" 4
+.IP "\fB\s-1ROOTSASL_AUTH_ID\s0\fR identity" 4
 .IX Item "ROOTSASL_AUTH_ID identity"
 The \s-1SASL\s0 user name to use when \fB\s-1ROOTUSE_SASL\s0\fR is enabled.
-.IP "\s-1SASL_SECPROPS\s0 none/properties" 4
+.IP "\fB\s-1SASL_SECPROPS\s0\fR none/properties" 4
 .IX Item "SASL_SECPROPS none/properties"
 \&\s-1SASL\s0 security properties or \fInone\fR for no properties.  See the
 \&\s-1SASL\s0 programmer's manual for details.
-.IP "\s-1KRB5_CCNAME\s0 file name" 4
+.IP "\fB\s-1KRB5_CCNAME\s0\fR file name" 4
 .IX Item "KRB5_CCNAME file name"
 The path to the Kerberos 5 credential cache to use when authenticating
 with the remote server.
@@ -559,7 +549,7 @@ match and later matches take precedence over earlier ones.
 The following sources are recognized:
 .PP
 .Vb 2
-\&    files       read sudoers from a file (usually F</etc/sudoers>)
+\&    files       read sudoers from F<@sysconfdir@/sudoers>
 \&    ldap        read sudoers from LDAP
 .Ve
 .PP
@@ -775,10 +765,12 @@ schema directory (e.g. \fI/etc/openldap/schema\fR), add the proper
 .IX Subsection "XXX more exhaustive sudoers ldif example?"
 .SH "SEE ALSO"
 .IX Header "SEE ALSO"
-\&\fIldap.conf\fR\|(4), \fIsudoers\fR\|(4)
+\&\fIldap.conf\fR\|(@mansectform@), \fIsudoers\fR\|(5)
 .SH "CAVEATS"
 .IX Header "CAVEATS"
-parsing differences between \s-1LDAP\s0 and file sudoers
+The way that \fIsudoers\fR is parsed differs between Note that there
+are differences in the way that LDAP-based \fIsudoers\fR is parsed
+compared to file-based \fIsudoers\fR.  See the \*(L"Differences between \s-1LDAP\s0 and non-LDAP sudoers\*(R" section for more information.
 .SH "BUGS"
 .IX Header "BUGS"
 If you feel you have found a bug in \fBsudo\fR, please submit a bug report
diff --git a/sudoers.ldap.pod b/sudoers.ldap.pod
index 000b860e0..64b969a4d 100644
--- a/sudoers.ldap.pod
+++ b/sudoers.ldap.pod
@@ -34,16 +34,10 @@ Using LDAP for I<sudoers> has several benefits:
 
 =item *
 
-B<sudo> no longer needs to read I<sudoers> in its entirety.  Parsing
-of F</etc/sudoers> requires the entire file to be read.  When LDAP
-is used, there are only two or three LDAP queries per invocation.
+B<sudo> no longer needs to read I<sudoers> in its entirety.  When
+LDAP is used, there are only two or three LDAP queries per invocation.
 This makes it especially fast and particularly usable in LDAP
-environments.  The first query is to parse global options (see
-below).  The second is to match against the user's name and the
-groups that the user belongs to.  (The special ALL tag is matched
-in this query too.)  If no match is returned for the user's name
-and groups, a third query returns all entries contain user netgroups
-and checks to see if the user belongs to any of them.
+environments.
 
 =item *
 
@@ -55,48 +49,36 @@ this will not prevent B<sudo> from running.
 
 =item *
 
-Options inside of entries now override global default options.
-F</etc/sudoers> only supports default options and limited options
-associated with user/host/commands and aliases.  The syntax is
-complicated and can be difficult for users to understand.
-
-Sudo first looks for an entry called C<cn=default> in the C<SUDOers>
-container.  If found, the multi-valued C<sudoOption> attribute is
-parsed the same way the global C<Defaults> line in F</etc/sudoers>
-is parsed.
-
-If, on the second or third query, a response contains a sudoRole
-which matches against the user, host, and command, then the matched
-object is scanned for a additional options that override the top-level
-defaults.  See the example LDAP content below for more information.
+It is possible to specify per-entry options that override the global
+default options.  F<@sysconfdir@/sudoers> only supports default options and
+limited options associated with user/host/commands/aliases.  The
+syntax is complicated and can be difficult for users to understand.
+Placing the options directly in the entry is more natural.
 
 =item *
 
 B<visudo> is no longer needed.  B<visudo> provides locking and
-syntax checking of the F</etc/sudoers> file.  Since LDAP updates
+syntax checking of the F<@sysconfdir@/sudoers> file.  Since LDAP updates
 are atomic, locking is no longer necessary.  Because syntax is
 checked when the data is inserted into LDAP, there is no need
 for a specialized tool to check syntax.
 
-=item *
-
-Aliases are no longer needed.  User, Host, and Cmnd Aliases were
-designed to simplify organization of I<sudoers> files and to
-improve readability.  Since an LDAP I<sudoers> entry allows multiple
-values for each of its attributes, and since most LDAP browsers are
-graphical and easy to work with, these aliases are no longer
-needed.
+=back
 
-If you wish to specify a large number of users into an entry or
-wish to have similar entries with identical users, then either use
-groups or user netgroups.  Alternately, they can all just be pasted
-into the LDAP record.
+Another major difference between LDAP and file-based I<sudoers>
+is that in LDAP, B<sudo>-specific Aliases are not supported.
 
-If you need to specify a large number of hosts in an entry, use
-netgroups or IP address matches (10.2.3.4/255.255.0.0).  Alternately,
-they can all just be pasted into the LDAP record.
+For the most part, there is really no need for B<sudo>-specific
+Aliases.  Unix groups or user netgroups can be used in place of
+User_Aliases and RunasAliases.  Host netgroups can be used in place
+of HostAliases.  Since Unix groups and netgroups can also be stored
+in LDAP there is no real need for B<sudo>-specific aliases.
 
-=back
+Cmnd_Aliases are not really required either since it is possible
+to have multiple users listed in a sudoRole.  Instead of defining
+a Cmnd_Alias that is referenced by multiple users, one can create
+a sudoRole that contains the commands and assign multiple users
+to it.
 
 =head2 SUDOers LDAP container
 
@@ -105,7 +87,7 @@ container.
 
 Sudo first looks for the C<cn=default> entry in the SUDOers container.
 If found, the multi-valued C<sudoOption> attribute is parsed in the
-same manner as a global C<Defaults> line in F</etc/sudoers>.  In
+same manner as a global C<Defaults> line in F<@sysconfdir@/sudoers>.  In
 the following example, the C<SSH_AUTH_SOCK> variable will be preserved
 in the environment for all users.
 
@@ -121,29 +103,31 @@ the following components:
 
 =over 4
 
-=item sudoUser
+=item B<sudoUser>
 
 A user name, uid (prefixed with C<'#'>), Unix group (prefixed with
 a C<'%'>) or user netgroup (prefixed with a C<'+'>).
 
-=item sudoHost
+=item B<sudoHost>
 
 A host name, IP address, IP network, or host netgroup (prefixed
 with a C<'+'>).
 The special value C<ALL> will match any host.
 
-=item sudoCommand
+=item B<sudoCommand>
 
 A Unix command with optional command line arguments, potentially
 including globbing characters (aka wild cards).
 The special value C<ALL> will match any command.
+If a command is prefixed with an exclamation point C<'!'>, the
+user will be prohibited from running that command.
 
-=item sudoOption
+=item B<sudoOption>
 
-Similar to the global options described above, but specific to the
-C<sudoRole> in which it resides.
+Identical in function to the global options described above, but
+specific to the C<sudoRole> in which it resides.
 
-=item sudoRunAsUser
+=item B<sudoRunAsUser>
 
 A user name or uid (prefixed with C<'#'>) that commands may be run
 as or a Unix group (prefixed with a C<'%'>) or user netgroup (prefixed
@@ -151,16 +135,16 @@ with a C<'+'>) that contains a list of users that commands may be
 run as.
 The special value C<ALL> will match any user.
 
-=item sudoRunAsGroup
+=item B<sudoRunAsGroup>
 
 A Unix group or gid (prefixed with C<'#'>) that commands may be run as.
 The special value C<ALL> will match any group.
 
 =back
 
-Each entry listed above contains a single value, but may be repeated
-multiple times.  A sudoRole must contain at least one C<sudoUser>,
-C<sudoHost> and C<sudoCommand>.
+Each component listed above should contain a single value, but there
+may be multiple instances of each component type.  A sudoRole must
+contain at least one C<sudoUser>, C<sudoHost> and C<sudoCommand>.
 
 The following example allows users in group wheel to run any command
 on any host via B<sudo>:
@@ -173,14 +157,25 @@ on any host via B<sudo>:
     sudoHost: ALL
     sudoCommand: ALL
 
+=head2 Anatomy of LDAP sudoers lookup
+
+When looking up a sudoer using LDAP there are only two or three
+LDAP queries per invocation.  The first query is to parse the global
+options.  The second is to match against the user's name and the
+groups that the user belongs to.  (The special ALL tag is matched
+in this query too.)  If no match is returned for the user's name
+and groups, a third query returns all entries containing user
+netgroups and checks to see if the user belongs to any of them.
+
 =head2 Differences between LDAP and non-LDAP sudoers
 
 There are some subtle differences in the way sudoers is handled
 once in LDAP.  Probably the biggest is that according to the RFC,
-LDAP's ordering is arbitrary and you cannot expect that Attributes
-and Entries are returned in any order.  If there are conflicting
-command rules on an entry, the negative takes precedence.  This is
-called paranoid behavior (not necessarily the most specific match).
+LDAP ordering is arbitrary and you cannot expect that Attributes
+and Entries are returned in any specific order.  If there are
+conflicting command rules on an entry, the negative takes precedence.
+This is called paranoid behavior (not necessarily the most specific
+match).
 
 Here is an example:
 
@@ -190,7 +185,7 @@ Here is an example:
     # Always allows all commands because ALL is matched last
     puddles ALL=(root) !/bin/sh,ALL
 
-    # LDAP equivalent of Johnny
+    # LDAP equivalent of johnny
     # Allows all commands except shell
     dn: cn=role1,ou=Sudoers,dc=my-domain,dc=com
     objectClass: sudoRole
@@ -201,7 +196,7 @@ Here is an example:
     sudoCommand: ALL
     sudoCommand: !/bin/sh
 
-    # LDAP equivalent of Puddles
+    # LDAP equivalent of puddles
     # Notice that even though ALL comes last, it still behaves like
     # role1 since the LDAP code assumes the more paranoid configuration
     dn: cn=role2,ou=Sudoers,dc=my-domain,dc=com
@@ -215,7 +210,7 @@ Here is an example:
 
 Another difference is that negations on the Host, User or Runas are
 currently ignorred.  For example, the following attributes do not
-do what they might appear to do.
+behave the way one might expect.
 
     # does not match all but joe
     # rather, does not match anyone
@@ -262,7 +257,7 @@ below in upper case but are parsed in a case-independent manner.
 
 =over 4
 
-=item URI ldap[s]://[hostname[:port]] ...
+=item B<URI> ldap[s]://[hostname[:port]] ...
 
 Specifies a whitespace-delimited list of one or more URIs describing
 the LDAP server(s) to connect to.  The I<protocol> may be either B<ldap>
@@ -274,7 +269,7 @@ libraries support the mixing of C<ldap://> and C<ldaps://> URIs.
 The Netscape-derived libraries used on most commercial versions of
 Unix are only capable of supporting one or the other.
 
-=item HOST name[:port] ...
+=item B<HOST> name[:port] ...
 
 If no B<URI> is specified, the B<HOST> parameter specifies a
 whitespace-delimited list of LDAP servers to connect to.  Each host
@@ -282,7 +277,7 @@ may include an optional I<port> separated by a colon (':').  The
 B<HOST> parameter is deprecated in favor of the B<URI> specification
 and is included for backwards compatibility.
 
-=item PORT port_number
+=item B<PORT> port_number
 
 If no B<URI> is specified, the B<PORT> parameter specifies the
 default port to connect to on the LDAP server if a B<HOST> parameter
@@ -291,25 +286,25 @@ the default is port 389 for LDAP and port 636 for LDAP over TLS
 (SSL).  The B<PORT> parameter is deprecated in favor of the B<URI>
 specification and is included for backwards compatibility.
 
-=item BIND_TIMELIMIT seconds
+=item B<BIND_TIMELIMIT> seconds
 
 The B<BIND_TIMELIMIT> parameter specifies the amount of time, in seconds,
 to wait while trying to connect to an LDAP server.  If multiple B<URI>s or
 B<HOST>s are specified, this is the amount of time to wait before trying
 the next one in the list.
 
-=item TIMELIMIT seconds
+=item B<TIMELIMIT> seconds
 
 The B<TIMELIMIT> parameter specifies the amount of time, in seconds,
 to wait for a response to an LDAP query.
 
-=item SUDOERS_BASE base
+=item B<SUDOERS_BASE> base
 
 The base DN to use when performing B<sudo> LDAP queries.  Typically
 this is of the form C<ou=SUDOers,dc=example,dc=com> for the domain
 C<example.com>.
 
-=item SUDOERS_DEBUG debug_level
+=item B<SUDOERS_DEBUG> debug_level
 
 This sets the debug level for B<sudo> LDAP queries.  Debugging
 information is printed to the standard error.  A value of 1 results
@@ -318,20 +313,20 @@ the results of the matches themselves.  This parameter should not
 be set in a production environment as the extra information is
 likely to confuse users.
 
-=item BINDDN DN
+=item B<BINDDN> DN
 
 The B<BINDDN> parameter specifies the identity, in the form of a
 Distinguished Name (DN), to use when performing LDAP operations.
 If not specified, LDAP operations are performed with an anonymous
 identity.  By default, most LDAP servers will allow anonymous access.
 
-=item BINDPW secret
+=item B<BINDPW> secret
 
 The B<BINDPW> parameter specifies the password to use when performing
 LDAP operations.  This is typically used in conjunction with the
 B<BINDDN> parameter.
 
-=item ROOTBINDDN DN
+=item B<ROOTBINDDN> DN
 
 The B<ROOTBINDDN> parameter specifies the identity, in the form of
 a Distinguished Name (DN), to use when performing privileged LDAP
@@ -339,19 +334,19 @@ operations, such as I<sudoers> queries.  The password corresponding
 to the identity should be stored in F<@ldap_secret@>.
 If not specified, the B<BINDDN> identity is used (if any).
 
-=item LDAP_VERSION number
+=item B<LDAP_VERSION> number
 
 The version of the LDAP protocol to use when connecting to the server.
 The default value is protocol version 3.
 
-=item SSL on/true/yes/off/false/no
+=item B<SSL> on/true/yes/off/false/no
 
 If the B<SSL> parameter is set to C<on>, C<true> or C<yes>, TLS
 (SSL) encryption is always used when communicating with the LDAP
 server.  Typically, this involves connecting to the server on port
 636 (ldaps).
 
-=item SSL start_tls
+=item B<SSL> start_tls
 
 If the B<SSL> parameter is set to C<start_tls>, the LDAP server
 connection is initiated normally and TLS encryption is begun before
@@ -360,7 +355,7 @@ requiring a dedicated port for encrypted communications.  This
 parameter is only supported by LDAP servers that honor the C<start_tls>
 extension, such as the OpenLDAP server.
 
-=item TLS_CHECKPEER on/true/yes/off/false/no
+=item B<TLS_CHECKPEER> on/true/yes/off/false/no
 
 If enabled, B<TLS_CHECKPEER> will cause the LDAP server's TLS
 certificated to be verified.  If the server's TLS certificate cannot
@@ -368,14 +363,14 @@ be verified (usually because it is signed by an unknown certificate
 authority), B<sudo> will be unable to connect to it.  If B<TLS_CHECKPEER>
 is disabled, no check is made.
 
-=item TLS_CACERTFILE file name
+=item B<TLS_CACERTFILE> file name
 
 The path to a certificate authority bundle which contains the certificates
 for all the Certificate Authorities the client knows to be valid,
 e.g. F</etc/ssl/ca-bundle.pem>.
 This option is only supported by the OpenLDAP libraries.
 
-=item TLS_CACERTDIR directory
+=item B<TLS_CACERTDIR> directory
 
 Similar to B<TLS_CACERTFILE> but instead of a file, it is a
 directory containing individual Certificate Authority certificates,
@@ -384,82 +379,72 @@ The directory specified by B<TLS_CACERTDIR> is checked after
 B<TLS_CACERTFILE>.
 This option is only supported by the OpenLDAP libraries.
 
-=item TLS_CERT file name
+=item B<TLS_CERT> file name
 
 The path to a file containing the client certificate which can
 be used to authenticate the client to the LDAP server.
+The certificate type depends on the LDAP libraries used.
 
-=over 18
-
-=item OpenLDAP
-
-C<tls_cert /etc/ssl/client_cert.pem>
+OpenLDAP:
+    C<tls_cert /etc/ssl/client_cert.pem>
 
-=item Netscape-derived
-
-C<tls_cert /var/ldap/cert7.db>
-
-=back
+Netscape-derived:
+    C<tls_cert /var/ldap/cert7.db>
 
 When using Netscape-derived libraries, this file may also contain
 Certificate Authority certificates.
 
-=item TLS_KEY file name
+=item B<TLS_KEY> file name
 
 The path to a file containing the private key which matches the
 certificate specified by B<TLS_CERT>.  The private key must not be
-password-protected.
+password-protected.  The key type depends on the LDAP libraries
+used.
 
-=over 18
+OpenLDAP:
+    C<tls_cert /etc/ssl/client_key.pem>
 
-=item OpenLDAP
-
-C<tls_cert /etc/ssl/client_key.pem>
-
-=item Netscape-derived
-
-C<tls_cert /var/ldap/key3.db>
-
-=back
+Netscape-derived:
+    C<tls_cert /var/ldap/key3.db>
 
-=item TLS_RANDFILE file name
+=item B<TLS_RANDFILE> file name
 
 The B<TLS_RANDFILE> parameter specifies the path to an entropy
 source for systems that lack a random device.  It is generally used
 in conjunction with I<prngd> or I<egd>.
 This option is only supported by the OpenLDAP libraries.
 
-=item TLS_CIPHERS cipher list
+=item B<TLS_CIPHERS> cipher list
 
 The B<TLS_CIPHERS> parameter allows the administer to restrict
 which encryption algorithms may be used for TLS (SSL) connections.
 See the OpenSSL manual for a list of valid ciphers.
 This option is only supported by the OpenLDAP libraries.
 
-=item USE_SASL on/true/yes/off/false/no
+=item B<USE_SASL> on/true/yes/off/false/no
 
 Enable B<USE_SASL> for LDAP servers that support SASL authentication.
 
-=item SASL_AUTH_ID identity
+=item B<SASL_AUTH_ID> identity
 
 The SASL user name to use when connecting to the LDAP server.
 By default, B<sudo> will use an anonymous connection.
 
-=item ROOTUSE_SASL on/true/yes/off/false/no
+=item B<ROOTUSE_SASL> on/true/yes/off/false/no
 
 Enable B<ROOTUSE_SASL> to enable SASL authentication when connecting
 to an LDAP server from a privileged process, such as B<sudo>.
 
-=item ROOTSASL_AUTH_ID identity
+=item B<ROOTSASL_AUTH_ID> identity
 
 The SASL user name to use when B<ROOTUSE_SASL> is enabled.
 
-=item SASL_SECPROPS none/properties
+=item B<SASL_SECPROPS> none/properties
 
 SASL security properties or I<none> for no properties.  See the
 SASL programmer's manual for details.
 
-=item KRB5_CCNAME file name
+=item B<KRB5_CCNAME> file name
 
 The path to the Kerberos 5 credential cache to use when authenticating
 with the remote server.
@@ -478,7 +463,7 @@ match and later matches take precedence over earlier ones.
 
 The following sources are recognized:
 
-    files	read sudoers from a file (usually F</etc/sudoers>)
+    files	read sudoers from F<@sysconfdir@/sudoers>
     ldap	read sudoers from LDAP
 
 In addition, the entry C<[NOTFOUND=return]> will short-circuit the
@@ -678,11 +663,14 @@ C<include> line in C<slapd.conf> and restart B<slapd>.
 
 =head1 SEE ALSO
 
-L<ldap.conf(4)>, L<sudoers(4)>
+L<ldap.conf(5)>, L<sudoers(5)>
 
 =head1 CAVEATS
 
-parsing differences between LDAP and file sudoers
+The way that I<sudoers> is parsed differs between Note that there
+are differences in the way that LDAP-based I<sudoers> is parsed
+compared to file-based I<sudoers>.  See the L<Differences between
+LDAP and non-LDAP sudoers> section for more information.
 
 =head1 BUGS