之前工作需要,为nagios写的url篡改告警shell脚本。若url页面变动则告警。若为正常修改,则需手动重新生成hash文件,适用于变动不频繁而又较关键url。根据经验,若页面插入其他统计流量,显示时间等代码,则无法很好经行url修改监控。 功能核心是经行url比较。利用curl 下载页面,然后计算hash值,并保存以备下次比较,此部分思想由jokechoo提供,脚本实现:tqh。 不同于防篡改,此处是实时url比较,告警。 而防篡改技术,一般由2组服务器提供web服务,一组对外服务,此组服务器无修改权限,一旦文件被修改就会被另一组后台服务器同步回去,以此实现防篡改。想要安全就要付出不少代价。
插件1. inithash.sh 计算原始hash值并保存 。(注意修改生成hash文件的权限,或改为nagios用户生成)
插件2. check_hash nagios的检测插件
PS:插件内使用的是中文,注意编码格式utf-8,可先手工调试是否显示中文。若nagios主程序本身无中文支持可能显示为乱码。 代码如下,需要可下载附件。 一、插件1 inithash.sh - #!/bin/bash
- # version 1.0 beta,2011.01.17
- # used for add/update webpage hash
- hash_lib=/tmp/test/hashfile
- url_list=/tmp/test/urlfile #模式1 直接修改url文件地址
- log_file=/tmp/test/updatehash.log
- #######@@ #注释掉上面url_list,开启此处@@之间内容,变为交互模式。另一check脚本会生成update.list 方便update
- #if [ $# -eq 1 -a -f "$1" ]
- #then
- # url_list="$1"
- # echo $url_list
- #else
- # echo "ERROR: plz input 1 urlfile"
- # exit
- #fi
- ########@@
- ###以下注释内容暂无意义。
- #[ ! -e $url_list ] && echo "not exist urlfile" && exit
- ###tmp_dir=/tmp/test
- ###web_tmp=/tmp/test/tmpfile
- ###cd $tmp_dir || echo "no tmp_dir,plz create first" && exit
- while read LINE
- do
- curl -s -A topsec $LINE > tmpfileabc
- #URL名可能含/,无法直接作为文件名,hash表需针对URL作修改
- #if [ ! $? -eq 0 ] #URL页面无法下载,测试中
- #then
- #echo "this page cant download"
- #fi
- hashtmp=`sha1sum tmpfileabc` #生成当前页面HASH
- greptmp=`grep $LINE $hash_lib` #检测该URL是否已hash
- if [ $? -eq 0 ]
- then
- echo "The site $LINE has checked before, update the hash value."
- sed -i "s#$greptmp#$hashtmp#" $hash_lib #用#做分隔,确保页面url中无#号
- sed -i s#tmpfileabc#"$LINE"# $hash_lib #将tmpfileabc替换为正确url
- echo `date +%Y%m%d_%R` "$LINE hash has updated" >> $log_file
- else
- echo "The site $LINE is a new check, add the hash value."
- echo $hashtmp>> $hash_lib
- sed -i "s#tmpfileabc#$LINE#" $hash_lib
- fi
- rm -f tmpfileabc
- done < $url_list
二、 插件2. check_url
- #!/bin/bash
- #version 1.0 ,2011.01.18
- #nagios check http plug. check whether webpage has modified . url list is from file
- #后续不同参数不同站点等
- url_list=/tmp/test/urlfile
- hash_lib=/tmp/test/hashfile
- tmp_dir=/tmp/test
- log_file=/tmp/test/hashcheck.log
- need_update=/tmp/test/needupHASH.list
- cd $tmp_dir
- flag_a=0
- flag_c=0
- while read URL
- do
- curl -s -A topsec "$URL" > webtmpfile
- current_hash=`sha1sum webtmpfile | awk '{print$1}'`
- #####################check url hash
- if `grep $URL $hash_lib>greptmpfile` #测试URL是否已经HASH处理过
- then
- if grep -q $current_hash greptmpfile #比对HASH值
- then
- flag_a=0 #未变动
- else
- flag_a=1 #变动
- echo `date +%Y%m%d_%R` "$URL web changed" >> $log_file
- echo "$URL" >>$need_update
- #保存到需更新url文件中,或者直接从l_file文件中提提取
- fi
- else
- flag_c=3 #HASH值未被保存过
- echo `date +%Y%m%d_%R` "$URL hash should be create" >>$log_file
- echo "$URL" >>$need_update
- fi
- done < $url_list
- rm -f greptmpfile
- rm -f webtmpfile
- ######################nagios checkstat
- if [ $flag_c -eq 3 ]
- then
- if [ $flag_a -eq 1 ]
- then
- echo "网页改动,且检测到新URL" #检测到网页改动,且含有新URL
- exit 3
- else
- echo "检测到新URL" #正常,但有新URL未做比对。 后续手动/自动添加
- exit 1
- fi
- else
- if [ $flag_a -eq 0 ]
- then
- echo "一切正常" #页面未被篡改
- exit 0
- else
- echo "网页内容改动" #改动
- exit 2
- fi
- fi
|