请编写Shell代码实现以下逻辑 ?
编写脚本/root/bin/checkip.sh,每5分钟检查一次,如果发现通过ssh登录失败次数超过10次,自动将此远程IP放入Tcp Wrapper的黑名单中予以禁止防问
为了实现这个需求,我们可以通过分析 /var/log/auth.log(这个日志文件路径可能因为系统的不同而有所变化)来检测 SSH 登录失败的尝试,并使用 Tcp Wrapper 来禁止对应的 IP 地址。以下是一个简单的实现脚本 /root/bin/checkip.sh:
#!/bin/bash
# 日志文件路径
LOG_FILE="/var/log/auth.log"
# 黑名单文件路径,确保你的sshd服务配置了使用这个文件
BLACKLIST_FILE="/etc/hosts.deny"
# 检查登录失败的IP地址并计数
awk '/sshd.*Failed password/ {print (NF-3)}'LOG_FILE | sort | uniq -c | while read count ip; do
if [ count -gt 10 ]; then
# 检查IP是否已经在黑名单中
if ! grep -qip BLACKLIST_FILE; then
# 将IP添加到黑名单中
echo "sshd:ip" >> BLACKLIST_FILE
echo "ip has been added to the blacklist."
fi
fi
done
脚本说明:
- 使用
awk从auth.log中提取登录失败的尝试,并获取失败来源的 IP 地址。 - 使用
sort | uniq -c来计算每个 IP 地址登录失败的次数。 - 如果某个 IP 地址的失败次数超过 10 次,则检查该 IP 地址是否已经在
/etc/hosts.deny文件中。 - 如果 IP 地址不在黑名单中,则将其添加到
/etc/hosts.deny文件中,以禁止该 IP 地址访问 SSH 服务。
自动执行脚本
为了每 5 分钟执行一次这个脚本,你可以将其添加到 cron 任务中。编辑当前用户的 crontab 文件:
crontab -e
然后添加以下行到 crontab 文件中:
*/5 * * * * /root/bin/checkip.sh
这会确保 /root/bin/checkip.sh 脚本每 5 分钟运行一次。
注意事项
- 确保脚本有执行权限:
chmod +x /root/bin/checkip.sh。 - 根据你的 Linux 发行版,
auth.log的路径可能有所不同。例如,CentOS/RedHat 系统可能需要检查/var/log/secure。 - 使用 Tcp Wrapper 来限制访问前,请确保你的 SSH 服务是通过
tcp_wrappers来管理访问控制的。 - 修改系统配置文件前,建议备份相关文件。
- 这个脚本简单地将超过失败次数的 IP 地址添加到黑名单中,没有提供自动从黑名单中移除 IP 地址的机制。在实际使用中,可能需要定期审核和清理黑名单。