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).
Note
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
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.
Important
By default, only the directory superuser has the right to add, delete, or modify ACI attributes. In fact, the directory superuser has a privilege, bypass-acl
, that allows the account to perform operations without regard to ACIs.
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:
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.
Download the
Example.ldif
file, shown in the following listing:# # Copyright 2020 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
.
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 ` --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 ` 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 ` --backendId exampleData ` --ldifFile C:\Temp\Example.ldif ` --offline
PS C:\path\to>C:\path\to\opendj\bat\start-ds --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 the ACI Admin
user access to modify ACIs:
$ ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePasswordFile /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 ` --hostname localhost ` --port 1636 ` --useSsl ` --usePkcs12TrustStore C:\path\to\opendj\config\keystore ` --trustStorePasswordFile 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 \
--trustStorePasswordFile /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
Try some of the 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.
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 \
--trustStorePasswordFile /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 ` --hostname localhost ` --port 1636 ` --useSsl ` --usePkcs12TrustStore C:\path\to\opendj\config\keystore ` --trustStorePasswordFile 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 \
--trustStorePasswordFile /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.
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 \
--trustStorePasswordFile /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 ` --hostname localhost ` --port 1636 ` --useSsl ` --usePkcs12TrustStore C:\path\to\opendj\config\keystore ` --trustStorePasswordFile 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 \
--trustStorePasswordFile /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.
This example lets users create and delete self-managed groups:
$ ldapmodify \
--hostname localhost \
--port 1636 \
--useSsl \
--usePkcs12TrustStore /path/to/opendj/config/keystore \
--trustStorePasswordFile /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 ` --hostname localhost ` --port 1636 ` --useSsl ` --usePkcs12TrustStore C:\path\to\opendj\config\keystore ` --trustStorePasswordFile 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 \
--trustStorePasswordFile /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
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 \
--trustStorePasswordFile /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 ` --hostname localhost ` --port 1636 ` --useSsl ` --usePkcs12TrustStore C:\path\to\opendj\config\keystore ` --trustStorePasswordFile 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 \
--trustStorePasswordFile /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.
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 \
--trustStorePasswordFile /path/to/opendj/config/keystore.pin \
--no-prompt
PS C:\path\to> dsconfig `
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 `
--trustStorePasswordFile 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 \
--trustStorePasswordFile /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 \
--trustStorePasswordFile /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 ` --hostname localhost ` --port 1636 ` --useSsl ` --usePkcs12TrustStore C:\path\to\opendj\config\keystore ` --trustStorePasswordFile 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 \
--trustStorePasswordFile /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.
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 \
--trustStorePasswordFile /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 ` --hostname localhost ` --port 1636 ` --useSsl ` --usePkcs12TrustStore C:\path\to\opendj\config\keystore ` --trustStorePasswordFile 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 \
--trustStorePasswordFile /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.