authorized_keys Analyzer: See Who Can Actually Log In
Paste an authorized_keys file and get a graded A to F review: every key with its type, size and SHA256 fingerprint, what each one is restricted to, and which keys nobody can account for. Reads the options field that every other parser ignores. Nothing is uploaded.
Analyzed entirely in this browser tab. Nothing is uploaded. The keys in this file are public, so they are not secret the way a private key is, but the file still names everyone who can log into the account.
How to audit your authorized_keys file
- On the server, print the file:
cat ~/.ssh/authorized_keys. Check the other accounts too, includingroot, since each has its own. - Paste it above. The review runs as you type, in your browser, and nothing is uploaded.
- Open the Access list tab. Every fingerprint there matches
ssh-keygen -lf ~/.ssh/authorized_keys, so you can copy one and ask your team whose it is. - Delete every key you cannot attribute to a person or a system that still exists. That is the whole job, and it is the step people skip.
- Use the Reviewed file tab to add
restrictandfrom=to what remains, edit the placeholder addresses, then back up the original and replace it.
Why this file is the one nobody reviews
An authorized_keys file is an access control list, but it does not look like one. It has no owner column, no expiry column and no audit trail. It is a list of base64 blobs, and it only ever grows.
Keys accumulate the way permissions always accumulate: a contractor in 2023, a CI runner that was decommissioned, a laptop that was replaced, a colleague who left. None of those events removed a key, because removing a key is a separate task that nobody was assigned. Meanwhile the file grants permanent, password-less, unlogged-by-default access.
MITRE tracks the offensive side of this as T1098.004, Account Manipulation: SSH Authorized Keys. Appending one line to this file is among the first things an automated attack does after compromising a Unix host, precisely because the file is rarely read and changes to it are rarely alerted on. A key with no comment is indistinguishable from one your colleague added last year.
The options field, which almost every tool ignores
A line in this file can carry options before the key type, and they decide what the key is actually allowed to do. Compare these two lines, which look almost identical:
ssh-ed25519 AAAA... backup is a full interactive shell, with port forwarding and agent forwarding, usable from any address on the internet, forever.
restrict,from="10.0.0.5",expiry-time="20271231",command="/usr/local/bin/backup" ssh-ed25519 AAAA... backup can run one command, from one address, until one date.
Same key, same access in principle, completely different blast radius if the private half leaks. Every other authorized_keys parser on the web stops at the key type, the size and the fingerprint. This one reads the options, because that is where the security is.
One trap worth knowing: command= on its own is not a sandbox. The holder can still request a pty and still open port forwards to reach anything the server can reach. It needs restrict alongside it.
What the fingerprint is for
The SHA256: value in the access list is the same one ssh-keygen -lf prints, byte for byte. That matters because it is the only practical way to resolve an unattributed key.
You cannot tell who a key belongs to by looking at it. You can post its fingerprint in a channel and ask people to run ssh-keygen -lf ~/.ssh/id_ed25519.pub and check. Whoever matches it owns it. Whoever does not answer, you delete.
The legacy MD5: form is shown too, because some consoles, AWS included, still display imported key fingerprints in that format.
What a key file cannot tell you
This tool reads one file, and it is honest about that. It cannot tell you whether the person behind a key still works for you, which is the actual question. It cannot check the permissions on ~/.ssh/authorized_keys, find the files belonging to other accounts, or know whether a private key has leaked.
Those need the running server. The SSH and Access fix guide covers the server-side checks, and the SSH and Access checklist lists all eleven as commands you can paste into a terminal. CtrlOps scans a whole fleet for who can log in where and offboards someone from every server at once, which is the part that does not fit in a text file.
Reviewing how the server authenticates rather than who it lets in? The sshd_config Analyzer is the other half. Need to issue a replacement key? The SSH Key Generator makes one in the browser.
The options that decide what a key can actually do
| Option | Effect | When to use it |
|---|---|---|
| restrict | Disables port, agent and X11 forwarding, pty allocation and ~/.ssh/rc, in one word. | Every automated key. Add pty or port-forwarding after it to re-enable just the one you need. |
| from="..." | Refuses the key unless the connection comes from a matching host or CIDR range. | Any key with a fixed caller. It makes a stolen key useless outside your network. |
| command="..." | Runs this command instead of whatever the client asked for. | Backups and deploys. Pair it with restrict, or it is not a sandbox. |
| expiry-time="..." | Refuses the key after a date. YYYYMMDD or YYYYMMDDHHMM. | Contractors, temporary access, and honestly everything else. |
| cert-authority | Treats the key as a CA: anyone with a certificate it signed can log in. | Only with a deliberate SSH CA setup. Never by accident. |
| environment="..." | Sets environment variables for the session. | Almost never. With PermitUserEnvironment on, it is an LD_PRELOAD privilege escalation. |
| no-agent-forwarding | Stops the session using your forwarded SSH agent. | Anywhere you do not fully trust root on the destination host. |
| permitopen="host:port" | Limits ssh -L forwarding to one destination. | A tunnel-only key that should reach a database and nothing else. |
Frequently asked questions
Related developer tools
Review one file here, see the whole fleet there.
CtrlOps scans every server you manage for who can log in and who has sudo, and offboards someone from all of them in one click. Your keys never leave your machine.
✓ Start instantly·✓ No credit card·✓ No sneaky autorenewals