关于 ssh-hardening
ssh-hardening 是用于收紧 SSH 服务端认证与访问控制的技能,面向系统管理员。它强调先验证密钥登录和策略,再启用限制,并保留恢复路径。
主要功能
- 01检查服务、监听端口与访问规则
- 02验证管理员密钥登录和 sudo
- 03生成密钥并支持预览及防覆盖
- 04应用托管的仅密钥策略
- 05验证、测试并恢复 SSH 配置
适用场景
- 01限制认证方式前准备 SSH 访问
- 02检查特定用户上下文的条件规则
- 03应用常规的仅密钥策略
- 04故障后验证访问并恢复配置
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mikr13/ secure-server-setup-skills --skill ssh-hardening安装后在 Claude Code 中输入/ssh-hardening确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/sshd-config.mdscripts/generate-ssh-keys.shsetup-ssh-hardening.sh详细介绍
SSH 加固
在限制身份验证之前,先确保管理访问可用。在新的登录成功之前,保持当前会话和服务提供商控制台可用。
检查并确保访问
-
确认当前活动的守护进程/服务/套接字、实际监听端口、管理和自动化身份、
Include顺序以及相关的Match规则。记录针对实际用户、客户端地址和主机名的sshd -T -C结果。 -
使用现有的非 root 管理员。如果需要创建账户,请按照发行版的用户/组约定单独创建,安装其公钥,然后在另一个会话中验证密钥登录和 sudo,之后再进行任何锁定操作。
-
在本地客户端上生成带有口令或由硬件支持的个人密钥。scripts/generate-ssh-keys.sh 提供预览/不覆盖行为;其
--interactive模式适用于人工终端,而--no-passphrase是明确的服务密钥选项。 -
测试指定密钥,且不允许回退到密码验证:
ssh -o IdentitiesOnly=yes -o PreferredAuthentications=publickey -i ~/.ssh/server_admin [email protected]在这个新会话中,验证所需的 sudo 操作。密码回退或已打开的会话不能证明密钥访问可用。
配置授权策略
编辑包含文件、有条件的访问规则或启用配置之前,请阅读 references/sshd-config.md。
设置辅助脚本 支持常规的仅密钥策略。它要求存在一个非 root 管理员;不会创建账户、替换 AllowUsers/AllowGroups、更改端口或移除转发功能。现有的多因素身份验证需要经过审核的手动策略,而非使用此辅助脚本。
sudo bash scripts/setup-ssh-hardening.sh --user administrator --client-address 203.0.113.10 --dry-run
在已验证密钥/sudo 访问且获准配置/启用后:
sudo bash scripts/setup-ssh-hardening.sh --user administrator --client-address 203.0.113.10 --key-access-confirmed --apply --activate
对于必须验证的管理员,请重复指定 --user。当基于主机名的 Match 规则适用时,请设置 --client-host。辅助脚本会验证所提供的客户端上下文;还应检查其他相关网络/主机名。它会写入受管理的前置 drop-in 文件,并在更早的值或条件规则覆盖所请求的策略时拒绝报告成功。文件名靠前本身并不能证明优先级。
验证与恢复
- 语法:
sudo sshd -t。文件中的有效策略:sudo sshd -T -C user=administrator,host=client.example.com,addr=203.0.113.10。 - 在所有相关上下文中验证 root、密码和键盘交互式身份验证限制;确保所需的密钥登录以及任何预期的 MFA 仍可使用。
- 启用后,使用指定密钥建立新的登录并检查 sudo。从受控客户端测试被拒绝的身份验证方式。在这些测试通过之前,保留原会话。
- 如果脚本在验证或启用期间失败,它会恢复原有受管理 drop-in 文件的准确内容,并在需要时尝试重新加载恢复后的策略。之后如需回滚,请使用打印出的受保护备份目录;恢复其中保存的文件,或者如果此前不存在该文件,则移除新建的受管理文件。然后通过保留的会话/控制台验证并重新加载实际服务。
分别报告文件验证、启用和实时访问测试的结果。不要将 ClientAliveInterval 描述为用户空闲超时,也不要硬编码过时的协议/加密设置。