SSH 登录加固实战:密钥登录、禁用密码与 fail2ban 防爆破

举报
yd_281047095 发表于 2026/11/03 09:15:32 2026/11/03
【摘要】 介绍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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。