Skip to content

Enabling global.identity.auth without a resolvable issuer renders empty issuer values chart-wide #6929

Description

@eamonnmoloney

Description

global.identity.auth.enabled=true with no resolvable issuer renders an authenticated
release whose issuer values are all empty strings, with no error and no warning. The chart
bundles no Keycloak, so nothing fills them in: global.identity.auth.issuer is empty by
default and camundaPlatform.authIssuerBackendUrl only resolves once
global.identity.auth.issuerBackendUrl or global.identity.keycloak.url.host is set.

Every component that reads those helpers is affected — Management Identity, the
Orchestration Cluster, Connectors — so a release can come up "with authentication enabled"
while no component can validate a token.

Expected vs Actual Behavior

Expected: enabling authentication without naming an issuer or an issuer backend URL fails
the render with a message naming the missing key, the way the other
templates/common/constraints.tpl checks do.

Actual: it renders. On chart 15.x (8.10):

$ helm template t . \
    --set global.identity.auth.enabled=true \
    --set identity.enabled=true \
    --set orchestration.data.secondaryStorage.type=elasticsearch
# ConfigMap <release>-identity-env-vars
CAMUNDA_IDENTITY_TYPE: "KEYCLOAK"
CAMUNDA_IDENTITY_ISSUER: ""
CAMUNDA_IDENTITY_ISSUER_BACKEND_URL: ""
# ConfigMap <release>-orchestration-configuration, application.yaml
authProvider:
  issuer-url: ""
  backend-url: ""

Derived endpoints inherit the emptiness: with type: KEYCLOAK,
camundaPlatform.authIssuerBackendUrlEndpointCerts renders the relative path
/protocol/openid-connect/certs, which is not a URL any component can fetch a JWKS from.

Motivation / Use Case

This is a silent misconfiguration that surfaces only at runtime, as token validation
failures across several components at once, with nothing in the rendered manifests
obviously wrong other than a few empty strings. templates/common/constraints.tpl already
fails fast on comparable states (global.topology.mode=orchestration without
global.identity.service.url, mode=optimize without a database backend), so the pattern
and the place for the check both exist.

Optimize has since gained a check of its own: PR #6884 fails the render when Optimize
authenticates and neither an issuer nor an issuer backend URL resolves. That check is
deliberately scoped to Optimize, because widening it was out of that PR's scope — five
pre-existing unit test cases in test/unit/common, test/unit/identity and
test/unit/optimize enable global auth incidentally, without ever naming an issuer, and
would have needed changing. Generalising the guard means deciding whether to accept that
blast radius chart-wide.

Acceptance Criteria

  • Decide whether the empty-issuer state should fail the render chart-wide, or only
    warn (camundaPlatform.warning), given that it changes rendering for existing
    values files that enable global auth before configuring a provider.
  • If it should fail: one constraint in templates/common/constraints.tpl, gated on
    global.identity.auth.enabled and an unresolvable issuer, replacing the
    Optimize-only check from feat(8.10): add an optimize release role that owns its OIDC identity #6884 so there is a single rule.
  • Unit tests on both sides of the boundary: rejected with nothing resolvable, accepted
    with an External Keycloak that resolves through global.identity.keycloak.url.host
    and leaves issuer empty (a supported shape — do not break it).
  • Update the pre-existing test cases that rely on the current permissiveness.
  • Decide whether this needs an upgrade note in camunda-docs for anyone whose values
    file currently renders and would then fail.

Additional Context

The External Keycloak shape must keep working: global.identity.auth.issuer empty with
global.identity.keycloak.url.host set is documented in values.yaml
("External Keycloak: leave empty") and derives every endpoint from the host. So the
condition is "no issuer and no resolvable issuer backend URL", not "no issuer".

References

  • PR feat(8.10): add an optimize release role that owns its OIDC identity #6884 — the Optimize-scoped version of this check
    (templates/common/constraints.tpl, optimize.effectiveAuthIssuer /
    optimize.effectiveAuthIssuerBackendUrl)
  • templates/common/_helpers.tplcamundaPlatform.authIssuerBackendUrl,
    camundaPlatform.authIssuerUrlWithFallback,
    camundaPlatform.authIssuerBackendUrlEndpointCerts

Environment

  • Platform: any (render-time only)
  • Helm CLI version: 4.2.4
  • Chart version: camunda-platform-8.10 (15.x); the helpers are unchanged in earlier
    supported versions, so it likely reproduces there too

Metadata

Metadata

Assignees

No one assigned

    Labels

    component/helmkind/bugSomething isn't working as intendedlikelihood/midObserved occasionallyseverity/midMarks a bug as having a noticeable impact but with a known workaroundtriage:completedversion/8.10Camunda applications/cycle version

    Type

    No type

    Fields

    Urgency

    planned

    Projects

    Status
    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions