SSH access that doesn’t live forever.
Static SSH keys are easy to issue and hard to take back. This page covers why, what the alternatives are, how to audit your SSH access today, and how Bastyx is designed to replace keys with short-lived, identity-bound access.
Illustrative. Planned SSH flow with a standard OpenSSH client.
Why SSH keys become a liability
An SSH key pair is a strong credential. The trouble is everything around it. A public key copied into authorized_keys grants access until someone removes it, and nothing in the file says who it belongs to, why it’s there or whether it’s still needed.
- No expiry. A key added for a two-week project is still valid two years later.
- No identity. The comment field is free text. Shared deploy keys and personal keys look the same.
- No central view. Access lives on each server. Answering “who can reach production?” means reading every
authorized_keysfile. - Offboarding misses. Disabling someone’s SSO account doesn’t touch the key on their laptop or the copies on your servers.
- Private keys wander. Keys without hardware backing can be copied between laptops, backups and CI systems.
Four ways teams manage SSH access
Each approach fixes part of the problem. FIDO2-backed keys (the ed25519-sk and ecdsa-sk types added in OpenSSH 8.2) put the private key in hardware. SSH certificates, signed by a CA your servers trust, add expiry and identity. An access platform adds policy, device checks and a central record.
| Static keys | FIDO2 keys | SSH certificates | Bastyx (planned) | |
|---|---|---|---|---|
| Expires automatically | No | No | Yes, validity period | Yes, per session |
| Tied to a named person | By convention only | Tied to a physical key | Yes, key ID and principals | Person, device and policy |
| Private key in hardware | Optional | Yes | Optional | Security key or passkey |
| Central revocation | Edit every server | Edit every server | Revocation lists or short validity | One action |
| Audit trail | Server logs | Server logs | Key ID in server logs | Central event log |
| Effort to runFor a team without dedicated IAM staff | Low to start, high to maintain | Low; OpenSSH 8.2+ | Run and protect a CA | Designed to be low |
Expires automatically
- Static keys
- No
- FIDO2 keys
- No
- SSH certificates
- Yes, validity period
- Bastyx (planned)
- Yes, per session
Tied to a named person
- Static keys
- By convention only
- FIDO2 keys
- Tied to a physical key
- SSH certificates
- Yes, key ID and principals
- Bastyx (planned)
- Person, device and policy
Private key in hardware
- Static keys
- Optional
- FIDO2 keys
- Yes
- SSH certificates
- Optional
- Bastyx (planned)
- Security key or passkey
Central revocation
- Static keys
- Edit every server
- FIDO2 keys
- Edit every server
- SSH certificates
- Revocation lists or short validity
- Bastyx (planned)
- One action
Audit trail
- Static keys
- Server logs
- FIDO2 keys
- Server logs
- SSH certificates
- Key ID in server logs
- Bastyx (planned)
- Central event log
Effort to run
For a team without dedicated IAM staff
- Static keys
- Low to start, high to maintain
- FIDO2 keys
- Low; OpenSSH 8.2+
- SSH certificates
- Run and protect a CA
- Bastyx (planned)
- Designed to be low
How to audit your SSH access today
You don’t need new tooling to find out where you stand. These steps work on most Linux servers running OpenSSH. Run them on a representative sample first, then script them across your fleet.
1. Find where keys are allowed
Check which files sshd reads, then find them:
sudo sshd -T | grep -i authorizedkeysfile
sudo find / -xdev \( -name authorized_keys -o -name authorized_keys2 \) 2>/dev/null2. Fingerprint every key
ssh-keygen can read an authorized_keys file and print one fingerprint per key, with its comment:
ssh-keygen -lf /home/deploy/.ssh/authorized_keys3. Map each key to a person
Match fingerprints against the people and systems you know about. Any key you can’t attribute to a current employee, contractor or named service is a finding.
4. Check which keys are actually used
sshd logs the fingerprint of the key used for each login. On Debian and Ubuntu that’s /var/log/auth.log; on RHEL-family systems, /var/log/secure; with systemd, the journal:
sudo journalctl -u ssh -u sshd --since "90 days ago" | grep "Accepted publickey"5. Remove what you can’t justify
Delete unattributed and unused keys. Replace shared accounts with named ones so logs tell you who did what.
6. Stop new keys from living forever
Since OpenSSH 7.7, an authorized_keys entry can carry an expiry date. It’s a stopgap, but it beats no expiry:
expiry-time="20261231" ssh-ed25519 AAAAC3Nza... jordan@contractorFor a durable fix, move to short-lived credentials: an SSH certificate authority you operate, or a platform that issues access per session and records it centrally.
How Bastyx is designed to handle SSH
The planned flow, from the engineer’s side, is one command and one touch:
- The engineer runs
sshas usual. - Bastyx checks that the laptop is enrolled and belongs to them.
- They confirm with their security key, passkey or fingerprint.
- The policy for that server group decides: allow, step up, require approval or deny.
- If allowed, a credential valid only for this session is issued.
- The session is recorded against the person, device and policy, and the credential expires on its own.
This is what zero-trust SSH access means in practice: no standing trust in a key, a network location or a bastion. Every session is checked against who is connecting, from which device, and what policy allows.
Offboarding removes the person’s ability to get new credentials everywhere at once. There are no copies of their key on your servers to hunt down, because there were never any to begin with.
SSH access questions
Do engineers need a new SSH client?
The design goal is no. Bastyx is being built to work with the standard OpenSSH client and existing ssh config, so the command people type stays the same.
How is this different from running our own SSH certificate authority?
Certificates solve expiry. You still have to decide who gets one, verify their device, protect the CA, handle revocation and record what happened. Bastyx is designed to handle those parts with identity, device checks, policy and a central audit log.
Does it work with bastion hosts and jump hosts?
We’re designing for common setups, including jump hosts. We’ll document supported topologies before SSH support reaches early-access teams.
What about CI pipelines and service accounts?
Bastyx focuses on human access first. Machine identities for automation are something we’re exploring, not something we’re promising today.
Can we keep existing keys during a rollout?
That’s the intent. You should be able to put one server group behind Bastyx while existing access keeps working elsewhere, then remove static keys as teams move over.
Stop chasing SSH keys.
Early-access teams will shape Bastyx’s SSH support first. Tell us how your servers are set up.