ssh 防爆破配置
最近我的一台小水管被ssh爆破 并感染挖矿⛏病毒 特此记录ssh 相关一些安全配置
Fail2Ban
Fail2Ban 是一个通过监控日志文件来更新防火墙规则的工具。发现“密码错误”或“用户不存在”的记录达到一定次数后,直接在系统防火墙层面(iptables/firewalld)封锁该 IP。
1. 安装 Fail2ban
Ubuntu/Debian:
sudo apt update
sudo apt install fail2ban -yCentOS/RHEL (需要先安装 EPEL 源):
sudo yum install epel-release -y
sudo yum install fail2ban -y2. 配置 Fail2ban
Fail2ban 的默认配置文件是 /etc/fail2ban/jail.conf。不要直接修改这个文件,因为软件包更新时它会被覆盖。你应该创建一个 .local 副本进行配置。
创建配置文件
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local编辑配置文件
使用编辑器(如 nano 或 vim)打开:
sudo nano /etc/fail2ban/jail.local找到 [sshd] 部分,修改下面内容:
#这个文件上面是一些全局生效配置 优先级小于app里面具体配置 也就是下面再次配置会覆盖
# 这里需要特别注意一下 自己系统使用防火墙是哪一种 虽然大多数linux都是基于iptables,
# 但是你的管理工具可能不是iptables 需要根据实际情况来 例如我用的ufw管理防火墙
# 默认ipv6也是关闭的 可以根据自己需要开
banaction = ufw
banaction_allports = ufw
allowipv6 = auto
# 忽略 localhost 和你自己的 IP,用空格隔开
ignoreip = 127.0.0.1/8 ::1 192.168.1.100
#...
[sshd]
# 激活该监狱
enabled = true
# 过滤模式(默认是 sshd)
filter = sshd
# SSH 端口,如果你改了 SSH 端口,请在这里填入正确端口(例如 port = 2222)
port = ssh
# 日志文件路径
# Ubuntu/Debian 通常是 /var/log/auth.log
# CentOS/RHEL 通常是 /var/log/secure
# 如果不确定,可以写成后端自动检测:logpath = %(sshd_log)s
logpath = /var/log/auth.log
# 在多长时间内(秒)发生失败尝试(以下示例为 10 分钟)
findtime = 600
# 最大重试次数
maxretry = 5
# 封禁时长(秒),-1 为永久封禁。以下示例为封禁 1 小时
bantime = 36003. 启动并启用服务
配置完成后,启动 Fail2ban 并设置开机自启:
# 启动服务
sudo systemctl start fail2ban
# 设置开机自启
sudo systemctl enable fail2ban
# 重新加载配置
sudo fail2ban-client reload4. 常用管理命令
配置好后,你需要知道如何查看状态以及如何解封 IP。
查看 Fail2ban 运行状态:
sudo fail2ban-client status查看 SSH 防护的具体情况(查看被封禁的 IP):
sudo fail2ban-client status sshd手动解封某个 IP:
sudo fail2ban-client set sshd unbanip <IP地址>手动封禁某个 IP:
sudo fail2ban-client set sshd banip <IP地址>
2FA(双因素认证)
第一步:安装 Google Authenticator 相关库
Ubuntu/Debian:
sudo apt update
sudo apt install libpam-google-authenticator -yCentOS/RHEL:
sudo yum install epel-release -y
sudo yum install google-authenticator -y第二步:生成 2FA 密钥
在终端中以你要登录的用户身份(不要只用 root,除非你平时只用 root 登录)运行以下命令:
# 这里屏幕太小显示不全二维码 可以 ctrl - 缩小终端字符
google-authenticator程序会问你几个问题,建议如下选择:
- Do you want authentication tokens to be time-based? (y/n)
- 输入
y(基于时间的动态口令)。
- 输入
- 出现二维码和密钥:
- 重要: 用手机 APP(Google Authenticator, Microsoft Authenticator 或 Bitwarden)扫描二维码。
- 务必保存好下方的 "emergency scratch codes"(紧急备用码),万一手机丢了,这是你唯一的登录手段。
- Do you want me to update your "/home/user/.google_authenticator" file?
- 输入
y。
- 输入
- 是否禁止多人共用同一个动态码?
- 输入
y。
- 输入
- 是否延长有效时间容错(解决手机与服务器时间微小差异)?
- 输入
y(允许约 4 分钟的误差)。
- 输入
- 是否开启频率限制(每 30 秒最多尝试 3 次)?
- 输入
y。
- 输入
第三步:配置 PAM 模块
我们需要告诉 Linux 系统在 SSH 登录时调用 Google Authenticator。
编辑 PAM 配置文件:
sudo nano /etc/pam.d/sshd在文件末尾(或合适位置)添加这一行:
auth required pam_google_authenticator.so注意:如果你希望即使没有配置 2FA 的用户也能登录(过渡期),可以写成
auth [success=done default=ignore] pam_google_authenticator.so nullok。(可选) 找到
@include common-auth,如果你想先输验证码再输密码,把上面那行放在它前面;如果你想先输密码再输验证码,放在它后面。
第四步:配置 SSH 服务
编辑 SSH 配置文件:
sudo nano /etc/ssh/sshd_config查找并修改以下参数(确保它们为
yes):KbdInteractiveAuthentication yes UsePAM yes(注:在旧版本 SSH 中,该参数可能叫
ChallengeResponseAuthentication yes)
第五步:重启并测试
在重启服务前,请务必保持当前的 SSH 连接不要断开! 防止配置错误导致无法登录。
重启 SSH:
sudo systemctl restart ssh打开一个新的终端窗口尝试登录。
默认先输入密码器 再输入密码
被爆破反思
分析原因
1. 云服务商防护墙设置不够完善
- 这里没有限制22端口范围,设置所有ip都能访问,这里设置自己几个ip或者仅境内ip
- 云服务商防火墙,不支持禁止同内网段ip访问
- ssh异地登陆没有提示,这个云服务商不支持
- 这台服务器上面没有放任何有价值数据 所以还好损失较小 后面重装后 除了web版防火墙在操作系统里面也开启防火墙
2. 密码一致可能被撞库
- 懒得记那么多密码,所以不重要平台我都是使用一样密码,这也导致被撞库成功。
3. 偷懒使用默认root用户
- 这个问题也比较严重,默认应该关闭root用户直接登陆。这样即使撞库难度成本也增加不少。
如何发现病毒
首先是网络卡顿敲命令不跟手
分析top占用,发现有未知redis服务(到这一步还未怀疑是病毒,病毒伪装redis服务)
htop历史命令查找不到很干净(感到奇怪但是还是未怀疑中病毒)
# 病毒定时清空历史记录 history查看ssh登陆记录很少,只用我最近登陆成功记录
# 查看谁正在使用登陆成功使用终端 w # 查看ssh,登陆失败记录,病毒删除自己登陆记录 sudo grep "Failed password" /var/log/auth.log查看网络流量,查看流量大ip是否是自己属性的(这一步发现好几个境外ip,感到不对劲了)
sudo iftop -n -N -P查询是否配置免密登陆(这里才发现被入侵了,发现未知public key)
# 这一步发现 cat ~/.ssh/authorized_keys # 尝试删除失败 设置只读 rm -f ~/.ssh/authorized_keys查询定时任务(发现病毒脚本定时任务,确定中挖矿病毒)
#这里发现上述未知redis任务 crontab -l #根据任务脚本路径去查看对应脚本内容,这一步重装系统没记录下了 #这里可能无法直接查看脚本内容,因为是编译加密过的。但是还是可以看到部分设置public key一些操作相关信息
病毒会每秒检查自己是否存活,删除历史执行记录,加入自己public key 设置仅读权限 这也是为什么我无法删除~/.ssh/authorized_keys原因
正确做法
- 修改ssh默认端口,禁止root用户远程登陆(或使用public key登陆)
- 设置第三方安全验证(Fail2Ban+2FA)
- 防火墙非必要不放行,服务不放在常用默认端口
现在虽然22端口还是放行,但是加上上面操作,已经比以前安全很多 无异地登陆成功记录
