Releases: sanketsaurav/bastion
Releases · sanketsaurav/bastion
Release list
v0.3.0
Features
bastion audit— hardening checks with none of the compliance
theater: a short list of high-value findings, each mapping to a real
compromise path, each with its exact, copy-pasteable fix. Cloud-side it
flags attached service accounts (anything on the box can mint their
tokens through the metadata server), firewall rules open to the world
beyond your declared surface (world-open SSH gets the scope-to-IAP fix
rather than deletion), and disabled Secure Boot; guest-side it verifies
security updates apply themselves, no update is stuck waiting on a
reboot, password authentication is off, and nothing listens on
0.0.0.0that you didn't declare. Read-only, nonzero exit on findings,
and provider checks run even against a stopped box. Provider-specific
checks sit behind an auditor interface, ready for hosts beyond GCP.host.hardening.autoReboot: "HH:MM"— lets unattended-upgrades
reboot in a nightly window when a security update requires it, closing
the "kernel patch downloaded but inactive" gap audit most often finds. A
bastion box is uniquely safe to reboot: services restart themselves,
data is durable, and the IP should be static.- Animated progress — in-progress steps (starting, waiting for SSH,
inspecting, every apply action, doctor and audit runs) now spin in
place on a terminal, show elapsed time when they drag, and resolve to a
check or cross. Pipes,--json, and--verbosekeep the plain
append-only output.
v0.2.0
Features
- Connection multiplexing. bastion reuses one SSH connection across
commands via an OpenSSH control master with a 10-minute idle window: the
first connection pays the IAP tunnel setup once, and everything after —
ssh,exec,port, the round trips inside everyplanandapply—
rides it near-instantly (measured against a real box: 4.7 s cold,
0.15 s multiplexed). On by default;connection.multiplex: falseopts
out, and agent forwarding disables it automatically. bastion ssh-configgenerates (and with--installmanages) a
marker-delimited~/.ssh/configHost block, so any standard SSH tool —
IDE remote workspaces, scp, rsync — reaches the box by name over the
same IAP transport and shares the multiplexed connection with bastion.
--removedeletes the block; nothing outside the markers is touched.- A login worth looking at.
bastion sshopens with a nameplate: the
box name in block art with a stable per-box accent color, the project
and zone, and the box's public app URLs. Disable with
host.shell.banner: offor--no-banner; it stays out of the way for
scripted and argument-passing invocations. host.shell.motd: quietsilences the distribution's login output —
system information, news, update notices, and sshd's last-login line —
with a managed~/.hushlogin.host.shell.userAlias: truemakeswhoami, PS1, and file listings
show your prompt name instead of the OS Login-derivedext_…username:
a same-uid passwd alias with its own sudo grant. Login, authentication,
and your home directory are unchanged.
Upgrade notes
- Multiplexing is on by default and keeps per-box control sockets under
~/.local/state/bastion/mux/;bastion downretires the box's master.
Setconnection.multiplex: falsefor the old one-connection-per-command
behavior.
Internal
- Release notes are now sourced from CHANGELOG.md (v0.1.0 shipped with an
empty notes body), and the README was rewritten for users of bastion.
v0.1.0
First release. bastion is a local, config-driven CLI for operating a
personal Linux dev box on Google Compute Engine: your terminal is the
control plane — no hosted service, no daemon on the VM.
Highlights
- Attached-VM lifecycle over IAP + OS Login, private by default:
adopt,status,up/down,ssh,exec,port, and adoctor
that diagnoses gcloud, IAM, connectivity, and the guest itself — every
failure with concrete remediation. - Declarative host convergence: apt packages, built-in features
(docker, github-cli, tmux, build-essential, mise, uv, bun, claude-code,
codex), your own local feature scripts, managed dotfiles with template
support, and a readable shell prompt over OS Login's derived usernames.
Read-onlyplanbefore everyapply; applies are idempotent and
resumable, and never uninstall on undeclare — orphans are reported, and
feature removecleans up user-level features (configuration and
credentials are always kept). - Services: one-container services from OCI images as generated
Compose projects — durable volumes that survivedown/up, secrets
from local files or environment variables (rotated explicitly with
apply --rotate-secrets, never present in plans, logs, or digests),
health gating, and loopback-only private endpoints reached through
bastion port. - Public HTTPS ingress: declare
ingress.baseDomain, point one
wildcard DNS record at the VM, and any endpoint marked
visibility: public(with an explicitauthpolicy) is served at
https://<service>.<baseDomain>through a managed Caddy proxy with
automatic per-host certificates. bastion never touches DNS, IPs, or
firewall rules —doctorverifies them and prints exactly what to
create. - Signed releases: archives ship with a cosign-signed checksum file
(verification instructions in SECURITY.md), installable via
brew install sanketsaurav/tap/bastion.
Requires the gcloud CLI and an existing Ubuntu 24.04 GCE VM. Full
specification in SPEC.md.