Files
freeipa/doc/designs/sysaccounts.md
T
Alexander Bokovoy 24e4fd5c0c Add system accounts (sysaccounts)
Introduce support for LDAP-based system accounts by adding a dedicated
sysaccount plugin with full CLI commands, extending role membership to
include system accounts, and providing warnings for passsync
configuration updates across servers, along with corresponding
documentation and tests.

New Features:

    Implement system accounts LDAP object with CLI commands for add,
delete, modify, find, show, enable, and disable.

Enhancements:

    Extend role and baseldap plugins to support sysaccount membership
and manage passsync managers with a ServerSysacctMgrUpdateRequired
warning.

Documentation:

    Add a design document for system accounts and regenerate API docs
for sysaccount commands and role membership.

Tests:

    Update existing role and service plugin tests to cover sysaccount
membership.

Fixes: https://pagure.io/freeipa/issue/9842

Signed-off-by: Alexander Bokovoy <abokovoy@redhat.com>
Reviewed-By: Rafael Guterres Jeffman <rjeffman@redhat.com>
Reviewed-By: Thomas Woerner <twoerner@redhat.com>
Reviewed-By: Florence Blanc-Renaud <frenaud@redhat.com>
2025-11-03 17:18:05 -05:00

13 KiB

LDAP system accounts

Overview

Two important FreeIPA components are LDAP server and Kerberos infrastructure. When Kerberos protocol is used for authentication in FreeIPA deployments, context of the original authentication is preserved. This allows applications to inspect it and make decisions based not only on user identity but also how the original authentication has happened. For applications that do not support integration with Kerberos, a traditional LDAP bind is used. In this case, the original authentication context is lost and the application can only see the identity of the user that has authenticated.

Applications which do not support Kerberos authentication also need to authenticate to the LDAP server. This is typically done using an LDAP system account. They are not used in the POSIX environment and are not associated with any user. System accounts are typically used by applications to authenticate to the LDAP server and perform operations on behalf of the application.

This document describes the design of the system accounts in FreeIPA.

Use Cases

Use Case 1: Legacy Application authentication

A legacy application that does not support Kerberos authentication needs to authenticate to the LDAP server. The application uses an LDAP system account to authenticate to the LDAP server. After successful authentication, the application can perform operations on behalf of the system account.

Use Case 2: External account password rotation

An external system controls the passwords of user accounts in FreeIPA. The external system uses an LDAP system account to authenticate to the LDAP server and change the password of a user account. The change of the user account's password should not trigger the password policy reset for the user account.

How to Use

LDAP system account is addressed by its LDAP DN. An application can bind to LDAP by presenting both LDAP DN of the object to bind as and its password. The password is stored in the userPassword attribute of the system account object.

A typical LDAP authentication operation with the system account would look like this:

$ ldapsearch -D "uid=system-account,cn=sysaccounts,cn=etc,dc=example,dc=com" -W -b "dc=example,dc=com" -s sub "(objectclass=*)"

In the ldapsearch command above, the system account uid=systemaccount,cn=sysaccounts,cn=etc,dc=example,dc=com is used to authenticate to the LDAP server. Its password is not provided directly but ldapsearch command will prompt for it due to -W option.

If the system account is used to perform LDAP operations, the system account should have the necessary permissions to perform the operation. The permissions are granted using the LDAP access controls (ACIs).

Design

System Account LDAP Object

System account object is a regular LDAP entry with at least two object classes defined: account and simpleSecurityObject. The object is stored in the cn=sysaccounts,cn=etc container. In order to allow membership in groups and roles, object class nsMemberOf can be used. The object has the following attributes:

  • uid: The unique identifier of the system account.

  • userPassword: The password of the system account.

  • description: A human-readable description of the system account.

  • memberOf: The groups and roles the system account is a member of, in case the nsMemberOf object class is used.

Other attributes can be added to the system account object as needed but they aren't used by the system account itself.

Implementation

