shell脚本实现:定时检测 若ssh用户访问密码输入错误次数超过上限 则强制加入ssh访问黑名单
程序员文章站
2024-03-19 13:05:34
...
涉及知识点
- wrappers是一个工作在传输层的安全工具,凡是调用了libwrap.so库文件的应用都受wrappers的访问控制。wrappers依赖/etc/hosts.allow和/etc/hosts.deny两个文件,wrappers会先检查/etc/hosts.allow白名单,然后检查/etc/hosts.deny黑名单。
- 查看应用程序是否受wrappers控制方法(以sshd应用程序为例子)
- 方法一:strings
[[email protected] ~/test]$strings /usr/sbin/sshd | grep hosts_access hosts_access
- 方法二:ldd
[[email protected] ~/test]$ldd /usr/sbin/sshd | grep libwrap libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f59aac26000)
- 脚本如下:
#!/bin/bash
#
#
#===================================================================
#
# author: 9528
# mail: [email protected]
# date: 2019-08-02
#
#-------------------------------------------------------------------
#
# 简述:
# 实现检测$Check_interval_time时间内ssh登陆密码输入错误次数达到
# $Allow_num次上限值的ip,视其为有攻击性,将ip加入/etc/hosts.deny黑
# 名单中,拒绝访问。可把此脚本加入定时任务crontab中,实现定时检测。
#
#
# 注意:
# 此脚本只针对ssh访问,在centos7.6上测试,telnet并不受
# /etc/hosts.deny黑名单控制。telnet是明文传输,一般已弃用,若你开启
# 了telnet服务,则需要考虑telnet访问。
#
#===================================================================
#检测时间间隔,单位分钟,推荐和crontab定时任务时间设置一致
Check_interval_time=30
#密码输入错误上限次数
Allow_num=10
#存放临时文件的目录
Dir="checkip"
#临时文件
Today_log_file="$Dir/log.file"
Ssh_failed_file="$Dir/ssh.file"
Latest_ip_file="$Dir/latest.file"
Count_ip_file="$Dir/count.file"
Deny_ip_file="$Dir/deny.file"
#系统文件
System_deny_file="/etc/hosts.deny"
System_login_log_file="/var/log/secure"
#月份
Month=`date +"%b"`
#日期,注意:这里Day的值是两个字符
Day=`date +"%e"`
#上一次检测时间,用当前时间减去$Check_interval_time
Last_check_time=`date +"%H:%M:%S" -d"-$Check_interval_time min"`
if [ ! -d $Dir ];then
mkdir $Dir
if [ $? -ne 0 ];then
echo "Error: mdkir $Dir failed."
exit 1
fi
fi
#
#清空临时文件
> $Today_log_file
> $Ssh_failed_file
> $Latest_ip_file
> $Count_ip_file
> $Deny_ip_file
#
#/var/log/secure系统登陆日志不存在时报错退出
if [ ! -f $System_login_log_file ];then
echo "Error: cat $System_login_log_file failed. No such file."
exit 2
fi
#
#
#分步骤取出符合条件的ip:
# 1.取出今天内的登陆日志
# 2.取出今天内ssh登陆密码错误的日志
# 3.取出$Check_interval_time时间内ssh登陆密码错误的日志
# 4.统计每个ip个数
# 5.取出输入密码次数超过允许上限次数的ip
# 6.若黑名单中没有此ip,则强制加入黑名单,拒绝访问
#
cat $System_login_log_file | egrep "^$Month[[:space:]]{1}$Day[[:space:]]{1}" > $Today_log_file
cat $Today_log_file | egrep "Failed password" > $Ssh_failed_file
awk '{if($3 > n){print $11}}' n=$Last_check_time $Ssh_failed_file > $Latest_ip_file
awk '{count[$1]++}END{for(i in count){print i" "count[i]}}' $Latest_ip_file > $Count_ip_file
awk '{if($2 > n){print $1}}' n=$Allow_num $Count_ip_file > $Deny_ip_file
while read line;do
fgrep sshd:$line $System_deny_file > /dev/null
if [ $? -ne 0 ];then
echo sshd:$line:deny >> $System_deny_file
fi
done < $Deny_ip_file