Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
SLAPD.ACCESS(5) 	       File Formats Manual		 SLAPD.ACCESS(5)

NAME
     slapd.access - access configuration for slapd, the stand-alone LDAP daemon

SYNOPSIS
     /usr/local/etc/openldap/slapd.conf

DESCRIPTION
     The  slapd.conf(5) file contains configuration information for the slapd(8)
     daemon. This configuration file is also used by the SLAPD tools slapacl(8),
     slapadd(8),  slapauth(8),	slapcat(8),  slapdn(8),  slapindex(8),	slapmod-
     ify(8), and slaptest(8).

     The  slapd.conf  file  consists of a series of global configuration options
     that apply to slapd as a whole (including all backends), followed	by  zero
     or more database backend definitions that contain information specific to a
     backend instance.

     The general format of slapd.conf is as follows:

	 # comment - these options apply to every database
	 <global configuration options>
	 # first database definition & configuration options
	 database    <backend 1 type>
	 <configuration options specific to backend 1>
	 # subsequent database definitions & configuration options
	 ...

     Both the global configuration and each backend-specific section can contain
     access  information.   Backend-specific  access control directives are used
     for those entries that belong to the backend,  according  to  their  naming
     context.  In case no access control directives are defined for a backend or
     those  which are defined are not applicable, the directives from the global
     configuration section are then used.

     If no access controls are present, the default  policy  allows  anyone  and
     everyone  to read anything but restricts updates to rootdn.  (e.g., "access
     to * by * read").

     When dealing with an access list, because the global access list is  effec-
     tively  appended  to  each per-database list, if the resulting list is non-
     empty then the access list will end with an implicit access to * by *  none
     directive.  If there are no access directives applicable to a backend, then
     a default read is used.

     Be warned: the rootdn can always read and write EVERYTHING!

     For entries not held in any backend (such as a root DSE), the global direc-
     tives are used.

     Arguments that should be replaced by actual text are shown in brackets <>.

THE ACCESS DIRECTIVE
     The structure of the access control directives is

     access to <what> [ by <who> [ <access> ] [ <control> ] ]+
	    Grant access (specified by <access>) to a set of entries and/or  at-
	    tributes  (specified by <what>) by one or more requestors (specified
	    by <who>).

     Lists of access directives are  evaluated	in  the  order	they  appear  in
     slapd.conf.   When  a <what> clause matches the datum whose access is being
     evaluated, its <who> clause list is checked.  When a <who>  clause  matches
     the  accessor's  properties,  its <access> and <control> clauses are evalu-
     ated.

     Access control checking stops at the first match of the  <what>  and  <who>
     clause,  unless  otherwise  dictated  by  the <control> clause.  Each <who>
     clause list is implicitly terminated by a

	  by * none stop

     <control> clause.	This implicit <control> stops access  directive  evalua-
     tion with no more access privileges granted to anyone else.  To stop access
     directive evaluation only when both <who> and <what> match, add an explicit

	  by * break

     to the end of the <who> clause list.

     Each <what> clause list is implicitly terminated by a

	  access to *
	       by * none

     clause  that  results  in granting no access privileges to an otherwise un-
     specified datum.

THE <WHAT> FIELD
     The field <what> specifies the entity the access control directive  applies
     to.  It can have the forms

	  dn[.<dnstyle>]=<dnpattern>
	  filter=<ldapfilter>
	  attrs=<attrlist>[ val[/matchingRule][.<attrstyle>]=<attrval>]

     with

	  <dnstyle>={{exact|base(object)}|regex
	       |one(level)|sub(tree)|children}
	  <attrlist>={<attr>|[{!|@}]<objectClass>}[,<attrlist>]
	  <attrstyle>={{exact|base(object)}|regex
	       |one(level)|sub(tree)|children}

     The statement dn=<dnpattern> selects the entries based on their naming con-
     text.   The  <dnpattern> is a string representation of the entry's DN.  The
     wildcard * stands for all the entries, and it is implied if no dn	form  is
     given.

     The  <dnstyle>  is  optional;  however,  it is recommended to specify it to
     avoid ambiguities.  Base (synonym of baseObject), the default, or exact (an
     alias of base) indicates the entry whose DN is equal  to  the  <dnpattern>;
     one  (synonym  of onelevel) indicates all the entries immediately below the
     <dnpattern>, sub (synonym of subtree) indicates all entries in the  subtree
     at  the  <dnpattern>, children indicates all the entries below (subordinate
     to) the <dnpattern>.

     If the <dnstyle> qualifier is regex, then <dnpattern>  is	a  POSIX  (''ex-
     tended'')	regular  expression  pattern,  as  detailed  in  regex(7) and/or
     re_format(7), matching a normalized string representation	of  the  entry's
     DN.  The regex form of the pattern does not (yet) support UTF-8.

     The statement filter=<ldapfilter> selects the entries based on a valid LDAP
     filter as described in RFC 4515.  A filter of (objectClass=*) is implied if
     no filter form is given.

     The  statement  attrs=<attrlist>  selects the attributes the access control
     rule applies to.  It is a comma-separated list of attribute types, plus the
     special names entry, indicating access to the entry itself,  and  children,
     indicating  access  to  the entry's children. ObjectClass names may also be
     specified in this list, which will affect all the attributes that	are  re-
     quired  and/or  allowed by that objectClass.  Actually, names in <attrlist>
     that are prefixed by @ are directly treated as objectClass names.	 A  name
     prefixed  by !  is also treated as an objectClass, but in this case the ac-
     cess rule affects the attributes that are not required nor allowed by  that
     objectClass.   If	no  attrs  form is given, attrs=@extensibleObject is im-
     plied, i.e. all attributes are addressed.

     Using  the  form  attrs=<attr>   val[/matchingRule][.<attrstyle>]=<attrval>
     specifies	access	to  a  particular  value of a single attribute.  In this
     case, only a single attribute type may be given. The <attrstyle> exact (the
     default) uses the attribute's equality matching rule to compare the  value,
     unless a different (and compatible) matching rule is specified. If the <at-
     trstyle>  is  regex,  the	provided value is used as a POSIX (''extended'')
     regular expression pattern.  If the  attribute  has  DN  syntax,  the  <at-
     trstyle>  can  be	any of base, onelevel, subtree or children, resulting in
     base, onelevel, subtree or children match, respectively.

     The dn, filter, and attrs statements are additive; they can be used in  se-
     quence  to  select entities the access rule applies to based on naming con-
     text, value and attribute type simultaneously.  Submatches  resulting  from
     regex  matching  can  be  dereferenced  in the <who> field using the syntax
     ${v<n>}, where <n> is the submatch number.  The default  syntax,  $<n>,  is
     actually an alias for ${d<n>}, that corresponds to dereferencing submatches
     from the dnpattern portion of the <what> field.

THE <WHO> FIELD
     The  field  <who> indicates whom the access rules apply to.  Multiple <who>
     statements can appear in an access control statement, indicating  the  dif-
     ferent  access  privileges to the same resource that apply to different ac-
     cessee.  It can have the forms

	  *
	  anonymous
	  users
	  self[.<selfstyle>]

	  dn[.<dnstyle>[,<modifier>]]=<DN>
	  dnattr=<attrname>

	  realanonymous
	  realusers
	  realself[.<selfstyle>]

	  realdn[.<dnstyle>[,<modifier>]]=<DN>
	  realdnattr=<attrname>

	  group[/<objectclass>[/<attrname>]]
	       [.<groupstyle>]=<group>
	  peername[.<peernamestyle>]=<peername>
	  sockname[.<style>]=<sockname>
	  domain[.<domainstyle>[,<modifier>]]=<domain>
	  sockurl[.<style>]=<sockurl>
	  set[.<setstyle>]=<pattern>

	  ssf=<n>
	  transport_ssf=<n>
	  tls_ssf=<n>
	  sasl_ssf=<n>

	  dynacl/<name>[/<options>][.<dynstyle>][=<pattern>]

     with

	  <style>={exact|regex|expand}
	  <selfstyle>={level{<n>}}
	  <dnstyle>={{exact|base(object)}|regex
	       |one(level)|sub(tree)|children|level{<n>}}
	  <groupstyle>={exact|expand}
	  <peernamestyle>={<style>|ip|ipv6|path}
	  <domainstyle>={exact|regex|sub(tree)}
	  <setstyle>={exact|expand}
	  <modifier>={expand}
	  <name>=aci	      <pattern>=<attrname>]

     They may be specified in combination.

     The wildcard * refers to everybody.

     The keywords prefixed by real act as their counterparts without prefix; the
     checking respectively occurs with the authentication DN and the  authoriza-
     tion DN.

     The  keyword  anonymous means access is granted to unauthenticated clients;
     it is mostly used to limit access to  authentication  resources  (e.g.  the
     userPassword  attribute) to unauthenticated clients for authentication pur-
     poses.

     The keyword users means access is granted to authenticated clients.

     The keyword self means access to an entry is allowed to  the  entry  itself
     (e.g.  the entry being accessed and the requesting entry must be the same).
     It allows the level{<n>} style, where <n> indicates what ancestor of the DN
     is to be used in matches.	A positive value indicates that the  <n>-th  an-
     cestor  of  the  user's  DN is to be considered; a negative value indicates
     that the <n>-th ancestor of the target is to be considered.  For example, a
     "by self.level{1}	..."  clause  would  match  when  the  object  "dc=exam-
     ple,dc=com"    is	 accessed   by	 "cn=User,dc=example,dc=com".	 A   "by
     self.level{-1} ..." clause would match when the same user accesses the  ob-
     ject "ou=Address Book,cn=User,dc=example,dc=com".

     The statement dn=<DN> means that access is granted to the matching DN.  The
     optional  style qualifier dnstyle allows the same choices of the dn form of
     the <what> field.	In addition, the regex style can exploit substring  sub-
     stitution	of  submatches	in  the <what> dn.regex clause by using the form
     $<digit>, with digit ranging from 0  to  9  (where  0  matches  the  entire
     string),  or the form ${<digit>+}, for submatches higher than 9.  Substring
     substitution  from  attribute  value  can	be  done  in  using   the   form
     ${v<digit>+}.   Since  the dollar character is used to indicate a substring
     replacement, the dollar character that is used to indicate match up to  the
     end of the string must be escaped by a second dollar character, e.g.

	 access to dn.regex="^(.+,)?uid=([^,]+),dc=[^,]+,dc=com$"
	     by dn.regex="^uid=$2,dc=[^,]+,dc=com$$" write

     The style qualifier allows an optional modifier.  At present, the only type
     allowed  is  expand,  which  causes substring substitution of submatches to
     take place even if dnstyle is not regex.  Note that the  regex  dnstyle  in
     the  above  example  may  be  of  use only if the <by> clause needs to be a
     regex; otherwise, if the value of the second (from the right)  dc=  portion
     of the DN in the above example were fixed, the form

	 access to dn.regex="^(.+,)?uid=([^,]+),dc=example,dc=com$"
	     by dn.exact,expand="uid=$2,dc=example,dc=com" write

     could be used; if it had to match the value in the <what> clause, the form

	 access to dn.regex="^(.+,)?uid=([^,]+),dc=([^,]+),dc=com$"
	     by dn.exact,expand="uid=$2,dc=$3,dc=com" write

     could be used.

     Forms of the <what> clause other than regex may provide submatches as well.
     The  base(object),  the  sub(tree),  the one(level), and the children forms
     provide $0  as  the  match  of  the  entire  string.   The  sub(tree),  the
     one(level),  and  the  children  forms  also provide $1 as the match of the
     rightmost part of the DN as defined in the <what> clause.	This may be use-
     ful, for instance, to provide access to all the  ancestors  of  a	user  by
     defining

	 access to dn.subtree="dc=com"
	     by dn.subtree,expand="$1" read

     which  means  that only access to entries that appear in the DN of the <by>
     clause is allowed.

     The level{<n>} form is an extension and a generalization  of  the	onelevel
     form,  which  matches  all  DNs  whose <n>-th ancestor is the pattern.  So,
     level{1} is equivalent to onelevel, and level{0} is equivalent to base.

     It is perfectly useless to give any access privileges to a DN that  exactly
     matches the rootdn of the database the ACLs apply to, because it implicitly
     possesses write privileges for the entire tree of that database.  Actually,
     access  control is bypassed for the rootdn, to solve the intrinsic chicken-
     and-egg problem.

     The statement dnattr=<attrname> means that access is  granted  to	requests
     whose  DN	is  listed  in the entry being accessed under the <attrname> at-
     tribute.

     The statement group=<group> means that access is granted to requests  whose
     DN is listed in the group entry whose DN is given by <group>.  The optional
     parameters <objectclass> and <attrname> define the objectClass and the mem-
     ber  attributeType  of  the group entry.  The defaults are groupOfNames and
     member, respectively.  The optional style qualifier <style> can be  expand,
     which  means that <group> will be expanded as a replacement string (but not
     as a regular expression) according to regex(7) and/or re_format(7), and ex-
     act, which means that exact match will be used.  If the  style  of  the  DN
     portion  of  the  <what> clause is regex, the submatches are made available
     according to regex(7) and/or re_format(7);  other	styles	provide  limited
     submatches as discussed above about the DN form of the <by> clause.

     For  static groups, the specified attributeType must have DistinguishedName
     or NameAndOptionalUID syntax. For dynamic groups the attributeType must  be
     a	subtype  of  the  labeledURI  attributeType.  Only LDAP URIs of the form
     ldap:///<base>??<scope>?<filter> will be evaluated in a dynamic  group,  by
     searching the local server only.

     The  statements  peername=<peername>, sockname=<sockname>, domain=<domain>,
     and sockurl=<sockurl> mean  that  the  contacting	host  IP  (in  the  form
     IP=<ip>:<port>  for IPv4, or IP=[<ipv6>]:<port> for IPv6) or the contacting
     host named pipe file name (in the form PATH=<path> if connecting through  a
     named  pipe)  for peername, the named pipe file name for sockname, the con-
     tacting host name for domain, and the contacting URL for sockurl  are  com-
     pared  against  pattern to determine access.  The same style rules for pat-
     tern match described for the group case apply, plus the regex style,  which
     implies submatch expand and regex match of the corresponding connection pa-
     rameters.	The exact style of the <peername> clause (the default) implies a
     case-exact  match	on  the  client's  IP,	including the IP= prefix and the
     trailing :<port>, or the client's path, including the PATH= prefix if  con-
     necting  through a named pipe.  The special ip style interprets the pattern
     as <peername>=<ip>[%<mask>][{<n>}], where <ip> and <mask> are dotted  digit
     representations  of  the  IP  and	the  mask, while <n>, delimited by curly
     brackets, is an optional port.  The same applies to IPv6 addresses when the
     special ipv6 style is used.  When checking access privileges, the	IP  por-
     tion  of  the  peername  is  extracted,  eliminating the IP= prefix and the
     :<port> part, and it is compared against the <ip> portion	of  the  pattern
     after  masking  with <mask>: ((peername & <mask>) == <ip>).  As an example,
     peername.ip=127.0.0.1 and peername.ipv6=::1 allow connections only from lo-
     calhost, peername.ip=192.168.1.0%255.255.255.0 allows connections from  any
     IP     in	   the	   192.168.1	 class	   C	 domain,    and    peer-
     name.ip=192.168.1.16%255.255.255.240{9009} allows connections from  any  IP
     in  the  192.168.1.[16-31]  range	of the same domain, only if port 9009 is
     used.  The special path style eliminates the PATH= prefix from the peername
     when connecting through a named pipe, and performs an exact  match  on  the
     given  pattern.   The  <domain> clause also allows the subtree style, which
     succeeds when a fully qualified name exactly matches the domain pattern, or
     its trailing part, after a dot, exactly matches the  domain  pattern.   The
     expand  style  is allowed, implying an exact match with submatch expansion;
     the use of expand as a style modifier is considered more  appropriate.   As
     an example, domain.subtree=example.com will match www.example.com, but will
     not match www.anotherexample.com.	The domain of the contacting host is de-
     termined  by performing a DNS reverse lookup.  As this lookup can easily be
     spoofed, use of the domain statement is strongly discouraged.  By	default,
     reverse  lookups  are  disabled.  The optional domainstyle qualifier of the
     <domain> clause allows a modifier option; the  only  value  currently  sup-
     ported is expand, which causes substring substitution of submatches to take
     place  even  if the domainstyle is not regex, much like the analogous usage
     in <dn> clause.

     The statement set=<pattern> is undocumented yet.

     The statement dynacl/<name>[/<options>][.<dynstyle>][=<pattern>] means that
     access checking is delegated  to  the  admin-defined  method  indicated  by
     <name>,  which  can  be  registered  at run-time by means of the moduleload
     statement.  The fields <options>, <dynstyle> and  <pattern>  are  optional,
     and  are  directly passed to the registered parsing routine.  Dynacl is ex-
     perimental; it must be enabled at compile time.

     The statement dynacl/aci[=<attrname>] means that the access control is  de-
     termined  by  the values in the attrname of the entry itself.  The optional
     <attrname> indicates what attributeType holds the ACI  information  in  the
     entry.   By  default,  the OpenLDAPaci operational attribute is used.  ACIs
     are experimental; they must be enabled at compile time.

     The statements ssf=<n>, transport_ssf=<n>,  tls_ssf=<n>,  and  sasl_ssf=<n>
     set the minimum required Security Strength Factor (ssf) needed to grant ac-
     cess.  The value should be positive integer.

