CBOM Documentation

CBOM Secure

  • Product Overview
    • Overview
    • Dashboard Interface
    • Dashboard Operations
    • Data Visualization
    • Overview
    • Host
    • Template
      • Networked Deployments
      • Cloud Deployments
      • Off-Grid Deployments
    • Discovery History
      • Tags
      • Tag Scope
      • Integrations
      • Cloud Servers
      • CycloneDX Export
    • Sensors Reference
    • Overview
    • Summary Report
    • PQC Report
    • AI Services
    • Source Code Visualizer
    • Key
    • Certificate
    • CipherSuites
    • Analysis
    • Policy Management
    • User Policy
    • Standard Policy
    • Overview
    • Cases
    • Criteria
    • Notification Format
    • Rules
      • Connections
      • Health
    • User Management
    • Roles & Permissions
    • Audit Trail
    • System Logs
    • Top Bar and User Menu
    • System Configuration
  • Login and Authentication
    • Introduction
      • Components
      • Data Flows
      • Execution Models
      • Incremental Scanning
      • Security Model
      • Topologies
      • Sizing Guide
      • HA and Scaling
      • Ports and Firewall
      • Prerequisites
      • Docker Compose
      • Native on Linux
      • Deployment Server
      • Install Troubleshooting
      • Validation Checklist
      • Managing Services
      • Logging
      • Certificates
      • Configuration
      • Backup and Recovery
      • Ops Troubleshooting
      • Methods
      • SAML 2.0 SSO
      • OIDC and Entra ID
      • Token Authentication
      • Password Policy
      • Sensor vs Connector
      • Sensor Guide Structure
      • Capability Matrix
      • GitHub Sensor
        • AWS
        • Azure
        • Google Cloud
        • Active Directory
        • LDAP Directories
        • AD CS
        • Thales Luna HSM
        • Entrust nShield HSM
        • HashiCorp Vault KMIP
        • Windows Cert Store
        • Linux Trust Store
        • MSSQL TDE
      • Roadmap
      • Integration Model
      • CrowdStrike
      • ServiceNow
      • ServiceNow and Jira Setup
      • Notification Engine
  • Administrative Guide
    • Glossary
    • Configuration Reference
    • Data Model Reference
    • API Reference
    • API Authentication
    • CycloneDX Export Specification
    • Risk and PQC Scoring
    • Built-in Standards
    • Widget Catalogue
    • AI Services Data Handling

API Authentication

How to obtain a credential, present it, keep it alive, and what governs whether a request is allowed. This page covers the user-facing API; agent submission to the collector uses a different mechanism, described in Token Authentication.

The model

CBOM Secure delegates identity to Keycloak and holds the resulting session on the server. A client never handles a Keycloak token directly: it receives an opaque session identifier and presents that.

PropertyValue
SchemeAuthorization: Bearer {session_id}
CredentialAn opaque session identifier, not a JWT
ResolutionIn-process against the session manager — no identity-provider round trip per request
LifetimeConfigurable; 900 seconds by default
StorageServer-side

Because the credential is opaque and resolved locally, per-request latency does not depend on the identity provider, and a client cannot read or forge claims from it.

Obtaining a session

MethodPathPurpose
POST/auth/loginAuthenticate and receive a session_id
POST/auth/refreshRotate the session — issues a new session_id and invalidates the old one
POST/auth/auto-renewExtend the current session in place — same session_id
GET/auth/validateTest whether the current session is still valid
GET/auth/logoutInvalidate the session and sign out of the identity provider

Sign in:

curl -sS -X POST https://cbom.example.com/cbomsrv/api/v1/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"username":"svc-reporting","password":"..."}'
{
  "status": 0,
  "message": "OK",
  "data": { "session_id": "b6f1…", "expires_in": 900 }
}

Call an endpoint:

curl -sS https://cbom.example.com/cbomsrv/api/v1/hosts/ \
  -H 'Authorization: Bearer b6f1…'

Keeping a session alive

Two distinct operations, and the difference matters to a client that caches the identifier:

OperationIssues a new identifierUse when
/auth/refreshYes — the old one is invalidated immediatelyRotating on a schedule, which is what the console does
/auth/auto-renewNo — the same identifier gains a later expiryExtending without disturbing anything holding the identifier

The console rotates every four minutes against a 900-second lifetime, so a session is renewed several times before it could expire. A script should renew at roughly half the configured lifetime.

Handle a 401 from an ordinary endpoint by refreshing once before concluding the session is dead. The body carries expired: true when a valid credential has merely timed out. A session past its expiry is retained for a grace period while a refresh token is present, so a client that was briefly offline can recover rather than being forced to sign in again.

