文章最后更新时间:2022年11月16日已超过744天没有更新。
前言
公网环境非常恶劣,经常会遇见暴力破解的攻击手段,为了预防暴力破解,我们将写一个脚本,将登录失败五次以上的ip地址拉入黑名单,禁止其访问服务器,并发邮件通知管理员。
提示:以下是本篇文章正文内容,下面案例可供参考
一、服务器环境配置准备
centos7系统
禁用firewalld防火墙
开启iptables防火墙
配置邮箱
二、环境配置
禁用firewalld
systemctl stop firewalld systemctl disable firewalld
关闭selinux
[root@web_hk ~]# setenforce 0 //临时关闭selinux [root@web_hk ~]# getenforce Disabled [root@web_hk ~]# cat /etc/selinux/config //检查此文件,确认selinux永久关闭 # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
安装、启用iptables服务
[root@web_hk ~]# yum install iptables-services [root@web_hk ~]# systemctl start iptables [root@web_hk ~]# systemctl enable iptables Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
配置邮箱mail
#安装mail邮箱 yum install mailx -y [root@WEB ~]# vim /etc/mail.rc set bsdcompat set from=123456@qq.com //邮箱地址, set smtp=smtp.exmail.qq.com set smtp-auth-user=123456@qq.com //邮箱 账户 set smtp-auth-password=123 //邮箱密码 set smtp-auth=login
邮箱测试:
echo “内容” | mail -s 主题 接收的邮箱地址
[root@web_hk ~]# echo "888888" | mail -s test 987654@qq.com
三、for循环脚本
[root@web_hk ~]# touch unlogin.sh [root@web_hk ~]# chmod 755 unlogin.sh //赋予执行权限 [root@web_hk ~]# ll total 0 -rwxr-xr-x 1 root root 0 Apr 15 20:05 unlogin.sh [root@web_hk ~]# vi unlogin.sh
记录登录失败的主机ip地址,并记录到/tmp/host文件,记住是覆盖 >
lastb | awk '{print $3}' | grep ^[0-9] | uniq -c | awk '{print $1"="$2}' > /tmp/host
将登录失败的主机信息赋予变量list
list=`cat /tmp/host`
for循环取值
for i in $list;do ip=`echo $i | awk -F= '{print $2}'`//取出登录失败的ip地址 num=`echo $i | awk -F= '{print $1}'`//取出登录的失败次数,用于if判断
if [[ $num -gt 5 ]];then //失败次数大于5次,就执行以下的脚本 echo "$(date +%F) $(date +%T)" >> /$HOME/error_login,log//记录时间 echo $ip >> /$HOME/error_login,log//记录被拉黑的IP地址 echo $ip >> /tmp/host_deny//记录将要被拉黑的临时文件 deny_ip=`cat /tmp/host_deny`//把拉黑的ip地址赋予变量deny_ip
继续嵌套否循环输出
for i in $deny_ip;do //读取黑名单的ip地址 /usr/sbin/iptables -I INPUT -s $i -j DROP //iptables禁止ip访问 echo "$i 企图恶意登录,已封禁" | mail -s “疑似暴力破解” 123456@qq.com//发邮件通知管理员 lastb >> /root/btmp //备份登录失败的ip记录 cat /dev/null > /var/log/btmp //清空登录失败的ip地址记录,如果不清空,将会陷入死循环 rm -rf /tmp/host_deny //删除临时文件 done fi done
最终脚本内容:
#!/bin/bash lastb | awk '{print $3}' | grep ^[0-9] | uniq -c | awk '{print $1"="$2}' > /tmp/host list=`cat /tmp/host` for i in $list;do ip=`echo $i | awk -F= '{print $2}'` num=`echo $i | awk -F= '{print $1}'` if [[ $num -gt 5 ]];then echo "$(date +%F) $(date +%T)" >> /$HOME/error_login,log echo $ip >> /$HOME/error_login,log echo $ip >> /tmp/host_deny deny_ip=`cat /tmp/host_deny` for i in $deny_ip;do /usr/sbin/iptables -I INPUT -s $i -j DROP echo "$i 企图恶意登录,已封禁" | mail -s “疑似暴力破解” 123456@qq.com lastb >> /root/btmp cat /dev/null > /var/log/btmp rm -rf /tmp/host_deny done fi done
定时任务开启
[root@WEB ~]# crontab -e
总结
1、我的脚本是在/root目录下编写的,记住自己编写脚本的路径,灵活应对。
2、我手动执行脚本是正常的,但是加入定时任务之后,出现防火墙的命令没有执行的情况,最终查询是环境变量问题,因此写脚本时候,防火墙使用的命令是绝对路径,在加入cron任务时候也加入环境声明./etc/profile;/bin/bash,最终才得以执行
文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。