一、fail2ban:让异常访问自动退散
先说说fail2ban。这个工具的核心价值在于:当系统日志中出现大量重复的认证失败记录时,它能自动触发iptables规则,临时阻断来源IP的访问。这就像给服务器装了一个智能门卫,发现有人反复输错密码,就请他暂时离开。
实际搭建场景
去年我负责一个电商平台的运维交付,客户要求对SSH登录进行保护。我选择了fail2ban,设置过程非常简单:
# 安装
yum install epel-release -y
yum install fail2ban -y
# 启动服务
systemctl enable fail2ban
systemctl start fail2ban
核心设置在/etc/fail2ban/jail.local中:
[DEFAULT]
# 忽略本地回环地址
ignoreip = 127.0.0.1/8 ::1
# 封禁时间:1小时
bantime = 3600
# 检测时间窗口:10分钟
findtime = 600
# 最大失败次数:5次
maxretry = 5
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
action = iptables[name=SSH, port=ssh, protocol=tcp]
排坑记:日志路径踩过的坑
第一次搭建时,我发现fail2ban始终不生效。排查后发现,CentOS 7的SSH日志路径是/var/log/secure,而Ubuntu系统是/var/log/auth.log。这个差异让我浪费了半天时间。
另外,如果SSH端口不是默认的22,需要在port字段指定实际端口:
[sshd]
port = 2222
监控与调优
搭建完成后,我习惯用fail2ban-client status sshd查看状态:
# 查看SSH jail的状态
fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 12
| `- File list: /var/log/secure
`- Actions
|- Currently banned: 3
|- Total banned: 15
`- Banned IP list: 192.168.1.100 10.0.0.50 172.16.0.88
如果发现误封,可以用fail2ban-client set sshd unbanip 192.168.1.100解封。这个命令在调试阶段非常实用。
二、rkhunter:系统文件的健康体检师
rkhunter(Rootkit Hunter)是一个系统文件完整性检查工具。它能扫描系统文件、内核模块、网络端口等,发现异常修改。我把它比作“系统体检师”,定期检查系统文件的“健康状况”。
搭建与设置
安装同样简单:
# CentOS
yum install rkhunter -y
# Ubuntu
apt-get install rkhunter -y
首次使用前需要更新文件属性数据库:
rkhunter --propupd
这个命令会记录当前系统文件的哈希值、权限、所有者等信息,作为后续检查的基准。
实战设置
我习惯在/etc/rkhunter.conf中做几个关键调整:
# 启用系统命令完整性检查
ENABLE_TESTS="all"
# 设置邮件通知(可选)
MAIL-ON-WARNING=root@localhost
# 设置日志路径
LOG_FILE=/var/log/rkhunter.log
排坑记:误报处理的艺术
第一次运行rkhunter时,我被大量警告吓到了。仔细分析后发现,很多是“误报”:
SSH设置检查:rkhunter会检查SSH是否允许root登录。如果业务需要,可以在设置中忽略:
# 在rkhunter.conf中添加
ALLOW_SSH_ROOT_USER=yes
隐藏文件检查:某些应用会在/dev目录创建文件,这会被rkhunter标记。需要将这些路径加入白名单:
# 在rkhunter.conf中添加
ALLOWHIDDENDIR=/dev/shm
内核模块检查:如果加载了非标准内核模块,rkhunter会报警。需要确认模块来源后,在设置中允许:
# 在rkhunter.conf中添加
ALLOW_KERNEL_MODULE=ip_tables
自动化检查脚本
我写了一个简单的cron任务,每周自动执行检查并发送报告:
#!/bin/bash
# /usr/local/bin/security_check.sh
LOG_FILE="/var/log/security_weekly.log"
rkhunter --check --skip-keypress --report-warnings-only > $LOG_FILE 2>&1
# 如果发现异常,发送邮件
if [ -s $LOG_FILE ]; then
mail -s "Weekly Security Check Report" admin@example.com < $LOG_FILE
fi
在crontab中添加:
0 2 * * 0 /usr/local/bin/security_check.sh
三、两个工具的协同使用
在实际运维中,我通常这样组合使用:
- fail2ban:实时监控认证日志,自动阻断异常访问
- rkhunter:定期检查系统文件完整性,发现异常修改
每周一早上,我会查看rkhunter的检查报告,同时检查fail2ban的封禁列表。如果发现某个IP被反复封禁,会进一步分析其访问模式。
四、最佳实践总结
先测试再上线:在非生产环境充分测试fail2ban的封禁阈值,避免误封- 日志轮转设置:确保fail2ban能正确读取轮转后的日志文件
- 定期更新:保持fail2ban和rkhunter版本更新,获取最新的检测规则
这两个工具就像系统的“健康卫士”,一个负责“门禁管理”,一个负责“定期体检”。它们不是万能的,但能帮我们解决90%的日常运维问题。希望我的经验能帮助大家少走弯路,让系统运行得更平稳。
👨💻 运维经验:根据实际生产环境,以上步骤建议先在测试环境验证,并做好备份。参数值需根据服务器设置调整,不要盲目照搬。