A network error is not an expiry. A request that receives no response at all says nothing about the session. Treat a transport failure as a transport failure and retry; discarding the session on a connection error causes spurious sign-outs.

Two more behaviours worth building for:

  • A single failed renewal must not cancel the renewal schedule. The session may still be valid and the next attempt may well succeed.

  • If two renewals race, one wins and the other receives a 401 from /auth/refresh itself. Before discarding the session, check whether the stored identifier has already changed — a concurrent refresh may have succeeded.

Single sign-on

Interactive sign-in can be federated to an external identity provider; Microsoft Entra ID is supported as a configured provider. The browser flow is standard OIDC: the console redirects to the provider, the provider returns to the platform, and the platform issues a session identifier exactly as it does for a password sign-in. From the API's point of view nothing differs — the credential is the same opaque identifier.

Multi-factor authentication, password policy and lockout thresholds are enforced at the identity provider, not in CBOM Secure. The platform holds no user passwords: only a subject reference, the user record and the role assignment.

Service integrations that cannot complete a browser flow should use a dedicated account with a password sign-in and the narrowest role that covers their calls.

Authorisation

Authentication establishes who is calling; authorisation decides whether that caller may make this call. The two are separate, and both are enforced on the server.

Roles and scopes

A role is a named set of scopes — single permissions such as policy:delete or host:read. The product defines scopes in these groups:

GroupCovers
User ManagementReading, creating, editing and deleting users
Roles & PermissionsReading and changing the role-to-permission map
UI PreferencesPer-user display settings
System ConfigurationReading, editing and activating configuration; service restart
Discovery — HostsHost inventory and CSV import
Discovery — Cloud ServersCloud discovery targets and drafts
Discovery — Task TemplatesTemplates and sensor schemas
Discovery — TasksTask definition and execution
Discovery — Off-gridBundle generation and result import
Discovery — IntegrationsIntegration records, synchronisation, duplicate resolution
Discovery — Tags / Tag ScopesTag definitions and named tag expressions
Cryptographic MaterialsInventory and history reads
Policy — User PoliciesPolicy authoring
Policy — Standard PoliciesThe shipped baselines
Dashboards/LayoutsLayouts, templates and export
NotificationsRules, destinations, templates, cases
DeploymentDeployment history
Audit TrailReading and exporting the audit trail
AI ServicesAccess to the assistant
Source Code VisualizerAccess to the visualizer's data

The full catalogue, with the display name and description of every scope, is available from GET /admin/permissions/catalogue, and the Roles & Permissions page edits the map.

How the check runs

The permission map is the API's own control, not a hint to the interface. Changing a role's permissions changes what the API accepts for holders of that role — a permission removed from a role is refused for that role at the API, not merely hidden in the console.

ResponseMeaning
401No session, or the session has expired
403Authenticated, but no role held by this session carries the required scope

Three behaviours are deliberate:

  • A failed permission lookup allows the request and records that it did. "This caller lacks the permission" and "we could not determine what this caller has" are different answers. Denying on a transient database fault would lock out every user including the administrator who would fix it, so the second case is recorded as degraded rather than treated as a denial.

  • The administrator floor cannot be removed. The permission map is replaced wholesale by PUT /admin/permissions. Without a floor, an administrator could remove their own permission to manage permissions and lock everyone out of the page that would undo it. The scopes permission:read, permission:manage and user:read are always retained for the administrator role.

  • Authorisation mode is not editable from the console. It governs the check that protects the System Configuration page, and a page that authorisation protects must not be able to switch authorisation off.

Reference reads

A small number of endpoints are readable by any signed-in user because they are reference data the console needs to render at all — the role list, the branding and display settings, the sensor schema reference. These carry no inventory content.

Rate limiting and request size

Rate limits and body-size limits are applied at the reverse proxy rather than in the application, so they are part of the deployment's own configuration:

Path classLimit
Authentication endpointsPer-client request rate limit
IngestionRate limited; body size unbounded by default, since result batches are large
API generallyRequest body capped
Long-running operationsProxy read timeout raised to accommodate them

Exact values are deployment-specific. Check the reverse proxy configuration for the deployment rather than assuming the defaults.

Practical guidance for integrations

  • Use a dedicated service account with the narrowest role that covers the calls it makes, rather than an administrator account.

  • Renew at roughly half the configured session lifetime; do not wait for a 401.

  • Treat status in the body and the HTTP code as a pair.

  • Send no credential in a URL or query string.

  • Expect masked values on credential fields, and do not write a mask back as if it were a value.

  • Paginate. Every list endpoint enforces a maximum page size, so an integration that assumes it received everything in one call will silently process a subset.

On this Page:
Support Privacy Policy Terms of Service

Copyright 2026 Encryption Consulting LLC. All rights reserved.