SSH (bash) plugin

The SSH (bash) plugin lets a Vaubaan Gateway mission use SSH (bash) without handing the agent a credential. Shell commands on a host over SSH — inspection on a read allow-list, writes priced by class (destructive, package, service, sudo), lines that cannot be classified priced as all of them.

One account is one host reached over SSH with a key pair generated by this gateway and a pinned host key; that host is its single resource, labelled dev, staging or prod by its owner. The one tool runs a shell command line: inspection commands are reads, everything else is a write, and destructive commands, package changes, service control and sudo are permissions of their own.

Permissions

Each permission is a named risk of the plugin's catalog: a mission holds an explicit list of them, never "all". The severity is computed from the permission's six axes (undo, blast radius, data, cost, visible to, lasts); nothing is decided from it.

PermissionWhat it allowsSeverityWhy it is a risk
ssh.exec-readRun a whitelisted read-only commandlowInspection commands recognised by the read allow-list (`journalctl`, `cat`, `ls`, `tail`, `head`, `grep`, `pgrep`, `ps`, `docker ps/inspect/logs`, `systemctl status`, `df`, `free`, `uptime`, `who`, `ss -tlnp`, `md5sum`, `stat`) with their known read-only options, alone or piped together. No mutation. Logs and files may still contain secrets, which is why `exec-read-secret-files` exists next to it.
ssh.exec-read-secret-filesRead a credential-bearing filelowThe read allow-list accepts `cat <path>` without filtering the path, so `cat /etc/shadow`, `cat /root/.env` or `stat /home/<u>/.ssh/id_ed25519` are reads. The classifier recognises credential-bearing paths however they are spelled (`.ssh/…`, `.env`, private keys, `/etc/shadow`, `/root`, raw devices), and paths it cannot see (an expansion, `..`, a recursive `grep`, `docker inspect`, a line it cannot classify), and emits an extra slice, so a mission must hold this permission on top of `exec-read` to read them. Exfiltration of host credentials ; refused by every preset but `operator`, where it asks first.
ssh.exec-writeRun an arbitrary shell commandmedium (high on prod; only for dev, staging, prod)Any simple command outside the read allow-list and any output redirection. File edits, builds, git operations, process launches, scripts : the program may do whatever its user can. A line the classifier cannot see through (command substitution, inline code, another host or container) needs this permission and every class permission below. On a `dev` or `staging` host the blast radius is the host ; on `prod` a write can shift the security posture or cause downtime, hence the override.
ssh.exec-destructiveDestructive command (recursive delete, disk, reboot)high (only for dev, staging, prod)`rm` with `-r` or `-f`, `mkfs`, `dd`, `shred`, `wipefs`, partitioning tools, `reboot` / `shutdown`, `userdel`, firewall flushes, Docker prunes. Irreversible at the host level ; emitted together with `exec-write`. Presets make it ask first outside `dev`.
ssh.exec-package-installInstall, remove or upgrade packagesmedium (only for dev, staging, prod)System package managers (`apt`, `dpkg`, `yum`, `dnf`, `zypper`, `apk`, `pacman`, `snap`, `brew`, `flatpak`, `rpm`) in a mutating mode, global `npm` / `pnpm` / `yarn` installs, `pipx`. Changes what runs on the host for every service ; supply-chain exposure. Emitted together with `exec-write`.
ssh.exec-service-controlStart, stop or restart a service or processmedium (only for dev, staging, prod)`systemctl` lifecycle verbs, `service <x> restart`, Docker and Compose lifecycle, `pm2`, `supervisorctl`, `nginx -s`, `kill` / `pkill`. Availability impact, reversible by starting again. Emitted together with `exec-write`. A developer preset allows it on `dev` and asks first on `staging`.
ssh.exec-sudoPrivilege escalation (sudo, su, doas)high (only for dev, staging, prod)A non-whitelisted command run through `sudo`, `su`, `doas` or `pkexec`. Whatever the inner command does, it does as another user, usually root. Emitted together with `exec-write` and the inner command's classes. Inspection verbs the whitelist already admits under `sudo` (`sudo journalctl`, `sudo systemctl status`, `sudo ss -tlnp`) stay reads.
ssh.uncategorized-writeUncategorized SSH writemedium (the catch-all: touched only by a call no other permission covers)Catch-all for writes without a dedicated entry. Every write of the single `ssh__exec` tool is covered by `exec-write` ; this entry exists for tools added later (an `ssh__sftp_put`, say) and is never referenced by a preset.

Presets

A preset pre-fills the permissions of a mission for one account, with a limit per period, a rate and whether each permission runs freely or asks the mission creator first. The person creating the mission adjusts it; the mission stores the explicit list.

Read-only

read-only — Inspect a host — logs, processes, disk, services, files outside credential paths. No write.

PermissionWhat it allowsLimit per periodRateRuns
ssh.exec-readRun a whitelisted read-only command200060 per minuteruns freely

Developer

developer — One mission per code project — reads everywhere, file and process operations on dev and staging hosts, service restarts on dev; nothing destructive, no packages, no sudo, no prod.

PermissionWhat it allowsLimit per periodRateRuns
ssh.exec-readRun a whitelisted read-only command5000120 per minuteruns freely
ssh[dev].exec-write100030 per minuteruns freely
ssh[staging].exec-write50020 per minuteruns freely
ssh[dev].exec-service-control20010 per minuteruns freely
ssh[staging].exec-service-control505 per minuteask me first

Operator

operator — Everything on every labelled host; credential-file reads, destructive commands, package changes, service control and sudo asking first outside dev; every prod write asking first.

PermissionWhat it allowsLimit per periodRateRuns
ssh.exec-readRun a whitelisted read-only command10000120 per minuteruns freely
ssh.exec-read-secret-filesRead a credential-bearing file505 per minuteask me first
ssh[dev].exec-write200030 per minuteruns freely
ssh[staging].exec-write100030 per minuteruns freely
ssh[prod].exec-write20010 per minuteask me first
ssh[dev].exec-destructive10010 per minuteruns freely
ssh[staging].exec-destructive205 per minuteask me first
ssh[prod].exec-destructive102 per minuteask me first
ssh[dev].exec-package-install10010 per minuteruns freely
ssh[staging].exec-package-install205 per minuteask me first
ssh[prod].exec-package-install102 per minuteask me first
ssh[dev].exec-service-control50020 per minuteruns freely
ssh[staging].exec-service-control10010 per minuteask me first
ssh[prod].exec-service-control205 per minuteask me first
ssh[dev].exec-sudo20020 per minuteruns freely
ssh[staging].exec-sudo505 per minuteask me first
ssh[prod].exec-sudo202 per minuteask me first

Tools

ToolWhat it does
ssh__execRun a shell command on a host

Health

Health: not enough reports yet. A plugin version is deemed validated by the community with at least 200 reports and 90 % of them successful, over the last 90 days, as reported by the instances whose operators turned community telemetry on. It is a community signal, not a security guarantee.

Last changed 2026-10-16. This page as Markdown: /plugins/ssh.md