SSH 登录加固实战:密钥登录、禁用密码与 fail2ban 防爆破
【摘要】 介绍SSH登录加固的完整流程:部署并验证ed25519密钥、创建普通用户、关闭密码登录与root限制、修改sshd配置,以及使用fail2ban自动封禁爆破IP,并给出日常检查清单。
新买的云服务器一上线,几分钟内 /var/log/auth.log(或 /var/log/secure)里就会出现大量来自陌生 IP 的登录尝试。只要 22 端口对公网开放、又允许密码登录,就等于把门锁交给了全网的扫描脚本。这篇文章按"先能安全进来、再把门关紧"的顺序,整理一套 SSH 加固的实操步骤,每一步都给出验证方法,避免把自己锁在门外。
## 一、先生成并部署密钥
在本地电脑上生成一对密钥,推荐使用 ed25519 算法,体积小、安全性高:
```bash
ssh-keygen -t ed25519 -C "my-laptop"
```
一路回车会在 ~/.ssh/ 下生成 id_ed25519(私钥,绝不外传)和 id_ed25519.pub(公钥)。建议给私钥设置一个口令,即使文件泄露也多一道保护。
把公钥放到服务器上:
```bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@服务器IP
```
如果本地没有 ssh-copy-id,也可以手动追加:
```bash
cat ~/.ssh/id_ed25519.pub | ssh root@服务器IP \
"mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
```
权限是最常见的坑:~/.ssh 必须是 700,authorized_keys 必须是 600,用户家目录也不能对其他人可写,否则 sshd 会直接忽略密钥,继续要求输入密码。
## 二、验证密钥登录真的生效
在改配置之前,务必先确认密钥能用:
```bash
ssh -o PasswordAuthentication=no root@服务器IP
```
这条命令强制只用密钥,如果能直接登录,说明密钥已经生效;如果报 Permission denied (publickey),就要回头检查权限和公钥内容,此时千万不要关闭密码登录。
## 三、创建普通用户并收紧 root
长期用 root 登录风险很高,建议建一个日常账号并赋予 sudo 权限:
```bash
adduser deploy
usermod -aG sudo deploy # CentOS/openEuler 上用 wheel 组
mkdir -p /home/deploy/.ssh
cp ~/.ssh/authorized_keys /home/deploy/.ssh/
chown -R deploy:deploy /home/deploy/.ssh
chmod 700 /home/deploy/.ssh && chmod 600 /home/deploy/.ssh/authorized_keys
```
同样用 `ssh deploy@服务器IP` 验证能登录,并执行 `sudo -v` 确认 sudo 可用。
## 四、修改 sshd 配置
新版发行版推荐把自定义配置放在 /etc/ssh/sshd_config.d/ 目录下,避免升级时被覆盖。新建 /etc/ssh/sshd_config.d/99-hardening.conf:
```
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers deploy root
```
几项说明:
- PermitRootLogin prohibit-password 表示 root 只能用密钥登录;确认 deploy 账号可用后,可以进一步改为 no。
- MaxAuthTries 限制单次连接的认证次数,LoginGraceTime 缩短未完成认证的连接占用时间。
- AllowUsers 是白名单,只有列出的用户可以通过 SSH 登录。
注意:部分云镜像的 /etc/ssh/sshd_config.d/50-cloud-init.conf 里写了 PasswordAuthentication yes,而 sshd 对同一选项采用"先读到的生效",所以文件名要排在它前面,或者直接修改那个文件。可以用下面的命令查看最终生效值:
```bash
sshd -T | grep -Ei 'passwordauth|permitroot|maxauth'
```
改完先检查语法,再重载:
```bash
sshd -t && systemctl reload sshd # Ubuntu 上服务名可能是 ssh
```
关键习惯:重载后保持当前会话不要断开,另开一个终端测试新登录。确认没问题之后再关闭旧会话,这样即使配置写错,也还有一个窗口可以修回来。
## 五、要不要改端口
把 22 改成其他端口能明显减少日志里的扫描噪音,但它不是真正的安全措施。如果要改,需要同时处理三件事:sshd 配置里的 Port、系统防火墙(firewalld/ufw),以及云平台安全组的入方向规则。三者漏掉任何一个都会连不上。更推荐的做法是在安全组里把 22 端口的来源限制为自己的固定 IP 或跳板机地址,这比改端口有效得多。
## 六、用 fail2ban 自动封禁爆破 IP
关闭密码登录后爆破基本无效,但 fail2ban 仍然能减少日志噪音和连接消耗:
```bash
apt install fail2ban # 或 dnf install fail2ban
```
新建 /etc/fail2ban/jail.local:
```
[sshd]
enabled = true
maxretry = 5
findtime = 10m
bantime = 1h
```
启动并查看状态:
```bash
systemctl enable --now fail2ban
fail2ban-client status sshd
```
误封自己时可以用 `fail2ban-client set sshd unbanip 你的IP` 解除,也可以在 jail.local 的 [DEFAULT] 段里配置 ignoreip 把常用 IP 加入白名单。
## 七、日常检查清单
- 查看最近登录记录:`last -n 20`、`lastb | head`(失败记录)。
- 实时观察认证日志:`journalctl -u sshd -f` 或 `tail -f /var/log/auth.log`。
- 定期审计 authorized_keys,删掉离职同事或不再使用的设备公钥。
- 本地 ~/.ssh/config 为常用主机配置别名,减少手输 IP 和用户名出错:
```
Host prod
HostName 服务器IP
User deploy
IdentityFile ~/.ssh/id_ed25519
```
## 小结
SSH 加固的核心顺序是:部署密钥并验证、建普通用户、关闭密码登录、限制来源、加 fail2ban。每改一步都保留一个已登录的会话做后路,就基本不会出现把自己锁在门外的情况。花二十分钟做完这些,服务器面对的公网风险会小很多。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)