欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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