Learn Access Control
Until now, you have used the evaluation setup profile. The evaluation profile makes it easy to access Example.com data. It helps you learn and demonstrate directory services without explicitly granting access after server setup.
In a production directory service where security is important, access is under tighter control. In most cases, access is denied by default to prevent accidental information leaks. You must explicitly grant access where required. To grant access, use access control instructions (ACIs).
The sample ACIs described here demonstrate some but not all ACI features. For details, see Access Control. |
About ACIs
ACIs are implemented as operational LDAP attributes. An operational attribute is not meant to store application data, but to influence server behavior. Operational attributes are often left hidden from normal users. A server does not return operational attributes on an entry unless explicitly requested.
Each ACI influences server behavior by indicating:
-
Which directory data it targets
-
Which permissions it allows or denies
-
Which users or groups it applies to
-
Under which conditions (time, network origin, connection security, user properties) it applies
Example ACI with explanation
The following example ACI gives users access to change their own passwords:
aci: (targetattr = "authPassword || userPassword")
(version 3.0;acl "Allow users to change their own passwords";
allow (write)(userdn = "ldap:///self");)
Consider the characteristics of this ACI attribute:
- Target Entries and Scope
-
The target entries and scope for this ACI are implicit.
The default target is the entry with this
aci
attribute.The default scope includes the target entry and all its subordinates.
In other words, if you set this ACI on
ou=People,dc=example,dc=com
, it affects all users under that base entry. For example, Babs Jensen,uid=bjensen,ou=People,dc=example,dc=com
, can set her own password. - Target Attributes
-
This ACI affects operations on either of the standard password attributes:
(targetattr = "authPassword || userPassword")
.The ACI only has an effect when an operation targets either
authPassword
oruserPassword
, and any subtypes of those attribute types. - Permissions
-
This ACI affects only operations that change affected attributes:
allow (write)
.If this is the only ACI that targets password attributes, users have access to change their own passwords, but they do not have access to read passwords.
- Subjects
-
This ACI has an effect when the target entry is the same as the bind DN:
(userdn = "ldap:///self")
.This means that the user must have authenticated to change their password.
- Documentation
-
The wrapper around the permissions and subjects contains human-readable documentation about the ACI:
(version 3.0;acl "Allow users to change their own passwords"; … ;)
.Version 3.0 is the only supported ACI version.
- Conditions
-
This ACI does not define any conditions. It applies all the time, for connections from all networks, and so forth.
Server configuration settings can further constrain how clients connect. Such constraints are not specified by this ACI, however.
Use ACIs
To write ACI attributes:
-
A user must have the
modify-acl
administrative privilege.Privileges are server configuration settings that control access to administrative operations.
-
An ACI must give the user permission to change
aci
attributes.
By default, only the directory superuser has the right to add, delete, or modify ACI attributes.
In fact, the directory superuser has a privilege, Any account with permissions to change ACIs is dangerous, because the power can be misused. The user with permissions to change ACIs can give themselves full access to all directory data in their scope. |
Prepare to use the examples:
Stop running servers
Use each server’s stop-ds
command to stop any DS servers running on your computer.
This lets the new server use ports that might already be in use by another server.
Get sample data
-
Download the Example.ldif file, shown in the following listing:
Show listing
# # Copyright 2020-2021 ForgeRock AS. All Rights Reserved # # Use of this code requires a commercial software license with ForgeRock AS. # or with one of its affiliates. All use shall be exclusively subject # to such license between the licensee and ForgeRock AS. # dn: dc=example,dc=com objectClass: domain objectClass: top dc: example dn: ou=Groups,dc=example,dc=com objectClass: organizationalUnit objectClass: top ou: Groups dn: ou=Self Service,ou=Groups,dc=example,dc=com objectClass: organizationalUnit objectClass: top description: Groups that authenticated users can manage on their own ou: Self Service dn: ou=People,dc=example,dc=com objectClass: organizationalUnit objectClass: top description: Description on ou=People ou: People dn: uid=ACI Admin,ou=People,dc=example,dc=com objectClass: person objectClass: inetOrgPerson objectClass: organizationalPerson objectClass: top cn: ACI Admin givenName: ACI mail: aci-admin@example.com ou: People sn: Admin uid: ACI Admin userPassword: 5up35tr0ng dn: uid=bjensen,ou=People,dc=example,dc=com objectClass: person objectClass: inetOrgPerson objectClass: organizationalPerson objectClass: top cn: Babs Jensen givenName: Barbara mail: bjensen@example.com ou: People sn: Jensen uid: bjensen userPassword: 5up35tr0ng
-
Save the file to your computer’s temporary directory, such as
/tmp
orC:\Temp
.
Install server with secure settings
-
Unzip the DS server
.zip
file into the folder where you want to install the server. -
Set up the directory server using the LDIF you downloaded.
Set up the server without the evaluation setup profile, so the access control settings are secure by default. The default password policies require stronger passwords. The configuration grants very little access to regular users. Only
uid=admin
has access to the data:$ /path/to/opendj/setup \ --serverId learn-acis \ --deploymentKey $DEPLOYMENT_KEY \ --deploymentKeyPassword password \ --rootUserDn uid=admin \ --rootUserPassword str0ngAdm1nPa55word \ --hostname localhost \ --ldapPort 1389 \ --ldapsPort 1636 \ --httpsPort 8443 \ --adminConnectorPort 4444 \ --acceptLicense $ dsconfig \ create-backend \ --backend-name exampleData \ --type je \ --set enabled:true \ --set base-dn:dc=example,dc=com \ --offline \ --no-prompt $ import-ldif \ --backendId exampleData \ --ldifFile /tmp/Example.ldif \ --offline $ start-ds --quiet
PS C:\path\to> C:\path\to\opendj\setup.bat ` --serverId learn-acis ` --deploymentKey $DEPLOYMENT_KEY ` --deploymentKeyPassword password ` --rootUserDn uid=admin ` --rootUserPassword str0ngAdm1nPa55word ` --hostname localhost ` --ldapPort 1389 ` --ldapsPort 1636 ` --httpsPort 8443 ` --adminConnectorPort 4444 ` --acceptLicense PS C:\path\to> C:\path\to\opendj\bat\dsconfig.bat ` create-backend ` --backend-name exampleData ` --type je ` --set enabled:true ` --set base-dn:dc=example,dc=com ` --offline ` --no-prompt PS C:\path\to> C:\path\to\opendj\bat\import-ldif.bat ` --backendId exampleData ` --ldifFile C:\Temp\Example.ldif ` --offline PS C:\path\to> C:\path\to\opendj\bat\start-ds.bat --quiet
% /path/to/opendj/setup \ --serverId learn-acis \ --deploymentKey $DEPLOYMENT_KEY \ --deploymentKeyPassword password \ --rootUserDn uid=admin \ --rootUserPassword str0ngAdm1nPa55word \ --hostname localhost \ --ldapPort 1389 \ --ldapsPort 1636 \ --httpsPort 8443 \ --adminConnectorPort 4444 \ --acceptLicense % dsconfig \ create-backend \ --backend-name exampleData \ --type je \ --set enabled:true \ --set base-dn:dc=example,dc=com \ --offline \ --no-prompt % import-ldif \ --backendId exampleData \ --ldifFile /tmp/Example.ldif \ --offline % start-ds --quiet
Grant ACI admin access
Grant the ACI Admin
user access to modify ACIs:
$ ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn uid=admin \
--bindPassword str0ngAdm1nPa55word << EOF
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "aci") (version 3.0;acl "ACI Admin can manage ACI attributes";
allow (write) userdn = "ldap:///uid=ACI Admin,ou=People,dc=example,dc=com";)
dn: uid=ACI Admin,ou=People,dc=example,dc=com
changetype: modify
add: ds-privilege-name
ds-privilege-name: modify-acl
EOF
PS C:\path\to> New-Item -Path . -Name "aci-admin.ldif" -ItemType "file" -Value @"
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "aci") (version 3.0;acl "ACI Admin can manage ACI attributes";
allow (write) userdn = "ldap:///uid=ACI Admin,ou=People,dc=example,dc=com";)
dn: uid=ACI Admin,ou=People,dc=example,dc=com
changetype: modify
add: ds-privilege-name
ds-privilege-name: modify-acl
"@
PS C:\path\to> ldapmodify.bat `
--hostname localhost `
--port 1636 `
--useSsl `
--usePkcs12TrustStore C:\path\to\opendj\config\keystore `
--trustStorePassword:file C:\path\to\opendj\config\keystore.pin `
--bindDn uid=admin `
--bindPassword str0ngAdm1nPa55word `
aci-admin.ldif
% ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn uid=admin \
--bindPassword str0ngAdm1nPa55word << EOF
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "aci") (version 3.0;acl "ACI Admin can manage ACI attributes";
allow (write) userdn = "ldap:///uid=ACI Admin,ou=People,dc=example,dc=com";)
dn: uid=ACI Admin,ou=People,dc=example,dc=com
changetype: modify
add: ds-privilege-name
ds-privilege-name: modify-acl
EOF
(Optional) Try LDAP examples
Try examples from Learn LDAP.
You find that Babs Jensen does not have the access that she had with the evaluation setup profile. For production servers, the best practice is to grant access only when required.
Examples
Prepare to use the examples before trying them.
The ACI Admin
account must have access to manage ACIs.
After you add an example ACI, test users' access.
For inspiration, see the examples in Learn LDAP.
ACI syntax is powerful, and sometimes difficult to get right. For details, see Access Control.
ACI: Access Own Entry
The following example grants authenticated users access to read their own entry, and modify some attributes:
$ ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" \
--bindPassword 5up35tr0ng << EOF
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*") (version 3.0;acl "Users can read their entries";
allow (read, search, compare) (userdn = "ldap:///self");)
-
add: aci
aci: (targetattr = "authPassword || description || displayName || homePhone ||
jpegPhoto || preferredLanguage || userPassword")
(version 3.0;acl "Self-service modifications for basic attributes";
allow (write) (userdn = "ldap:///self");)
EOF
PS C:\path\to> New-Item -Path . -Name "self-access.ldif" -ItemType "file" -Value @"
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*") (version 3.0;acl "Users can read their entries";
allow (read, search, compare) (userdn = "ldap:///self");)
-
add: aci
aci: (targetattr = "authPassword || description || displayName || homePhone ||
jpegPhoto || preferredLanguage || userPassword")
(version 3.0;acl "Self-service modifications for basic attributes";
allow (write) (userdn = "ldap:///self");)
"@
PS C:\path\to> ldapmodify.bat `
--hostname localhost `
--port 1636 `
--useSsl `
--usePkcs12TrustStore C:\path\to\opendj\config\keystore `
--trustStorePassword:file C:\path\to\opendj\config\keystore.pin `
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" `
--bindPassword 5up35tr0ng `
self-access.ldif
% ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" \
--bindPassword 5up35tr0ng << EOF
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*") (version 3.0;acl "Users can read their entries";
allow (read, search, compare) (userdn = "ldap:///self");)
-
add: aci
aci: (targetattr = "authPassword || description || displayName || homePhone ||
jpegPhoto || preferredLanguage || userPassword")
(version 3.0;acl "Self-service modifications for basic attributes";
allow (write) (userdn = "ldap:///self");)
EOF
In this example, the list of attributes that users can read includes all user attributes. The list that users can modify is limited. Other attributes might be governed by other applications. For example, a user’s manager might only be changed through an HR system. Perhaps the IT department is responsible for all changes to email addresses.
ACI: Access SubSchemaSubEntry Attribute
The subSchemaSubEntry
attribute indicates the entry holding the LDAP schema definitions
that apply to the current entry.
Many applications retrieve this attribute, and the associated schema, to properly display or validate attribute values.
The following example demonstrates how to grant access to read this attribute on directory entries:
$ ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" \
--bindPassword 5up35tr0ng << EOF
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "subSchemaSubEntry")
(version 3.0;acl "Authenticated users can read subSchemaSubEntry";
allow (read, search, compare) (userdn = "ldap:///all");)
EOF
PS C:\path\to> New-Item -Path . -Name "subSchemaSubentry-access.ldif" -ItemType "file" -Value @"
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "subSchemaSubEntry")
(version 3.0;acl "Authenticated users can read subSchemaSubEntry";
allow (read, search, compare) (userdn = "ldap:///all");)
"@
PS C:\path\to> ldapmodify.bat `
--hostname localhost `
--port 1636 `
--useSsl `
--usePkcs12TrustStore C:\path\to\opendj\config\keystore `
--trustStorePassword:file C:\path\to\opendj\config\keystore.pin `
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" `
--bindPassword 5up35tr0ng `
subSchemaSubentry-access.ldif
% ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" \
--bindPassword 5up35tr0ng << EOF
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "subSchemaSubEntry")
(version 3.0;acl "Authenticated users can read subSchemaSubEntry";
allow (read, search, compare) (userdn = "ldap:///all");)
EOF
ACI: Manage Group Membership
For some static groups, you might choose to let users manage their own memberships. The following example lets members of self-service groups manage their own membership:
$ ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" \
--bindPassword 5up35tr0ng << EOF
dn: ou=Self Service,ou=Groups,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "member") (version 3.0;acl "Self registration";
allow (selfwrite) (userdn = "ldap:///uid=*,ou=People,dc=example,dc=com");)
EOF
PS C:\path\to> New-Item -Path . -Name "self-service-groups.ldif" -ItemType "file" -Value @"
dn: ou=Self Service,ou=Groups,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "member") (version 3.0;acl "Self registration";
allow (selfwrite) (userdn = "ldap:///uid=*,ou=People,dc=example,dc=com");)
"@
PS C:\path\to> ldapmodify.bat `
--hostname localhost `
--port 1636 `
--useSsl `
--usePkcs12TrustStore C:\path\to\opendj\config\keystore `
--trustStorePassword:file C:\path\to\opendj\config\keystore.pin `
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" `
--bindPassword 5up35tr0ng `
self-service-groups.ldif
% ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" \
--bindPassword 5up35tr0ng << EOF
dn: ou=Self Service,ou=Groups,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "member") (version 3.0;acl "Self registration";
allow (selfwrite) (userdn = "ldap:///uid=*,ou=People,dc=example,dc=com");)
EOF
The selfwrite
permission is for adding or deleting one’s own DN from a group.
ACI: Manage Self-Service Groups
This example lets users create and delete self-managed groups:
$ ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" \
--bindPassword 5up35tr0ng << EOF
dn: ou=Self Service,ou=Groups,dc=example,dc=com
changetype: modify
add: aci
aci: (targattrfilters="add=objectClass:(objectClass=groupOfNames)")
(version 3.0; acl "Users can create self-service groups";
allow (add) (userdn = "ldap:///uid=*,ou=People,dc=example,dc=com");)
-
add: aci
aci: (version 3.0; acl "Owner can delete self-service groups";
allow (delete) (userattr = "owner#USERDN");)
EOF
PS C:\path\to> New-Item -Path . -Name "self-managed-groups.ldif" -ItemType "file" -Value @"
dn: ou=Self Service,ou=Groups,dc=example,dc=com
changetype: modify
add: aci
aci: (targattrfilters="add=objectClass:(objectClass=groupOfNames)")
(version 3.0; acl "Users can create self-service groups";
allow (add) (userdn = "ldap:///uid=*,ou=People,dc=example,dc=com");)
-
add: aci
aci: (version 3.0; acl "Owner can delete self-service groups";
allow (delete) (userattr = "owner#USERDN");)
"@
PS C:\path\to> ldapmodify.bat `
--hostname localhost `
--port 1636 `
--useSsl `
--usePkcs12TrustStore C:\path\to\opendj\config\keystore `
--trustStorePassword:file C:\path\to\opendj\config\keystore.pin `
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" `
--bindPassword 5up35tr0ng `
self-managed-groups.ldif
% ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" \
--bindPassword 5up35tr0ng << EOF
dn: ou=Self Service,ou=Groups,dc=example,dc=com
changetype: modify
add: aci
aci: (targattrfilters="add=objectClass:(objectClass=groupOfNames)")
(version 3.0; acl "Users can create self-service groups";
allow (add) (userdn = "ldap:///uid=*,ou=People,dc=example,dc=com");)
-
add: aci
aci: (version 3.0; acl "Owner can delete self-service groups";
allow (delete) (userattr = "owner#USERDN");)
EOF
ACI: Full Access
The following ACI grants Babs Jensen permission to perform all LDAP operations,
allowing her full administrator access to the directory data under dc=example,dc=com
.
Babs can read and write directory data, rename and move entries, and use proxied authorization.
Some operations also require administrative privileges not shown in this example:
$ ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" \
--bindPassword 5up35tr0ng << EOF
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "* || +") (version 3.0;acl "Babs has full access";
allow (all, export, import, proxy) (userdn = "ldap:///uid=bjensen,ou=People,dc=example,dc=com");)
EOF
PS C:\path\to> New-Item -Path . -Name "full-access.ldif" -ItemType "file" -Value @"
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "* || +") (version 3.0;acl "Babs has full access";
allow (all, export, import, proxy) (userdn = "ldap:///uid=bjensen,ou=People,dc=example,dc=com");)
"@
PS C:\path\to> ldapmodify.bat `
--hostname localhost `
--port 1636 `
--useSsl `
--usePkcs12TrustStore C:\path\to\opendj\config\keystore `
--trustStorePassword:file C:\path\to\opendj\config\keystore.pin `
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" `
--bindPassword 5up35tr0ng `
full-access.ldif
% ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" \
--bindPassword 5up35tr0ng << EOF
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "* || +") (version 3.0;acl "Babs has full access";
allow (all, export, import, proxy) (userdn = "ldap:///uid=bjensen,ou=People,dc=example,dc=com");)
EOF
(targetattr = "* || +")
permits access to all user attributes and all operational attributes.
allow (all, import, export, proxy)
permits all user operations, modify DN operations, and proxied authorization.
Notice that all
does not allow modify DN and proxied authorization.
ACI: Anonymous Reads and Searches
In LDAP, an anonymous user is one who does not provide bind credentials. By default, most setup profiles only allow anonymous access to read information about the server’s capabilities, or before using the StartTLS operation to get a secure connection before providing credentials.
Unless you set up the server with the evaluation profile, anonymous users cannot read application data by default. You can grant them access, however. First, change the global configuration to allow unauthenticated requests. Second, add an ACI to grant access to the entries.
The following command changes the global configuration property,
unauthenticated-requests-policy
,
to allow unauthenticated requests:
$ dsconfig \
set-global-configuration-prop \
--hostname localhost \
--port 4444 \
--bindDN uid=admin \
--bindPassword str0ngAdm1nPa55word \
--set unauthenticated-requests-policy:allow \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--no-prompt
PS C:\path\to> dsconfig.bat `
set-global-configuration-prop `
--hostname localhost `
--port 4444 `
--bindDN uid=admin `
--bindPassword str0ngAdm1nPa55word `
--set unauthenticated-requests-policy:allow `
--usePkcs12TrustStore C:\path\to\opendj\config\keystore `
--trustStorePassword:file C:\path\to\opendj\config\keystore.pin `
--no-prompt
% dsconfig \
set-global-configuration-prop \
--hostname localhost \
--port 4444 \
--bindDN uid=admin \
--bindPassword str0ngAdm1nPa55word \
--set unauthenticated-requests-policy:allow \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--no-prompt
This ACI makes all user attributes in dc=example,dc=com
data (except passwords) world-readable:
$ ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" \
--bindPassword 5up35tr0ng << EOF
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr != "authPassword || userPassword") (version 3.0;acl "Anonymous read-search access";
allow (read, search, compare) (userdn = "ldap:///anyone");)
EOF
PS C:\path\to> New-Item -Path . -Name "anon-access.ldif" -ItemType "file" -Value @"
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr != "authPassword || userPassword") (version 3.0;acl "Anonymous read-search access";
allow (read, search, compare) (userdn = "ldap:///anyone");)
"@
PS C:\path\to> ldapmodify.bat `
--hostname localhost `
--port 1636 `
--useSsl `
--usePkcs12TrustStore C:\path\to\opendj\config\keystore `
--trustStorePassword:file C:\path\to\opendj\config\keystore.pin `
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" `
--bindPassword 5up35tr0ng `
anon-access.ldif
% ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" \
--bindPassword 5up35tr0ng << EOF
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr != "authPassword || userPassword") (version 3.0;acl "Anonymous read-search access";
allow (read, search, compare) (userdn = "ldap:///anyone");)
EOF
Notice that ldap:///anyone
designates anonymous users and authenticated users.
Do not confuse that with ldap:///all
, which designates authenticated users only.
ACI: Permit Insecure Access Over Loopback Only
This ACI uses IP address and Security Strength Factor subjects
to prevent insecure remote access to dc=example,dc=com
data.
In most cases, you explicitly grant permission with allow
,
making it easier to understand and to explain why the server permits a given operation.
This demonstrates one use case where it makes sense to deny permission:
$ ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" \
--bindPassword 5up35tr0ng << EOF
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "* || +") (version 3.0;acl "Restrict insecure LDAP to the loopback address";
deny (all) (ip != "127.0.0.1" and ssf <= "1");)
EOF
PS C:\path\to> New-Item -Path . -Name "deny-cleartext.ldif" -ItemType "file" -Value @"
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "* || +") (version 3.0;acl "Restrict cleartext LDAP to the loopback address";
deny (all) (ip != "127.0.0.1" and ssf <= "1");)
"@
PS C:\path\to> ldapmodify.bat `
--hostname localhost `
--port 1636 `
--useSsl `
--usePkcs12TrustStore C:\path\to\opendj\config\keystore `
--trustStorePassword:file C:\path\to\opendj\config\keystore.pin `
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" `
--bindPassword 5up35tr0ng `
deny-cleartext.ldif
% ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePassword:file /path/to/opendj/config/keystore.pin \
--bindDn "uid=ACI Admin,ou=People,dc=example,dc=com" \
--bindPassword 5up35tr0ng << EOF
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "* || +") (version 3.0;acl "Restrict insecure LDAP to the loopback address";
deny (all) (ip != "127.0.0.1" and ssf <= "1");)
EOF
-
ssf = 1
means that TLS is configured without a cipher. The server verifies integrity using packet checksums, but all content is sent in plain text. -
ssf = 0
means that the content is sent plain text with no connection security.