access-engine/docs/task-execution-initiating-provider-contract.md
tegwick 24c1f56f00
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Build and Publish Container Image / build-and-push (push) Successful in 58s
Add proposed task execution policy and initiating identity contract
Assistant: codex
Assistant-Model: gpt-6.1-sol
Assistant-Session: 01a126e1-76f8-7643-8cf3-e93336539ade
2026-10-11 19:06:01 +02:00

97 lines
6.2 KiB
Markdown

# Proposed Secrets exact execution policy and initiating-provider boundary
Prepared for Secrets SECRETS-WP-0013-T01 and Platform RPF-WP-0035-T12.
This is a proposed Access source contract. It adopts no new identity protocol,
issuer/client/key, runtime provider, source standard or native entitlement.
## Why the separate policy exists
Lifecycle v2 deliberately serves twelve generic operations. Existing apply
ignores execution_contract and its service subject cannot prove which human
initiated a task. The new package secrets-engine.task-execution v1 recognizes
only execute-ccr and is separate from secrets-engine.catalog-lane.lifecycle v2.
The entire execution descriptor, including operation/CCR/grant/catalogue/source,
ordered two-object read/write/readback plan, budget and deadline, participates in
existing canonical request and approval-free digest joins. No translation to
apply and no service administrative grant occurs.
The shipped source package is deliberately closed: owner_admission is a literal
false. An unsigned verified, owner_admission or human_control request flag cannot
open it. Synthetic future-provider tests replace that literal in an isolated
in-memory package only; those allows are not runtime admission or native evidence.
This is an enforced refusal until the identity boundary exists, not a switch to
turn on once a human approves a proposal.
## Reuse the actual providers
* KeyCape owns authentication/MFA and RS256 access-token issuance. Reuse
docs/approval-engine-auth-contract.md and docs/tenant-claim-contract.md from
KeyCape: exact issuer/audience/subject/principal_type/tenant/tenant_source,
expiry and assurance level/mfa/source/at. internal/taskexecution's proposed
source verifier consumes the token out of band using locally owner-pinned RSA
keys, trusted server time and no JWT-selected discovery URL. It returns an
opaque Initiator, never a token or an authorization decision. No real issuer,
key or client is installed in the source. Human initiating audience/client
admission is still missing; an approval-engine access audience cannot silently
be reused for task execution.
* Access's existing callerauth TokenReview choke point authenticates the service
transport and binds secrets-engine to its exact Kubernetes principal. It does
not authenticate the request's subject human or prove representation. Reuse
that authenticated server identity, never caller transport_principal text.
* User Engine owns canonical user and active tenant account/membership facts;
Tenant Engine owns authoritative tenant existence/lifecycle. Their live,
authenticated, freshness-bounded read interfaces must be integrated by Access
(PIP consumption), with unavailable/stale facts reducing authority. No new
parallel identity engine or caller-authored membership provider is introduced.
* Approval Engine supplies the served approval claim and authenticated consumption
facts. Its human approver can differ from the initiating human: a successful
approval is not initiating identity. Existing claim/PDP canonical correspondence
and later independent consume confirmation remain mandatory.
KeyCape explicitly states registration-supplied tenant is store isolation, not
human membership. The source verifier therefore requires directory provenance,
exact tenant:platform, verified MFA within 300 seconds and a currently valid
RS256 token. This strict proposed ceiling currently refuses registration-only
humans; changing that requirement requires owner-reviewed doctrine, not relabeling
registration as directory. Cryptographic verification alone still grants nothing:
User/Tenant membership, representation and exact operation are separate facts.
## Required server injection and activation proof
The task_execution_projection shape in the candidate policy is a proposed
internal server representation, not an accepted public claim format. Access
must acquire initiator token on a separate authenticated channel, verify it,
resolve canonical user/membership/tenant using the owning PIPs, correlate it with
the authenticated transport and full exact operation, and inject a bounded
projection. Raw human JWTs must never enter CheckRequest context or decision/audit
records. An HTTP-supplied projection must be rejected or discarded before any
trusted projection is injected, including nested/duplicate-field collisions.
Projection expiry must be the earliest identity/session expiry, provider
freshness deadline, approved operation deadline and PDP authority ceiling.
Fresh PIP retrieval/refusal and revocation visibility must be recorded; cached
membership alone cannot silently extend a KeyCape session. Package activation
requires an actual authenticated KeyCape origin/client, admitted User/Tenant read
routes/identities, server-controlled provenance and exact request/claim binding.
No raw JWT verifier endpoint, projection injection, transport-to-human binding,
PIP resolver, new server route or native package deployment is implemented here.
Only a reviewed versioned source successor may remove the hard refusal after
these gates have executable counterexamples. There is no unsigned enable flag.
## Tested scope and unfinished integration
Source tests verify RSA signatures and wrong issuer/audience/principal/tenant,
registration provenance, missing/stale MFA, expired/future token and absent key
admission. Strict nested duplicate/trailing JSON is refused. Python uses the
actual Secrets ExecutionContract parser and canonical request/approval digest
functions; Go and OPA evaluate the same complete synthetic two-object descriptor.
Synthetic future-projection allow and mutation denials prove candidate semantics;
current package denies regardless of asserted flags. They do not prove providers.
The candidate predicate is not a full independent typed owner compiler: source
and body provenance, exact estate origin/CCR readiness, bounded parser admission,
platform plan compilation and immutable body mediation remain Platform/Secrets
requirements. Nor does it independently validate served approval claims, consume,
run journal admission, dispatch or issue/revoke native grants. Existing journal,
confirmation and descriptor work must be integrated before this can perform one
metadata action. No existing operational task closes from this source package.