netbox-openbao — VM and container SSH secrets¶
The complete target architecture, migration matrix and setup runbook are in Audited Proxmox writes with RPC and OpenBao. Mandatory RPC writes and generic OpenBao-backed procedure variables are planned; the endpoint storage integration described here already exists.
Unavailable required credentials fail explicitly at secret-access boundaries. Password-reuse readiness and list views report SSH as unavailable instead of failing the entire response. SSH password reuse returns a safe 503 when stored material cannot be resolved; a token-only endpoint still returns 422 because an API token is not an SSH password. Scheduled monitoring records an affected endpoint's failure and continues evaluating other endpoints.
Endpoint edit forms preserve masked values from the original storage backend, using the submitted authentication selection after explicit clears. A complete new token pair can repair an endpoint that has no stored credentials. An existing unresolved counterpart reference still blocks preservation until the operator repairs, replaces, or explicitly clears that credential. The requesting actor is retained for authorized OpenBao reads and writes.
netbox-openbao is a separate NetBox plugin from the Proxbox suite. It is
not a companion plugin in the same sense as netbox-pbs or netbox-ceph — you do
not install it through proxbox-api sync jobs — but it is the supported way to
store SSH login material for Proxmox guests that netbox-proxbox already models
in NetBox.
Problem split¶
| Concern | Plugin | Storage |
|---|---|---|
| Discover VMs, LXC, interfaces, IPs | netbox-proxbox (+ proxbox-api) | NetBox PostgreSQL |
| Store SSH passwords and keypairs | netbox-openbao | OpenBao KV v2 + NetBox metadata |
| Optional vault credential isolation | netbox-openbao-broker | AppRole off the NetBox host |
| Audited SSH / host procedures | netbox-rpc (+ rpc-backend) | Procedure catalog in NetBox |
Proxbox answers what exists. Openbao answers how you log in — after the object exists. RPC answers what automated host operations are allowed — through a catalogued executor, not ad-hoc shell.
No secrets in the sync pipeline
Proxmox guest credentials — cloud-init passwords, hypervisor-stored root passwords, QEMU agent secrets — are not part of the proxbox discovery contract. A proxbox job failure must not rotate credentials; a credential reveal must not call the Proxmox API.
Architecture¶
Inventory lane (netbox-proxbox)¶
flowchart TB
PVE["Proxmox VE"]
API["proxbox-api"]
PX["netbox-proxbox"]
NB[("NetBox\nVirtualMachine · IP · Service ssh:22")]
PVE -->|"read-only"| API
API --> PX
PX --> NB
Target secrets and automation stack¶
The RPC-to-OpenBao executor link below is the planned generic integration. Its presence in this diagram does not establish runtime support in an installed executor; verify the capability and version contract before enabling writes.
flowchart TB
OP["Operator · nbx"]
OB["netbox-openbao"]
BR["netbox-openbao-broker\noptional"]
BAO[("OpenBao KV v2")]
RPC["netbox-rpc"]
RBE["netbox-rpc-backend"]
VM["VirtualMachine / host"]
OP --> OB
OB --> BR
OB -.-> BAO
BR --> BAO
OP --> RPC
RPC --> RBE
RBE --> OB
RBE --> VM
The inventory and secrets lanes meet on the same VirtualMachine (or Device)
row. Guest assignment coordinates through NetBox objects and OpenBao assignments.
Endpoint storage additionally uses Proxbox's optional integrations/openbao.py
adapter, which imports OpenBao models and services at call time.
Endpoint credentials vs guest credentials¶
netbox-proxbox can also store Proxmox endpoint tokens and SSH secrets
through netbox-openbao when
ProxboxPluginSettings.credential_storage_backend = openbao. Automatic (the
blank default) selects that backend only when netbox_openbao is enabled in
PLUGINS; otherwise it selects legacy Fernet. Explicit selections remain
authoritative and never downgrade when OpenBao becomes unavailable. That
path secures how NetBox talks to Proxmox, not how operators SSH into a synced
guest.
Missing OpenBao references and invalid or unavailable material fail explicitly with the endpoint and credential field named. Existing stored backend choices are preserved during upgrade; the automatic default does not migrate secrets. See credential storage configuration before changing the enabled plugin set.
| Credential | Stored by | Bound to |
|---|---|---|
| Proxmox API token / endpoint SSH | proxbox + openbao integration | ProxmoxEndpoint |
| Guest SSH login | openbao quick-add | VirtualMachine + optional ipam.Service |
Do not conflate the two: rotating an endpoint token does not create a guest SSH credential, and quick-add on a VM does not replace endpoint API authentication.
Operator workflow¶
- Sync inventory — manual sync, scheduled job, or proxbox-api SSE workflow so the VM or container exists under the correct cluster and node.
- Add SSH access — on the VirtualMachine page, use netbox-openbao's
quick-add to create
Credential, assignments, andsshservice (when services are modeled) in one transaction. - Reveal when needed — operators or automation with
reveal_credentialPOST to/api/plugins/openbao/credentials/{id}/reveal/; material never appears on GET or in exports. - Optional automation — use the installed RPC release's supported fixed host procedures. Generic execution-bound OpenBao resolution is part of the integration plan; do not assume every executor implements it.
Installation¶
Install the plugins in NetBox; proxbox must be present before sync can create VM rows:
pip install netbox-proxbox netbox-openbao netbox-rpc
PLUGINS = [
"netbox_proxbox",
"netbox_openbao",
"netbox_rpc",
]
Deploy netbox-openbao-broker when broker mode should keep AppRole material off the NetBox host. Configure OpenBao engines and policy tiers per netbox-openbao installation.