
SSH 是服务器最常用的远程入口,也是被暴力破解最频繁的服务。默认的 22 端口、允许 root 登录、密码认证组合起来,等于把钥匙插在门锁上。下面从认证方式、访问控制、服务参数三个维度,给出可直接落地的 SSH 安全加固方案。
一、改用密钥认证替代密码
1. 生成密钥对并上传公钥
在本地执行 ssh-keygen -t ed25519 -C "admin@server"。随后用 ssh-copy-id 把公钥写入服务器 ~/.ssh/authorized_keys,并确认文件权限为 600、目录为 700,权限过宽会被 sshd 忽略。
ssh-keygen -t ed25519 -C "admin@server"
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@203.0.113.10
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
2. 关闭密码登录前先验证密钥
改配置最忌讳把自己锁在门外。正确顺序是:保持当前会话不断开,新开终端用密钥登录成功,再修改 /etc/ssh/sshd_config 把 PasswordAuthentication 改为 no。然后用 sshd -t 校验语法、reload 平滑重载。
# /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no
sshd -t && systemctl reload sshd
二、限制登录来源与账号
1. 白名单允许的用户
AllowUsers 只放行明确需要的账号,其余一律拒绝。例如 AllowUsers deploy ops@203.0.113.0/24 表示 deploy 可从任意来源登录,ops 仅限该网段;对应的 DenyUsers 可挡住已离职账号。
2. 结合防火墙限制端口
把默认 22 改成高位端口只减少扫描噪音,真正的防线是防火墙白名单。用 ufw allow from 203.0.113.0/24 to any port 2222 proto tcp 只放行办公网段,其余来源在 TCP 层被丢弃。改端口后要同步 sshd、防火墙与云安全组三处,漏一处就会失联。
三、收敛服务参数与防护
1. 精简认证与会话参数
PermitEmptyPasswords no 禁止空密码,MaxAuthTries 3 限制试错次数,LoginGraceTime 30 缩短未认证连接存活时间,ClientAliveInterval 300 配合 ClientAliveCountMax 2 在客户端无响应 10 分钟后自动断开,共同压制自动爆破。
2. 用 fail2ban 自动封禁
即使关闭密码登录,扫描流量仍会挤占连接资源。fail2ban 读取 /var/log/auth.log 中的失败记录,达到阈值后调用防火墙封禁来源 IP。把 maxretry 设为 3、bantime 设为 3600,用 ignoreip 排除自己的出口 IP,避免误封。
# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 2222
maxretry = 3
bantime = 3600
ignoreip = 127.0.0.1/8
关键配置提示
- 改 sshd_config 前先备份,改动后用
sshd -t校验再 reload,不要直接 restart。 - 改端口涉及 sshd、防火墙、云安全组三处,务必同步,改完新开窗口验证连通性。
- 密钥文件权限必须为 600、
.ssh目录为 700,否则公钥认证会被静默跳过。

快来评论,快来抢沙发吧~