Files
vault-plugin-secrets-rancher/README.md
T
Ben Vincent c46641dafb Initial vault-plugin-secrets-rancher scaffold
Vault/OpenBao secrets engine managing Rancher API tokens via the public
tokens.ext.cattle.io API.

- config: Rancher connection (URL + TLS)
- service-accounts/<name>: seeded root tokens, auto-rotated before Rancher's
  TTL cap via a PeriodicFunc (default 45d rotation, 90d token TTL); the current
  token mints its own replacement. Manual /rotate endpoint too.
- roles/<name>: mint policy referencing a service account; cluster_name + TTL
  scoping (Rancher tokens inherit the seeding user's RBAC).
- creds/<role>: dynamic, lease-bound tokens deleted from Rancher on revoke.

Ports the bind-tsig Woodpecker RPM release, nfpm packaging, and a mock-Rancher
e2e (Vault + OpenBao). Unit tests cover the full lifecycle.
2026-07-15 22:11:31 +10:00

66 lines
2.4 KiB
Markdown

# vault-plugin-secrets-rancher
A Vault / OpenBao secrets engine that manages **Rancher API tokens** through
Rancher's public `tokens.ext.cattle.io` API.
## Why
Rancher caps API-token lifetimes (commonly 90 days via
`auth-token-max-ttl-minutes`). A long-lived automation token therefore expires
and breaks things. This engine solves that two ways:
- **Seeded root rotation** — you seed a *service account* with a Rancher token.
The engine rotates it on a schedule (default: every 45 days, minting a fresh
90-day token) using the current token to create its replacement, so the
credential never lapses. Rancher only lets you mint tokens for *your own*
user, which is exactly what rotation needs.
- **Dynamic, scoped tokens** — a *role* mints short-lived tokens on demand, each
bound to a Vault lease and deleted from Rancher on revoke.
### Scope caveat
Rancher tokens inherit the **creating user's RBAC**; the only per-token
restrictions are **cluster scope** (`cluster_name`) and **TTL**. For genuine
least-privilege, create a purpose-built Rancher user per privilege level, seed a
service account with each, and point roles at the right one.
## Paths
| Path | Description |
|------|-------------|
| `config` | Rancher URL + TLS settings. |
| `service-accounts/<name>` | Seed a Rancher token; set `token_ttl` / `rotation_period`. Auto-rotated. |
| `service-accounts/<name>/rotate` | Force an immediate rotation. |
| `roles/<name>` | Mint policy: `service_account`, `cluster_name`, `ttl`, `max_ttl`, `description`. |
| `creds/<role>` | Read to mint a short-lived, lease-bound token. |
## Usage
```sh
vault secrets enable -path=rancher vault-plugin-secrets-rancher
vault write rancher/config rancher_url=https://rancher.example.com ca_cert=@rancher-ca.pem
# Seed a service account (rotate every 45d, 90d token TTL are the defaults).
vault write rancher/service-accounts/admin token="token-abcde:xxxxx"
# A role that mints 1h tokens scoped to one cluster.
vault write rancher/roles/ci service_account=admin \
cluster_name=c-m-abc123 ttl=1h max_ttl=8h
# Mint one.
vault read rancher/creds/ci
```
## Development
```sh
make build # build the plugin binary into ./dist
make test # unit tests
make e2e # full lifecycle vs mock Rancher on Vault + OpenBao (Docker)
make rpm # build Vault + OpenBao RPMs via nfpm
```
Releases are tag-driven (`make patch|minor|major`): a Woodpecker pipeline builds
the RPMs and uploads them to the internal artifactapi yum repo.