使用 fail2ban 防止 ssh 暴力破解

背景

当服务器暴露在公网环境时,22 端口又处于开放状态,会有大量的机器扫描服务器的 22 端口,试图使用密码登录服务器,获取服务器的使用权。如果 SSH 配置不当,不采取封禁措施,服务器很容易被暴力破解。接下来我将介绍如何合理配置 SSH 以及 fail2ban 工具,防止 ssh 被暴力破解。

环境

  • 操作系统: debian12

配置 SSH

为了防止黑客使用密码暴力破解 SSH,我们需要进行如下的配置:

PasswordAuthentication no # 禁止使用密码登录
PermitRootLogin prohibit-password # 允许 root 用户登录,但是禁止使用密码登录 root 用户
PubkeyAuthentication yes # 允许使用公钥进行登录
UsePAM no # 禁止 SSH 登录流程进入 Linux 的“统一认证/会话管理体系”,如果要允许密码登录,则需要设置成 yes
AllowUsers root # 只允许 root 用户登录,其他用户不允许登录,多个用户之间使用空格隔开。还可以配置只允许指定 IP/网段的某个用户登录

配置公钥

将允许连接服务器的客户端的公钥放到服务器的 ~/.ssh/authorized_keys 文件中。有两种操作方式:

  1. 手动复制
  2. 自动复制

如果公钥不存在,可以使用如下命令先生成公钥

ssh-keygen -t ed25519 -C "your_email@example.com"

手动复制

  1. 输出客户端公钥
cat ~/.ssh/id_ed25519.pub

将公钥内容放到服务器的 ``~/.ssh/authorized_keys` 文件中

自动复制

执行如下的命令自动复制公钥

ssh-copy-id username@remote_host
  • username 替换为远程服务器用户名
  • remote_host 替换为服务器 IP 地址或者域名

重启 SSH

systemctl restart sshd

重启成功后,一定要另开一个终端,看下配置是否生效。如果配置不当,导致无法登录,原先成功建立的 SSH 连接还可以兜底。

配置 fail2ban

安装

使用如下命令安装 fail2ban

apt install -y fail2ban

配置

[DEFAULT]
bantime  = 1d # 封禁时间 1 天
findtime = 10m # 查找范围 10 分钟内
maxretry = 3 # 最大尝试次数,配合 findtime 参数使用,表示:10 分钟内失败 3 次,封禁 1 天
backend  = systemd # backend 参数决定 fail2ban 从哪里读取日志。如果 ssh 是由 systemd 管理的,直接写 systemd 即可

[sshd]
enabled = true

启动并验证

systemctl enable --now fail2ban
fail2ban-client status sshd # 查看哪些 ip 被封禁
使用 Hugo 构建
主题 StackJimmy 设计