Linux下apache防恶意访问(攻击)脚本

一、场景:由于公司在行业这块比较出名,经常会受到竞争对手的恶意攻击,导致网站经常访问瘫痪

二、分析:1、某一天内某些IP访问量非常大,2、某一IP连接访问超过的次数到达一定的次数(本文中设置为8)

三、解决思路:通过第二点分析出来的两点问题进行拦截,但要注意的只,只拦截有效URL或者是我们想拦截的URL,举个例子,一个客户访问了网站首页,但客户的请求一次网站首页,连带的同时客户也请求了网站首页所需求加载的各个图片、css、js等资源,这些请求我们是不能算在客户请求里的,对于这样的客户有效访问只算一次,即他只访问了首页

四、提前说明:网站的apache访问日志是一天分割两次的,这样的话,每天的apache访问日志量不会太大,程序分析起来效率会快很多

五、先看一下shell脚本(该shell脚本可以在linux crontab里设置分1到3分钟执行一次):

#!/bin/sh

#危险负载阈值,当系统负载达到该值时启动拦截程序

TOP_SYS_LOAD_NUM=2.1

#安全负载阈值,当系统负载达到该值时关闭拦截程序

SAFE_SYS_LOAD_NUM=0.5

#apache危险连接数,当apache连接数达到该值时启动拦截程序(与系统负载的阈值是“或”的关系)

HTTPD_PROCESS_NUMBER_MAX=350

#apache危险连接数,当apache连接数低于该值时关闭拦截程序(与系统负载的阈值是“且”的关系)

HTTPD_PROCESS_NUMBER_SAFE=250

SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`

HTTPD_PROCESS_NUMBER=`ps -ef | grep httpd | wc -l`

#拦截文件标识(以些来判断是否已经处理拦截状态)

FILEPATH=/var/www/html/test/.htaccess_under_attack.id

ISOLDCONFIGFILE=""

echo $(date +"%y-%m-%d") `uptime`

echo $HTTPD_PROCESS_NUMBER

#满足条件时启动拦截

if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ] || [ `echo "$HTTPD_PROCESS_NUMBER_MAX < $HTTPD_PROCESS_NUMBER"|bc` -eq 1 ]

then

        #如果之前已经开始拦截(创建了拦截文件),那么拦截日志一行的后面会加多加一段显示“更新后”,如【图1】

if [ -f $FILEPATH ]

        then

                ISOLDCONFIGFILE="\t更新后"

        #否则创建拦截文件,如下【图2】

else

                touch $FILEPATH

        fi

#切换到拦截网站的根目录

        cd /var/www/html/test/crond/

#运行拦截php程序

        /usr/bin/php -q crond_under_attack.php > /dev/null 2>&2

#将php程序更新好的apache的重写文件.htaccess_under_attack覆盖到根目录

        cp /var/www/html/test/.htaccess_under_attack /var/www/html/test/.htaccess_under_attack_temp

        mv -f /var/www/html/test/.htaccess_under_attack_temp /var/www/html/test/.htaccess

        #已启动拦截程序,并将“使用黑名单(智能加强)配置文件”记录日志,如【图2】

echo -e "##" $(date +"%Y-%m-%d %H:%M:%S") " 使用黑名单(智能加强)配置文件"""$ISOLDCONFIGFILE >> /var/www/html/test/log/apache_access/apache_access_$(date +%Y%m%d).txt

#否则我们不执行拦截程序,或者记录日志告诉我们:之前处于拦截状态,现在已安全,并使用了默认配置文件,并将“使用了默认配置文件”这段话记录在日志,如【图3】

else

if [ -f $FILEPATH ] && [ `echo "$SAFE_SYS_LOAD_NUM > $SYS_LOAD_NUM"|bc` -eq 1 ] && [ `echo "$HTTPD_PROCESS_NUMBER_SAFE > $HTTPD_PROCESS_NUMBER"|bc` -eq 1 ]

then

rm -f $FILEPATH

cp /var/www/html/test/.htaccess_default /var/www/html/test/.htaccess_default_temp

mv -f /var/www/html/test/.htaccess_default_temp /var/www/html/test/.htaccess

echo "##" $(date +"%Y-%m-%d %H:%M:%S") " 使用默认配置文件" >> /var/www/html/test/log/apache_access/apache_access_$(date +%Y%m%d).txt

else

echo "Do nothing" `uptime`

fi

fi

六、shell脚本调用的php脚本(自动检测和更新黑名单)如下:

<?php

$match_string = "index.php?action=login";

$match_string_second = "script>";

//连续访问最大次数

$match_time = 8;

//日志文件最后300行最多访问次数

$matched_numbers_300 = 40;

//ip白名单

$ip_white_array = array('172.68.34.45','172.68.46.82');

//根据不同的时间段,设置一个IP最大的访问次数,如现在是16点那么,一个判断的标准就是该ip在日志中出现的有效访问次数不能超过4000

$matched_numbers = 3000;

$date_hour = date("H");

if(in_array($date_hour, array('06', '07', '19', '20'))) {

$matched_numbers = 800;

} else if(in_array($date_hour, array('03', '04', '05', '16', '17', '18'))) {

$matched_numbers = 4000;

}

$log_dir = "../log/under_attack";

//获取apache配置文件的内容

$htaccess_content = file_get_contents("/var/log/httpd/access_test_log");

$htaccess_content_array = explode("\n", $htaccess_content);

$htaccess_content_array_count = count($htaccess_content_array);

$htaccess_content_array_300 = array_splice($htaccess_content_array, $htaccess_content_array_count - 300, 300);

$hack_array = array();

$hack_array_number = array();

//字符串中带有这些访问标识的不记录在有效访问次数中

$match_char = "/(OPTIONS |ajax_|.jpg|.jpeg|.png|.gif|.bmp|.js|.css)/i";

$date_hour = intval(date("H"));

foreach($htaccess_content_array as $htaccess_value) {

$line_array = explode(" - - ", $htaccess_value);

if(!preg_match($match_char, $htaccess_value)) {

array_push($hack_array_number, $line_array[0]);

} else if(strstr($htaccess_value, $match_string)) {

array_push($hack_array, $line_array[0]);

} else if(strstr($htaccess_value, $match_string_second)) {

array_push($hack_array, $line_array[0]);

}

}

$hack_array_300 = array();

$hack_array_number_300 = array();

foreach($htaccess_content_array_300 as $htaccess_value_300) {

$line_array_300 = explode(" - - ", $htaccess_value_300);

if(!preg_match($match_char, $htaccess_value_300)) {

array_push($hack_array_number_300, $line_array_300[0]);

} else {

array_push($hack_array_300, $line_array_300[0]);

}

}

$under_attack_ips_insert = "";

$under_attack_log = "";

$hack_total = array();

foreach($hack_array_number as $hack_value) {

if(!in_array($hack_value, $ip_white_array)) {

if(!isset($hack_total[$hack_value])) {

$hack_total[$hack_value] = 1;

} else {

$hack_total[$hack_value] = $hack_total[$hack_value] + 1;

}

}

}

foreach($hack_total as $total_key => $total_value) {

if($total_value < $matched_numbers) {

unset($hack_total[$total_key]);

}

}

foreach($hack_array as $hack_value) {

if(!in_array($hack_value, $ip_white_array)) {

if(!isset($hack_total[$hack_value])) {

$hack_total[$hack_value] = 1;

} else {

$hack_total[$hack_value] = $hack_total[$hack_value] + 1;

}

}

}

foreach($hack_total as $hack_key => $hack_time) {

if($hack_time >= $match_time) {

$under_attack_ips_insert .= "Deny from " . $hack_key . "\n";

$under_attack_log .= $hack_key . "\t" . $hack_time . "\n";

}

}

/***********取倒数300行数据进行分析开始************/

$hack_total_300 = array();

foreach($hack_array_number_300 as $hack_value_300) {

if(!in_array($hack_value_300, $ip_white_array)) {

if(!isset($hack_total_300[$hack_value_300])) {

$hack_total_300[$hack_value_300] = 1;

} else {

$hack_total_300[$hack_value_300] = $hack_total_300[$hack_value_300] + 1;

}

}

}

foreach($hack_total_300 as $total_key => $total_value) {

if($total_value < $matched_numbers) {

unset($hack_total_300[$total_key]);

}

}

foreach($hack_array_300 as $hack_value_300) {

if(!in_array($hack_value_300, $ip_white_array)) {

if(!isset($hack_total_300[$hack_value_300])) {

$hack_total_300[$hack_value_300] = 1;

} else {

$hack_total_300[$hack_value_300] = $hack_total_300[$hack_value_300] + 1;

}

}

}

foreach($hack_total_300 as $hack_key_300 => $hack_time_300) {

if($hack_time_300 >= $matched_numbers_300) {

$under_attack_ips_insert .= "Deny from " . $hack_key_300 . "\n";

$under_attack_log .= $hack_key_300 . "\t" . $hack_time_300 . "\texceed " . $matched_numbers_300 . " in line " . count($hack_array_number_300) . "/300\n";

}

}

/***********取倒数300行数据进行分析结束***********/

//要切割的文件模式如【图4】

$under_attack_split = "#under_attack_ips";

$under_attack_htaccess = file_get_contents("../.htaccess_under_attack");

$under_attack_htaccess_array = explode($under_attack_split, $under_attack_htaccess);

//写入配置文件

$under_attack_htaccess_content = $under_attack_htaccess_array[0] . $under_attack_split . "\n" . $under_attack_ips_insert . $under_attack_split . $under_attack_htaccess_array[2];

file_put_contents("../.htaccess_under_attack", $under_attack_htaccess_content);

file_put_contents($log_dir . "/under_attack_log_" . date("YmdHis") . "_" . $htaccess_content_array_count . ".txt", $under_attack_log);

?>

七、大功告成,至此之后网站抵御了99%的攻击

————————————————

版权声明:本文为CSDN博主「wantianwen」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/WanTianwen/article/details/81980138

    有服务器需求请加QQ1911624872咨询

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容