LDAP BIND Operation

FreeIPA provides a number of plugins that alter the behavior of the LDAP server. One of these plugins is the ipa_pwd_extop plugin. This plugin is used to intercept the LDAP BIND operation and perform additional checks and operations. In particular, this plugin enforces two-factor authentication for the user accounts if EnforceLDAPOTP global option is set or LDAP client enforced the check through an LDAP control.

When EnforceLDAPOTP mode is enabled, any LDAP bind must be performed with a user account that has two-factor authentication enabled. This would break LDAP binds with system accounts as they do not have two-factor authentication enabled. ipa_pwd_extop plugin accounts for this by checking that the LDAP object pointed by the LDAP bind has simpleSecurityObject object class. If the object does have this object class, the plugin allows the bind to proceed.

Password modifications using system accounts

FreeIPA implements a password change policy that ensures only users can keep the passwords they changed. If a password change came from any other source, it will be marked for a change next time it is used. For example, an administrator may reset a user's password but this password will have to be changed next time user authenticates to the system. This is enforced through both LDAP and Kerberos authentication flows.

In order to allow external systems to synchronize passwords without triggering the password reset, FreeIPA implements two exceptions:

  • cn=Directory Manager can change passwords without marking them for a change.

  • LDAP objects whose DNs are stored in the passSyncManagersDNs attribute of the cn=ipa_pwd_extop,cn=plugins,cn=config LDAP entry can change passwords without marking them for a change.

The latter exception is used internally by the FreeIPA replication system to synchronize data from Windows domain controllers with the help of PassSync plugin. However, both of these exceptions also avoid password policy checks for the new passwords.

In order to differentiate the passSyncManagersDNs and the system accounts, we introduce a separate attribute SysAcctManagersDNs. The system accounts DNs can be added to the SysAcctManagersDNs attribute to allow them to update user passwords without marking them for a change.

Members whose DNs are stored in SysAcctManagersDNs attribute will have the following semantics in ipa_pwd_extop processing of the password changes:

  • the password change will be subject to the password policy associated with the user account, like for the normal user password changes;

  • the password change initiated by the system account will not force expiration of the user's password unlike the administrator-initiated password change.

The LDAP entry cn=ipa_pwd_extop,cn=plugins,cn=config is not replicated. Every IPA server has its own configuration. If more than one server needs to allow a way to modify passwords without reset, each server's configuration must be updated.

Access controls

To simplify administration of the system accounts, a new privilege System Accounts Administrators is added. This privilege is granted by default to the Security Architect role.

The privilege gives access to the following separate permissions:

  • System: Add System Accounts: allows to create system account objects
  • System: Check System Accounts passwords: allows to check whether system accounts have passwords defined
  • System: Modify System Accounts: allows to update system account information, including a password
  • System: Remove System Accounts: allows to remove the system account

The system account itself needs to be permitted to modify user passwords. To help with that, a role management is extended to allow system accounts membership. Thus, a corresponding permission (System: Change User password) can be associated through the privilege system and granted via the role.

Even when a system account is granted permission to modify user accounts, treating the change to not cause a password reset needs an explicit buy-in, as described in the previous session.

In order to provide the management of the SysAcctManagersDNs attribute, FreeIPA defines two additional permissions:

  • Modify System Account Managers Configuration permission allows adding and removing DNs to and from the SysAcctManagersDNs attribute.

  • Read System Account Managers Configuration permission allows reading the SysAcctManagersDNs attribute.

Both these permissions are granted to the System Accounts Administrators privilege and, through that privilege, to the Security Architect role. Members of admins group are not members of the Security Architect role by default. Instead, they are added to the System Accounts Administrators privilege through the 'Replication Administrators' privilege.

The following sequence will allow a system account my-app to change user passwords:

$ kinit admin
$ ipa sysaccount-add 'my-app' --random
$ ipa privilege-add 'my-app password change privilege'
$ ipa privilege-add-permission 'my-app password change privilege' \
                  --permission 'System: Change User password'
