Session: the OpenBao plugin speaks OpenBao's plugin protocol, in Rust (ruling D1) #48
Labels
No labels
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Meta/Campaign
Meta/Epic
Meta/Session
Priority/Critical
Priority/High
Priority/Low
Priority/Medium
Reviewed/Confirmed
Reviewed/Curated
Reviewed/Duplicate
Reviewed/Invalid
Reviewed/Won't Fix
Scope/Campaign
Status/Abandoned
Status/Blocked
Status/Conflicted
Status/In Progress
Status/In Review
Status/Need Grooming
Status/Need More Info
Status/Ready
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Ting/Vedanta#48
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Proposal
Turn
openbao-pluginfrom a library OpenBao cannot load into a secrets-engine plugin binary OpenBao spawns, so OpenBao actually owns the lease the contract says it owns.Why
openbao-plugin/(PR #27, Session #20) holds the ordered issue flow, the lease machine, the one-shot wrapper, and the signed command dispatch — as a Rust library behind trait ports (IntentStore,PrivateMint,LeaseStore,WrapStore,LeaseBackend). Nothing speaks OpenBao's plugin protocol: no go-plugin handshake, noGRPCBackendservice, no broker dial-back for storage. OpenBao's SDK is Go only; no Rust plugin SDK exists. The 2026-09-05 delivery run for Ting/Ting#60 found this as the largest delta on the canonical path, and the freeholder ruled (Larandar, 2026-09-05, in-session, ruling D1): "it's better to have the plugin be same language as Vedanta so Rust it is."Session review boundary
One PR, one verdict: OpenBao loads the binary from its plugin catalog, mounts it, and issue/read/renew/revoke on the mount drive the existing Rust flows unchanged; storage goes through OpenBao's broker; the credential value crosses only inside the wrapped response.
Design
[[bin]]inopenbao-plugin(or a sibling crate) implementing the go-plugin protocol withtonic/prost: the handshake line on stdout (CORE-PROTOCOL-VERSION|APP-PROTOCOL-VERSION|unix|<socket>|grpc|<base64 cert>), the magic-cookie env check, auto-mTLS with the client certificate OpenBao passes inPLUGIN_CLIENT_CERT, and theGRPCController,GRPCBroker,GRPCStdioservices go-plugin expects.plugin.GRPCBackendfrom OpenBao'ssdk/plugin/pb/backend.proto(vendored at a pinned OpenBao revision with its licence):Setup,Initialize,SpecialPaths,HandleRequest,HandleExistenceCheck,Type,Cleanup,InvalidateKey. Storage and system views are reached by dialling the broker IDSetupsupplies (Storage,SystemViewservices), which is howIntentStore,LeaseStore,WrapStoreandLeaseBackendget a durable implementation without the plugin owning a file.issue,lease/<id>(read),lease/<id>/renew,lease/<id>/revoke,unwrap/<token>; responses carry OpenBaoSecretlease metadata so OpenBao's own lease manager calls renew/revoke.PrivateMintover the private transport Vedanta #47 serves (unix socket, signed envelope); the plugin holds the Ed25519 signing key from a path OpenBao's plugin environment supplies, never in storage.baobinary in dev mode withplugin_directoryset and registers the built binary is the acceptance test.Tasks
tonic-build.GRPCBackendand route the five paths toIssueService/LeaseService.Storageclient and the four stores over it.Secretlease metadata so OpenBao's lease manager owns renew/revoke.bao server -devwith the plugin registered; record measured results.Specification Delta
Requirement: OpenBao owns the lease it issued
Scenario: the mount is used end to end in dev mode
issueand then reads, renews, and revokes the leaseunwrapOpenSpec
Projects from
contracts.identity.openbao-lease-backend(openbao-owns-the-public-lease-contract,credential-material-is-one-shot,operation-ids-are-idempotent-and-replay-safe,pilot-timing-follows-grant-version-0-1-4).Structural parent
Ting/Ting#60; continues #20 / #12 / #24. Sibling of #47 (the Vedanta side of the same transport).
Provenance
Filed by the queen session of the 2026-09-05 delivery run (Claude Code, harness ba993052); ruling D1 attributed to Larandar in-session.