Repository navigation
Conversation
… agent side D30 check #2 now needs the jwt-validation plugin in the inbound pipeline of every managed service: it is the only plugin that validates the token and sets input.identity. Under agent side the checks #1 and #2 now also run for tools (a tool needs only jwt-validation inbound; its pass-through CR needs no opa or mcp-parser), and #6 stays for agents only. The outbound plugins are required for agents only. The failure semantics do not change (409, DLQ, no rollback, no quarantine). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Oleg Blinder <oblinder@gmail.com>
…ence Under agent side a tool gets a pass-through CR, so only AuthBridge jwt-validation protects its inbound. The operator attaches each workload's audience scope to the login clients in PLATFORM_CLIENT_IDS, so their user tokens reach the tool with no AIAC check. The IdP Configuration Service gets the read-only endpoint GET /platform-clients/tool-audiences. For each PLATFORM_SOURCE_CLIENTS login client it reads the default and optional client scopes (mappers from one realm scope list) and the mappers on the client itself, and lists each oidc-audience-mapper that puts a managed tool's clientId into the access token. The IdP library gets get_platform_tool_audiences and the PlatformToolAudience model. The new helper warn_platform_tool_audiences logs one WARNING for each link, under agent side only. It runs at a tool's onboarding after the build and at each Controller start after the resync. It is best effort: a failure is logged and never stops the onboarding or the start. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Oleg Blinder <oblinder@gmail.com>
…arning Update the PRD (D30, D31, the known limits, the platform prerequisites and the unit-test table), the UC1 onboarding spec (the scope table for each side and the new warning section), the AIAC Agent start sequence, the IdP Configuration Service endpoint and the IdP library method. Also update the runbook, the deploy parameters, the k8s comments, the demo tool page, the UC1 testing doc and the system-test hint text. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Oleg Blinder <oblinder@gmail.com>
- Check #2 (D30) counts a required plugin only when its entry enforces: on_error off (cortex does not run it) or observe (cortex ignores its Reject) fails the check. A bare plugin name counts as enforce, as in cortex. An unquoted YAML `off` is read as off. - Replace the leaked "C2" label of the login-client audience warning with "D30" (C2 already names the hand-disabled client limit). - Docs: precise inbound plugin needs for each side and type (runbook, enable script, uc1), the D20 deny only where the inbound has opa, the agent-side known limit for a tool namespace with no opa, the warning step order in the UC-1a flow, the aiac-agent.md file tree, the PRD link anchor, login_client naming, and the PRD 9 library test row. - Tests: on_error values, the bare-name form, the de-duplication of one mapper with both audience keys, and no line breaks in the read-failure warning. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Oleg Blinder <oblinder@gmail.com>
Pyright flagged the name from a map entry as possibly None. An entry without a string name cannot be a required plugin, so check #2 skips it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Oleg Blinder <oblinder@gmail.com>
oblinder
force-pushed
the
fix/inbound-auth-checks
branch
from
October 11, 2026 23:42
081f2c6 to
e44c295
Compare
The operator attaches a workload's audience scope to the clients in its PLATFORM_CLIENT_IDS list, which is empty by default and not set on the Kind setup. So a default install gets no login-client audience warning. Correct the claim that the link is made for every tool by default. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Oleg Blinder <oblinder@gmail.com>
oblinder
added a commit
that referenced
this pull request
Oct 12, 2026
Bring in the PR #234 doc fix: the operator links audience scopes only for the clients in PLATFORM_CLIENT_IDS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Oleg Blinder <oblinder@gmail.com>
oblinder
marked this pull request as draft
October 13, 2026 08:33
Contributor
Author
omerboehm
added a commit
that referenced
this pull request
Oct 20, 2026
refactor(policy): target-side access control only (replaces #234)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two onboarding checks that close gaps in how a managed service's inbound is protected, on both enforcement sides.
1. PRD D30 check #2 requires an enforcing
jwt-validationinbound, and tools are checked under agent side.Why: under agent side a tool gets a pass-through CR, so
jwt-validation(signature, issuer,aud= the tool's own client ID) is the only thing in front of it. Without it the tool is fully open. Under target side a missingjwt-validationalready fails closed (no identity, PRD D27), but it is now caught at onboarding. The failure semantics do not change:EnforcementPreconditionErrorbefore the bootstrap, 409 withfailed_checks, DLQ for NATS.2. A warning when a platform login client can mint tokens for a tool (agent side only).
sequenceDiagram participant C as Controller participant I as IdP Configuration Service participant K as Keycloak C->>I: GET /platform-clients/tool-audiences?client_id=TOOL_ID I->>K: read the login clients in PLATFORM_SOURCE_CLIENTS, their scopes and mappers I-->>C: items of login_client, scope, link, mapper, tool_client_id Note over C: one WARNING per item, under agent side only, never raisesThe operator attaches each workload's
agent-<ns>-<workload>-audscope to every client inPLATFORM_CLIENT_IDSas a default scope. Then that login client's user tokens pass the tool'sjwt-validationand, under agent side, reach the tool through its pass-through CR with no AIAC check. The match is by theoidc-audience-mapperconfig (included.client.audience/included.custom.audience), not by the scope name. It runs after a tool's onboarding build and at the Controller start after the resync. Under target side there is no warning: the tool's inbound has no platform-client bypass, so such a token is denied there.Docs: PRD D30, known limits, UC-1a flow, §9; the uc1, aiac-agent, idp-configuration-service and library-idp specs; the runbook,
deploy.md, the k8s comments, the github-tool demo spec.Evidence
origin/maincode, the new tests oftest_preconditions.py):access.token.claimper Keycloak, one realm scope read, 502 on a Keycloak error, read-only), the library method, and the helper (agent side only, one warning per link, a failure never raises, no line breaks in log values).-m system, 102 tests collected): not run on either side. The deploy of this PR's images to the Kind cluster was blocked, so the cluster still runs an older AIAC build. A run against that build would not test this PR. The Kind overlay and the chart default pipeline already havejwt-validation(map form, defaulton_error), so a valid setup passes check Chore(deps): Bump python from 3.12-slim to 3.14-slim in /src/aiac/policy/model_store/service #2 unchanged..venv/bin/pytest -m system -rs, not run. 0 passed, 0 failed, 0 skipped. C1/C2: not observed. The precondition for C1 is present:k8s/opa-kind-verify.shpasses, and theteam1inbound pipeline hasjwt-validation(defaulton_error),mcp-parserandopa..venv/bin/pytest -m system -rsafter a clean redeploy withAIAC_ENFORCEMENT_SIDE=agent-side, not run. 0 passed, 0 failed, 0 skipped. C1/C2: not observed. Expected C2 result on this cluster: no WARNING, because the operator'sPLATFORM_CLIENT_IDSis not set, so no login client holds a tool audience.Merge Danger
Door: two-way
Revert the commits to restore the old checks. Nothing is stored or migrated.
Blast Radius: onboarding
jwt-validationinbound now fails with 409, on both sides. So does a tool under agent side with no sidecar.PLATFORM_CLIENT_IDSnames the login client (empty by default). This is a log line only.PLATFORM_CLIENT_IDS; a tool under agent side is not required to haveopainbound, so in such a namespace PRD D20 cannot deny a tool that has no CR.🤖 Generated with Claude Code