$ ipa role-add 'my-app role'
$ ipa role-add-privilege 'my-app role' \
             --privilege 'my-app password change privilege'
$ ipa role-add-member 'my-app role' --sysaccounts 'my-app'
# In order to allow password changes without reset:
$ ipa sysaccount-policy 'my-app' --privileged=true

Feature Management

CLI

Command Options Description
sysaccount-add name Create LDAP object for a new system account
sysaccount-del name Remove LDAP object used for the system account
sysaccount-find [name] Return list of existing system accounts
sysaccount-mod name Modify settings for the system account
sysaccount-policy name Update SysAcctManagersDNs configuration
sysaccount-enable name Allow use of system account for LDAP BIND
sysaccount-disable name Disable use of system account for LDAP BIND

The following commands provide an additional --privileged=TRUE|FALSE option: sysaccount-add, sysaccount-mod, and sysaccount-policy. This option is used to allow a system account to update user passwords without forcing them being requested to change on the next login by the user. This is done by adding the DN of this system account to the list of DNs allowed to manage password synchronization (SysAcctManagersDNs LDAP attribute) of the ipa_pwd_extop plugin.

In order to allow adding system accounts to roles, role object has been extended to allow membership of system accounts. The command ipa role-add-member 'my-role' --sysaccounts 'my-account' will make sure to grant my-account system account all privileges associated with the my-role role.

An example of running ipa sysaccount-add -v my-app --random --privileged=true, where -v option allows to see the INFO level message that shows bind DN of the created system account:

$ ipa sysaccount-add -v my-app --random --privileged=true
ipa: WARNING: Password reset permission is local to server server.ipa.test.
Restart the Directory Server services on it. Run the 'sysaccount-policy'
command against each server you want to allow or disable to reset passwords on.
ipa: INFO: To bind to LDAP with system account 'my-app', use the bind DN 'uid=my-app,cn=sysaccounts,cn=etc,dc=ipa,dc=test'.
------------------------------
Added system account "my-app"
------------------------------
  System account ID: my-app
  Random password: <some value>

Due to the fact that SysAcctManagersDNs configuration setting is not replicated across IPA servers, the update of the configuration will issue a warning to make sure to update other IPA servers as well. It will also tell that an LDAP server on the specific server where command was executed must be restarted to apply changes to the ipa_pwd_extop plugin configuration.

Typically, external consumers of the system accounts operate against a single IPA server, thus changing the configuration at a single system is enough. As mentioned earlier, ipa_pwd_extop plugin configuration is not replicated and must be modified on each IPA replica. IPA command line tool, ipa, can be run on the individual IPA server to force connection to that specific server.

Command sysaccount-del will automatically remove the deleted system account reference from the ipa_pwd_extop configuration, if any. However, it will only be done on the single master. Thus, it is recommended to remove the entry from all affected IPA servers using ipa sysaccount-policy before removing the system account with sysaccount-del command.

Three examples below demonstrate different ways to perform the policy operation on a system account in order to affect a specific IPA server's ipa_pwd_extop plugin configuration:

  1. Use ipa tool as unprivileged user with administrative Kerberos ticket:
... ssh to ipa-server
[ipa-server] $ kinit admin
[ipa-server] $ ipa sysaccount-policy my-app --privileged=true
  1. Newer ipa tool implementations might provide --force-server <server-name> option that allows to choose the server to communicate with:
$ kinit admin
$ ipa --force-server ipa-server sysaccount-policy my-app --privileged=true
  1. Run ipa tool as the privileged root user on the IPA server:
... login as root on the ipa-server
[ipa-server] # ipa -e in_server=true sysaccount-policy my-app --privileged=true

In the latter example ipa tool will directly connect to LDAPI endpoint and POSIX root user will be mapped to cn=Directory Manager LDAP administrator account. This approach also works for deployments where Kerberos infrastructure is temporarily unavailable.