THE <ACCESS> FIELD
     The optional field <access> ::= [[real]self]{<level>|<priv>} determines the
     access  level  or	the  specific access privileges the who field will have.
     Its component are defined as

	  <level> ::= none|disclose|auth|compare|search|read|{write|add|delete}|manage
	  <priv> ::= {=|+|-}{0|d|x|c|s|r|{w|a|z}|m}+

     The modifier self allows special operations like having  a  certain  access
     level or privilege only in case the operation involves the name of the user
     that's  requesting the access.  It implies the user that requests access is
     authorized.  The modifier realself refers to the authenticated  DN  as  op-
     posed  to	the authorized DN of the self modifier.  An example is the self-
     write access to the member attribute  of  a  group,  which  allows  one  to
     add/delete  its own DN from the member list of a group, while being not al-
     lowed to affect other members.

     The level access model relies on an incremental interpretation of	the  ac-
     cess  privileges.	 The  possible levels are none, disclose, auth, compare,
     search, read, write, and manage.  Each access level implies all the preced-
     ing ones, thus manage grants all access  including  administrative  access.
     This  access  allows some modifications which would otherwise be prohibited
     by the LDAP data model or the directory schema, e.g.  changing  the  struc-
     tural  objectclass  of an entry, or modifying an operational attribute that
     is defined as not user modifiable.  The write access is actually the combi-
     nation of add and delete, which respectively restrict the	write  privilege
     to add or delete the specified <what>.

     The none access level disallows all access including disclosure on error.

     The disclose access level allows disclosure of information on error.

     The  auth	access level means that one is allowed access to an attribute to
     perform authentication/authorization operations (e.g.  bind) with no  other
     access.  This is useful to grant unauthenticated clients the least possible
     access level to critical resources, like passwords.

     The  priv	access model relies on the explicit setting of access privileges
     for each clause.  The = sign resets previously defined accesses; as a  con-
     sequence,	the  final  access  privileges will be only those defined by the
     clause.  The + and - signs add/remove access  privileges  to  the	existing
     ones.   The  privileges  are  m  for  manage, w for write, a for add, z for
     delete, r for read, s for search, c for compare, x for authentication,  and
     d	for disclose.  More than one of the above privileges can be added in one
     statement.  0 indicates no privileges and is used	only  by  itself  (e.g.,
     +0).  Note that +az is equivalent to +w.

     If no access is given, it defaults to +0.

