About ssh-hardening
ssh-hardening is a skill for safely tightening SSH server authentication and access controls. It is intended for administrators, emphasizing verified key-based access, effective-policy checks, and recovery before and after activation.
Key features
- 01Inspect daemon, listeners, and access rules
- 02Verify administrator key and sudo access
- 03Generate keys with preview and no-overwrite options
- 04Apply a managed key-only policy
- 05Validate, test, and recover SSH configuration
Use cases
- 01Preparing SSH access before restricting authentication
- 02Checking conditional SSH rules for actual user contexts
- 03Applying a conventional key-only policy
- 04Verifying access and restoring configuration after failure
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ mikr13/ secure-server-setup-skills --skill ssh-hardeningAfter installing, type/ssh-hardeningin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
references/sshd-config.mdscripts/generate-ssh-keys.shsetup-ssh-hardening.shDetails
From the project READMESSH hardening
Establish working administrative access before restricting authentication. Keep the current session and provider console available until a fresh post-change login succeeds.
Inspect and establish access
-
Identify the active daemon/service/socket, actual listener ports, administrative and automation identities,
Includeorder, and relevantMatchrules. Recordsshd -T -Cresults for the actual users, client addresses, and hostnames. -
Use an existing non-root administrator. If account creation is needed, create it separately with the distribution's user/group conventions, install its public key, then prove key login and sudo in a separate session before any lockdown.
-
Generate personal keys on the local client with a passphrase or hardware-backed key. scripts/generate-ssh-keys.sh provides preview/no-overwrite behavior; its
--interactivemode is for a human terminal and--no-passphraseis an explicit service-key choice. -
Test the specific key without password fallback:
ssh -o IdentitiesOnly=yes -o PreferredAuthentications=publickey -i ~/.ssh/server_admin [email protected]In that new session, verify the required sudo operation. Password fallback or an already-open session is not proof of usable key access.
Configure the authorized policy
Read references/sshd-config.md before editing includes, conditional access or activation.
The setup helper supports a conventional key-only policy. It requires an existing non-root administrator; it does not create accounts, replace AllowUsers/AllowGroups, change ports, or remove forwarding functionality. Existing multiple-factor authentication requires a reviewed manual policy instead of this helper.
sudo bash scripts/setup-ssh-hardening.sh --user administrator --client-address 203.0.113.10 --dry-run
After proven key/sudo access and authorization to configure/activate:
sudo bash scripts/setup-ssh-hardening.sh --user administrator --client-address 203.0.113.10 --key-access-confirmed --apply --activate
Repeat --user for administrators that must be verified. Set --client-host when hostname-based Match rules apply. The helper validates the supplied client context; inspect other relevant networks/hostnames as well. It writes a managed early drop-in and refuses success if earlier values or conditional rules override the requested policy. An early filename alone is not proof of precedence.
Verify and recover
- Syntax:
sudo sshd -t. Effective file policy:sudo sshd -T -C user=administrator,host=client.example.com,addr=203.0.113.10. - Verify root, password and keyboard-interactive restrictions for all relevant contexts; ensure required key login and any intended MFA remain possible.
- After activation, establish a fresh login with the specific key and check sudo. Test denied authentication methods from a controlled client. Preserve the original session until these pass.
- If the script fails during validation or activation, it restores the exact previous managed drop-in and attempts to reload the restored policy when needed. For later rollback, use the printed protected backup directory; restore its saved file or remove the new managed file if none existed. Then validate and reload the actual service from the preserved session/console.
Report file validation separately from activation and live access tests. Do not describe ClientAliveInterval as a user-idle timeout or hard-code obsolete protocol/crypto settings.