Authentication mechanisms
Authentication is the process of verifying who is requesting access to a resource. The user or application making the request presents credentials, making it possible to prove that the requester is who they claim to be. The goal is to authorize access to directory resources depending on the confirmed identity of the user or application making the request.
LDAP is a stateful protocol, where the client sets up and maintains a connection with the server, potentially performing many operations or long-lived operations before disconnecting from the LDAP server. One of the LDAP operations, a bind, authenticates the client to the server. A bind is the first operation that a client performs after setting up a connection. Clients can bind again on the same connection to reauthenticate.
At the transport layer, DS servers support SSL and TLS protocols with mutual client authentication. This level of authentication is useful to properly secure connections. The authentication at this level is handled by the underlying JVM. The client identity verified at this level is not available to the DS server for the purpose of fine-grained authorization. For fine-grained authorization, you need LDAP authentication.
DS servers support multiple authentication mechanisms for LDAP operations:
- Simple bind (name/password) authentication
-
The client application presents a bind DN/password combination. The server checks that the password matches the password on the entry with the specified bind DN.
This mechanism involves sending the credentials over the network. Always use secure connections at the transport layer when you expect simple LDAP binds. You can configure either or both LDAPS and StartTLS, depending on what the client applications support.
For additional information, see Simple binds.
- Anonymous authentication
-
Simple bind authentication without credentials.
Anonymous authentication lets the server make authorization decisions when the client identity is unknown.
Allow anonymous authentication for publicly readable resources, such as root DSE attributes. Configure access control to let anonymous and other users read them.
For additional information, see Anonymous access.
- SASL authentication
-
Simple Authentication and Security Layer (SASL) is a framework, rather than a single method. DS servers provide handlers for a number of SASL mechanisms, including strong authentication choices like the External SASL mechanism handler for certificate-based authentication, and the GSSAPI SASL mechanism handler for use with Kerberos v5 systems.
Certificate-based authentication is well-suited for applications where distributing keys is easier than protecting passwords. For additional information, see Certificate-based authentication.
GSSAPI-based authentication is useful for interoperation with Kerberos. For additional information, see Authenticate with Kerberos.
- Authentication with proxied authorization
-
The client application binds with its credentials, and uses proxied authorization to perform operations as another user.
Client applications can use another means to authenticate the user before requesting proxied authorization. For details, see Proxied authorization.
- Pass-through authentication to another LDAP directory
-
The client application binds with its credentials, and another LDAP directory service handles the authentication. This is known as pass-through authentication.
Pass-through authentication is useful when credentials are stored in a remote directory service, and the DS directory service stores part of the user profile. For details, see Pass-through authentication.
DS servers and DS REST to LDAP gateway support multiple HTTP authentication mechanisms.
The identity from the HTTP request is mapped to an LDAP account for use in authorization decisions, so the mechanisms are known as authorization mechanisms. Their configuration is described in Configure HTTP Authorization. The following authorization mechanisms are available:
- HTTP Basic authorization
-
The client application sends an HTTP request that uses HTTP Basic authentication.
The client application can alternatively send an HTTP request with username and password headers.
You configure DS software to map the HTTP username to an LDAP DN. The result is like a simple name/password bind.
This mechanism involves sending the credentials over the network. Always use secure connections at the transport layer when you allow HTTP Basic.
- Anonymous authorization
-
The client application sends an HTTP request without authenticating.
You configure DS software either to map the HTTP request to anonymous authentication at the LDAP level, or to bind at the LDAP level as a specific user.
- OAuth 2.0 authorization
-
The client application sends an HTTP request bearing an OAuth 2.0 access token that includes at least one scope whose value makes it possible to determine the user identity.
You configure DS software to resolve the access token, and to map the user identity from the scope to an LDAP account.
This mechanism involves sending the credentials over the network. Always use secure connections at the transport layer for OAuth 2.0 authorization.
Anonymous access
In LDAP, an anonymous bind is a bind operation using simple authentication with an empty DN and an empty password. DS servers apply access controls (ACIs) to let anonymous clients access only fully public information. Examples include information about the directory server in the root DSE, and LDAP schema definitions.
By default, DS servers disable anonymous access to directory data.
ACIs take a user DN subject, ldap:///anyone
, that matches anonymous and authenticated users.
When a client accesses the directory over HTTP, anonymous operations can be mapped either to a specific user identity or to an anonymous user (default). This is set using the HTTP Anonymous authorization mechanism for the HTTP endpoint.
Simple binds
In LDAP, a simple bind is name/password authentication. The client application presents a bind DN/password combination. The DS server checks that the password matches the password on the entry with the specified bind DN.
The LDAP connection transport layer must be secure for a simple bind. Otherwise, eavesdroppers can read the credentials.
DS servers provide two alternatives to secure the connection for a simple bind, both of which depend on certificates and public key infrastructure:
- LDAPS
-
To support LDAP over SSL and TLS, DS servers have a separate connection handler that listens for traffic on a port dedicated to secure connections.
- LDAP with StartTLS
-
DS servers support using the StartTLS extended operation on an insecure LDAP port. With StartTLS, the client initiates the connection on the LDAP port, and then negotiates a secure connection.
Pass-through authentication
Pass-Through Authentication (PTA), a remote LDAP service to determine the response to an authentication request. A typical use case for PTA involves passing authentication through to Active Directory for users coming from Microsoft Windows systems.
About PTA
You use PTA when the credentials for authenticating are stored in a remote directory service. In effect, the DS server redirects the bind operation against a remote LDAP server.
The method a server uses to redirect the bind depends on the mapping from the user entry in the DS server to the corresponding user entry in the remote directory. DS servers provide you several choices to set up the mapping:
-
When both the local entry in the DS server and the remote entry in the other server have the same DN, you do not have to set up the mapping. By default, the DS server redirects the bind with the original DN and password from the client application.
-
When the local entry in the DS server has an attribute holding the DN of the remote entry, you can specify which attribute holds the DN. The DS server redirects the bind on the remote server using the DN value.
-
When you cannot get the remote bind DN directly, you need an attribute and value on the DS entry that corresponds to an identical attribute and value on the remote server. In this case, you also need the bind credentials for a user who can search for the entry on the remote server. The DS server performs a search for the entry using the matching attribute and value, and then redirects the bind with the DN from the remote entry.
You configure PTA as an authentication policy that you associate with a user’s entry in the same way that you associate a password policy with a user’s entry. Either a user has an authentication policy for PTA, or the user has a local password policy.
Set up PTA
When setting up PTA, you need to know define:
-
Which remote server(s) to redirect binds to
-
How you map user entries in the DS server to user entries in the remote directory
Secure connections
When performing PTA, you protect communications between the DS server and the authenticating server. When you test secure connections with a CA that is not well-known, make sure the authentication server’s certificate is trusted by the DS server.
If the authentication server’s CA is well-known or already trusted by the DS server, you can skip these steps:
-
Export the CA or server certificate from the authentication server.
How you perform this step depends on the authentication directory server.
-
Record the hostname used in the certificate.
You use the hostname when configuring the secure connection.
-
Import the trusted authentication server certificate into the DS server’s keystore.
Configure a PTA policy
Configure authentication policies with the dsconfig
command.
Notice that authentication policies are part of the server configuration, and therefore not replicated:
-
Set up an authentication policy for PTA to the authentication server:
$ dsconfig \ create-password-policy \ --hostname localhost \ --port 4444 \ --bindDN uid=admin \ --bindPassword password \ --policy-name "PTA Policy" \ --type ldap-pass-through \ --set primary-remote-ldap-server:remote-server.example.com:1636 \ --set mapped-attribute:uid \ --set mapped-search-base-dn:"dc=example,dc=com" \ --set mapping-policy:mapped-search \ --set use-ssl:true \ --usePkcs12TrustStore /path/to/opendj/config/keystore \ --trustStorePassword:file /path/to/opendj/config/keystore.pin \ --no-prompt
bashThe policy shown here maps identities with this password policy to identities under
dc=example,dc=com
on the authentication server. Users must have the sameuid
values on both servers. This policy uses LDAPS between the DS server and the authentication server. -
Check that your policy has been added to the list:
$ dsconfig \ list-password-policies \ --hostname localhost \ --port 4444 \ --bindDN uid=admin \ --bindPassword password \ --property use-ssl \ --usePkcs12TrustStore /path/to/opendj/config/keystore \ --trustStorePassword:file /path/to/opendj/config/keystore.pin \ --no-prompt Password Policy : Type : use-ssl ------------------------:-------------------:-------- Default Password Policy : password-policy : - PTA Policy : ldap-pass-through : true Root Password Policy : password-policy : -
bash
Assign PTA policies
You assign authentication policies in the same way as you assign password policies,
by using the ds-pwp-password-policy-dn
attribute.
Although you assign the PTA policy using the same attribute as for password policy,
the authentication policy is not in fact a password policy.
Therefore, the user with a PTA policy does not have the operational attribute |
Assign a PTA policy to a user
Users depending on PTA no longer need a local password policy, as they no longer authenticate locally.
Examples in the following procedure work for this user, whose entry is as shown below.
Notice that the user has no userPassword
attribute.
The user’s password on the authentication server is password
:
dn: uid=ptaUser,ou=People,dc=example,dc=com
uid: ptaUser
objectClass: top
objectClass: person
objectClass: organizationalperson
objectClass: inetorgperson
uid: ptaUser
cn: PTA User
sn: User
This user’s entry on the authentication server has uid=ptaUser
.
The PTA policy performs the mapping to find the user entry in the authentication server:
-
Give an administrator access to update a user’s password policy:
$ ldapmodify \ --hostname localhost \ --port 1636 \ --useSsl \ --usePkcs12TrustStore /path/to/opendj/config/keystore \ --trustStorePassword:file /path/to/opendj/config/keystore.pin \ --bindDN uid=admin \ --bindPassword password << EOF dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr = "ds-pwp-password-policy-dn") (version 3.0;acl "Allow Kirsten Vaughan to assign password policies"; allow (all) (userdn = "ldap:///uid=kvaughan,ou=People,dc=example,dc=com");) EOF
bash -
Update the user’s
ds-pwp-password-policy-dn
attribute:$ ldapmodify \ --hostname localhost \ --port 1636 \ --useSsl \ --usePkcs12TrustStore /path/to/opendj/config/keystore \ --trustStorePassword:file /path/to/opendj/config/keystore.pin \ --bindDN uid=kvaughan,ou=people,dc=example,dc=com \ --bindPassword bribery << EOF dn: uid=ptaUser,ou=People,dc=example,dc=com changetype: modify replace: ds-pwp-password-policy-dn ds-pwp-password-policy-dn: cn=PTA Policy,cn=Password Policies,cn=config EOF
bash -
Check that the user can authenticate through to the authentication server:
$ ldapsearch \ --hostname localhost \ --port 1636 \ --useSsl \ --usePkcs12TrustStore /path/to/opendj/config/keystore \ --trustStorePassword:file /path/to/opendj/config/keystore.pin \ --baseDN dc=example,dc=com \ --bindDN uid=ptaUser,ou=People,dc=example,dc=com \ --bindPassword chngthspwd \ "(uid=ptaUser)" \ 1.1 dn: uid=ptaUser,ou=People,dc=example,dc=com
bash
Assign a PTA policy to a group
Examples in the following steps use the PTA policy defined previously. The administrator’s entry is present on the authentication server:
-
Give an administrator the privilege to write subentries, such as those used for password policies:
$ ldapmodify \ --hostname localhost \ --port 1636 \ --useSsl \ --usePkcs12TrustStore /path/to/opendj/config/keystore \ --trustStorePassword:file /path/to/opendj/config/keystore.pin \ --bindDN uid=admin \ --bindPassword password << EOF dn: uid=kvaughan,ou=People,dc=example,dc=com changetype: modify add: ds-privilege-name ds-privilege-name: subentry-write EOF
bashNotice here that the directory superuser,
uid=admin
, assigns privileges. Any administrator with theprivilege-change
privilege can assign privileges. However, if the administrator can update administrator privileges, they can assign themselves thebypass-acl
privilege. Then they are no longer bound by access control instructions, including both user data ACIs and global ACIs. For this reason, do not assign theprivilege-change
privilege to normal administrator users. -
Create a subentry for a collective attribute that sets the
ds-pwp-password-policy-dn
attribute for group members' entries:$ ldapmodify \ --hostname localhost \ --port 1636 \ --useSsl \ --usePkcs12TrustStore /path/to/opendj/config/keystore \ --trustStorePassword:file /path/to/opendj/config/keystore.pin \ --bindDN uid=kvaughan,ou=people,dc=example,dc=com \ --bindPassword bribery << EOF dn: cn=PTA Policy for Dir Admins,dc=example,dc=com objectClass: collectiveAttributeSubentry objectClass: extensibleObject objectClass: subentry objectClass: top cn: PTA Policy for Dir Admins ds-pwp-password-policy-dn;collective: cn=PTA Policy,cn=Password Policies,cn=config subtreeSpecification: { base "ou=People", specificationFilter "(isMemberOf=cn=Directory Administrators,ou=Groups,dc=example,dc=com)"} EOF
bashThe
base
entry identifies the branch that holds administrator entries. -
Check that the DS server has applied the policy.
-
Make sure you can bind as the user on the authentication server:
$ ldapsearch \ --hostname remote-server.example.com \ --port 1636 \ --useSsl \ --usePkcs12TrustStore /path/to/opendj/config/keystore \ --trustStorePassword:file /path/to/opendj/config/keystore.pin \ --bindDN "uid=kvaughan,ou=People,dc=example,dc=com" \ --bindPassword bribery \ --baseDN "dc=example,dc=com" \ "(uid=kvaughan)" \ 1.1 dn: uid=kvaughan,ou=People,dc=example,dc=com
bash -
Check that the user can authenticate through to the authentication server from the DS server:
$ ldapsearch \ --hostname localhost \ --port 1636 \ --useSsl \ --usePkcs12TrustStore /path/to/opendj/config/keystore \ --trustStorePassword:file /path/to/opendj/config/keystore.pin \ --bindDN "uid=kvaughan,ou=people,dc=example,dc=com" \ --bindPassword bribery \ --baseDN dc=example,dc=com \ "(uid=kvaughan)" \ 1.1 dn: uid=kvaughan,ou=People,dc=example,dc=com
bash
-