THE <CONTROL> FIELD
     The  optional field <control> controls the flow of access rule application.
     It can have the forms

	  stop
	  continue
	  break

     where stop, the default, means access checking stops in case of match.  The
     other two forms are used to keep on processing access clauses.  In  detail,
     the  continue  form  allows  for  other  <who> clauses in the same <access>
     clause to be considered, so that they may result in incrementally	altering
     the privileges, while the break form allows for other <access> clauses that
     match the same target to be processed.  Consider the (silly) example

	  access to dn.subtree="dc=example,dc=com" attrs=cn
	       by * =cs break

	  access to dn.subtree="ou=People,dc=example,dc=com"
	       by * +r

     which allows search and compare privileges to everybody under the "dc=exam-
     ple,dc=com"  tree,  with the second rule allowing also read in the "ou=Peo-
     ple" subtree, or the (even more silly) example

	  access to dn.subtree="dc=example,dc=com" attrs=cn
	       by * =cs continue
	       by users +r

     which grants everybody search and compare privileges, and adds read  privi-
     leges to authenticated clients.

     One  useful  application is to easily grant write privileges to an updatedn
     that is different from the rootdn.  In this case, since the updatedn  needs
     write access to (almost) all data, one can use

	  access to *
	       by dn.exact="cn=The Update DN,dc=example,dc=com" write
	       by * break

     as  the  first access rule.  As a consequence, unless the operation is per-
     formed with the updatedn identity, control is passed straight to the subse-
     quent rules.

