Skip to main content
Version: 26.1

Audit logs

Audit logs provide a structured record of administrative activity across the Authorization Hub. They are designed to answer critical security questions, such as: "Who modified this policy and when?" or "Who accessed the system and what did they do?"

The system generates audit logs for all CRUD (Create, Read, Update, Delete) operations involving authorization components, policy insights, and user management. Furthermore, logs capture critical identity and access management events occurring within Keycloak.

Logs are produced in JSON format and displayed in the console, allowing for seamless integration with the external observability or SIEM (Security Information and Event Management) system of your choice.

At a high level, each event consists of the following fields:

Log componentJSON keyDescription
Action"operation"The specific operation that was performed.
See Audit log operations for details.
Resource"resource"The object that was created, read, updated, or deleted.
Examples: project, policy, domain.
Result"result"Indicates the outcome of the action.
Actor"user"The user or client that performed the action.
Timestamp"event_timestamp"When the event occurred (UTC, ISO 8601).
Details"details"Additional metadata, such as IDs, names, operation results, or error indicators.
tip

Keycloak is configured to output logs in ECS JSON format and the audit payload to be parsed by the log pipeline is embedded in the "message" field. See the Keycloak events section below.

Data privacy & security

Audit logs are designed to be safe for export and compliant with global privacy best practices:

  • Anonymized actors: Actors are identified only by technical identifiers, such as an externalUserId (UUID). Personally Identifiable Information (PII), including usernames, emails, and full names, is never recorded.
  • No sensitive data: Log payloads exclude passwords, API keys, shared secrets, and other sensitive configuration values.

Audit log operations

OperationDescription
dictionary.attribute.getGet all active attributes from the dictionary.
dictionary.attribute.get.by.fqnGet an attribute by its FQN.
dictionary.attribute.get.by.idGet an attribute by its unique ID.
dictionary.attribute.createCreate a new attribute.
dictionary.attribute.updateUpdate an attribute.
dictionary.attribute.deleteDelete an attribute.
dictionary.attribute.exportExport all active attributes.
dictionary.attribute.importImport attributes.
dictionary.namespace.getGet all namespaces used in the dictionary.
dictionary.cacheprofile.getGet all cache profiles.
dictionary.cacheprofile.createCreate a new cache profile.
dictionary.cacheprofile.get.by.nameGet a cache profile by its name.
dictionary.cacheprofile.updateUpdate a cache profile.
dictionary.cacheprofile.deleteDelete a cache profile.
connector.getGet all attribute connectors.
connector.get.by.fqnGet an attribute connector by its FQN.
connector.get.by.idGet an attribute connector by its unique ID.
connector.get.by.attributesGet all attribute connectors that use specific attributes.
connector.createCreate a new attribute connector.
connector.updateUpdate an attribute connector.
connector.deleteDelete an attribute connector.
connector.exportExport all attribute connectors.
connector.importImport attribute connectors.
domain.listGet all domains.
domain.get_by_idGet a domain by its unique ID.
domain.get_by_nameGet a domain by its name.
domain.composeCompose an authorization domain.
domain.copyCopy a domain.
domain.storeStore a domain.
domain.rollbackRolls back domain name.
domain.history.listGet domain history by name.
domain.metadata.listRetrieve the metadata of all domains under a specified namespace.
policyfile.getGet a specific file content from a policy package.
policypackage.getGet a policy package by name.
policypackage.createCreate a policy package.
policypackage.updateUpdate a policy package.
project.getGet all projects.
project.createCreate a project.
project.updateUpdate a project.
project.leaveLeave a project.
principal.user.getGet all users.
principal.user.get.by.idGet a user by their unique ID.
principal.user.get.by.emailGet a user by their email.
principal.user.createCreate a user.
principal.user.updateUpdate a user.
principal.user.meGet the details of the currently authenticated user.
principal.client.getGet all M2M clients.
insights.template.getGet all templates.
insights.template.get.by.nameGet a template by its name.
insights.template.get.by.idGet a template by its unique ID.
insights.template.createCreate a template.
insights.template.updateUpdate a template.
insights.template.deleteDelete a template.
insights.report.getGet all reports.
insights.report.get.by.idGet a report by its unique ID.
insights.report.createCreate a report.
insights.endpoint.getList configured endpoints.

Keycloak events

Keycloak user events, such as logins and logouts, are mapped to auth.<event_type>. For example:

  • auth.login
  • auth.logout
  • auth.code_to_token.
note

Success and failure share the same operation name. To distinguish the outcome, the result field (SUCCESSFUL / FAILURE) is used.

Keycloak admin events are mapped to identity.<resource_type>.<operation_type>. For example:

  • identity.client.create
  • identity.identity_provider.update

Disable audit logs

Audit logs are enabled by default. Follow the steps below to disable them.

Important

This procedure requires Tenant Admin privileges.

  1. Navigate to the kubernetes/charts directory and upgrade the Helm chart configuration:

    helm upgrade hub \
    -f hub/values.yaml hub \
    --set services.apiGateway.env.auditEnabled=false
    --set services.adm.env.auditEnabled=false
    --set services.hubService.env.auditEnabled=false
  2. Access the Keycloak administration console

    tip

    Read the Access Keycloak section for instructions.

  3. In the sidebar menu, under the Configure section, click Realm settings.

  4. Switch to the Events tab. Under Event listeners, remove hub-audit-logging from the list.

  5. Click Save.