OPERATION REQUIREMENTS
     Operations require different privileges on different portions  of	entries.
     The following summary applies to primary MDB database backend. Requirements
     for other backends may (and often do) differ.

     The  add operation requires add (=a) privileges on the pseudo-attribute en-
     try of the entry being added, and add (=a)  privileges  on  the  pseudo-at-
     tribute  children of the entry's parent.  When adding the suffix entry of a
     database, add access to children of the empty DN ("") is required. Also  if
     Add  content  ACL	checking  has  been  configured on the database (see the
     slapd.conf(5) or slapd-config(5) manual page), add (=a) will be required on
     all of the attributes being added.

     The bind operation, when credentials are stored in the directory,	requires
     auth  (=x)  privileges on the attribute the credentials are stored in (usu-
     ally userPassword).

     The compare operation requires compare (=c)  privileges  on  the  attribute
     that is being compared.

     The  delete  operation  requires  delete  (=z) privileges on the pseudo-at-
     tribute entry of the entry being deleted, and delete (=d) privileges on the
     children pseudo-attribute of the entry's parent.

     The modify operation requires write (=w) privileges on the attributes being
     modified.	In detail, add (=a) is required to add new values,  delete  (=z)
     is  required  to  delete existing values, and both delete and add (=az), or
     write (=w), are required to replace existing values.

     The modrdn operation requires write (=w) privileges on the pseudo-attribute
     entry of the entry whose relative DN is being modified, delete (=z)  privi-
     leges on the pseudo-attribute children of the old entry's parents, add (=a)
     privileges on the pseudo-attribute children of the new entry's parents, and
     add  (=a) privileges on the attributes that are present in the new relative
     DN.  Delete (=z) privileges are also required on the  attributes  that  are
     present in the old relative DN if deleteoldrdn is set to 1.

     The  search operation, requires search (=s) privileges on the entry pseudo-
     attribute of the searchBase (NOTE: this was introduced with OpenLDAP  2.4).
     Then,  for each entry, it requires search (=s) privileges on the attributes
     that are defined in the filter.  The resulting entries are  finally  tested
     for  read (=r) privileges on the pseudo-attribute entry (for read access to
     the entry itself) and for read (=r) access on each value of each  attribute
     that  is requested.  Also, for each referral object used in generating con-
     tinuation references, the	operation  requires  read  (=r)  access  on  the
     pseudo-attribute  entry (for read access to the referral object itself), as
     well as read (=r) access to the attribute holding the referral  information
     (generally the ref attribute).

     Some  internal  operations and some controls require specific access privi-
     leges.

     The SASL authzID mapping and the LDAP proxyAuthz control require auth  (=x)
     privileges  on  all the attributes that are present in the search filter of
     the URI regexp maps (the right-hand side of the  authz-regexp  directives).
     Auth  (=x) privileges are also required on the authzTo attribute of the au-
     thorizing identity and/or on the  authzFrom  attribute  of  the  authorized
     identity.	 In both cases, it is the authorizing identity that requires the
     privileges (i.e. the identity that has authenticated and is now  trying  to
     do some operation using another entity's permissions).

     In  general, when an internal lookup is performed for authentication or au-
     thorization purposes, search-specific privileges (see the	access	require-
     ments for the search operation illustrated above) are relaxed to auth.

     Access control to search entries is checked by the frontend, so it is fully
     honored  by  all  backends;  for all other operations and for the discovery
     phase of the search operation, full ACL semantics is only supported by  the
     primary backends, i.e.  slapd-mdb(5).

     Some  other  backend, like slapd-sql(5), may fully support them; others may
     only support a portion of the described semantics, or even differ	in  some
     aspects.	The  relevant  details are described in the backend-specific man
     pages.

CAVEATS
     It is strongly recommended to explicitly use the most appropriate <dnstyle>
     in <what> and <who> clauses, to avoid possible incorrect specifications  of
     the access rules as well as for performance (avoid unnecessary regex match-
     ing when an exact match suffices) reasons.

     An administrator might create a rule of the form:

	  access to dn.regex="dc=example,dc=com"
	       by ...

     expecting it to match all entries in the subtree "dc=example,dc=com".  How-
     ever,  this  rule	actually matches any DN which contains anywhere the sub-
     string "dc=example,dc=com".  That is, the rule matches both "uid=joe,dc=ex-
     ample,dc=com" and "dc=example,dc=com,uid=joe".

     To match the desired subtree, the rule would be more precisely written:

	  access to dn.regex="^(.+,)?dc=example,dc=com$"
	       by ...

     For performance reasons, it would be better to use the subtree style.

	  access to dn.subtree="dc=example,dc=com"
	       by ...

     When writing submatch rules, it may  be  convenient  to  avoid  unnecessary
     regex  <dnstyle>  use;  for instance, to allow access to the subtree of the
     user that matches the <what> clause, one could use

	  access to dn.regex="^(.+,)?uid=([^,]+),dc=example,dc=com$"
	       by dn.regex="^uid=$2,dc=example,dc=com$$" write
	       by ...

     However, since all that is required in the <by> clause is substring  expan-
     sion, a more efficient solution is

	  access to dn.regex="^(.+,)?uid=([^,]+),dc=example,dc=com$"
	       by dn.exact,expand="uid=$2,dc=example,dc=com" write
	       by ...

     In  fact, while a <dnstyle> of regex implies substring expansion, exact, as
     well as all the other DN specific <dnstyle> values, does not, so it must be
     explicitly requested.

FILES
     /usr/local/etc/openldap/slapd.conf
	    default slapd configuration file

SEE ALSO
     slapd(8), slapd-*(5), slapacl(8), regex(7), re_format(7)

     "OpenLDAP Administrator's Guide" (http://www.OpenLDAP.org/doc/admin/)

ACKNOWLEDGEMENTS
     OpenLDAP Software is developed  and  maintained  by  The  OpenLDAP  Project
     <http://www.openldap.org/>.   OpenLDAP Software is derived from the Univer-
     sity of Michigan LDAP 3.3 Release.

OpenLDAP 2.6.13 		   2026/03/09			 SLAPD.ACCESS(5)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=slapd.access&sektion=5&manpath=FreeBSD+Ports+15.1.quarterly>

home | help