十四、监控脚本

14.1 Web服务器监控

应用场景:监控web服务器状态,异常时邮件报警。

脚本说明:通过wget(也可以用curl)监控服务器状态,如果不能正常访问,ping检测网

络,网络正常通知管理员检查服务,ping不通邮件通知管理员。

服务器列表使用数组,服务器状态函数使用返回值判断服务器是否异常。

[root@kittod ~]# cat server.sh
#!/bin/bash
#define var
RETVAL=0
FAILCOUNT=0
MAIL_USER="root@haha.com"
RED='\033[31m'
GREEN='\033[32m'
BLUE='\033[34m'
CLOSE='\033[0m'
#define server list
SERVER_ALL_LIST=(
192.168.91.128:80
192.168.91.129:80
192.168.91.130:80
)
SERVER_ALL_LEN=${#SERVER_ALL_LIST[*]}
#web detection function
LOG_FILE="/tmp/web_check.log"
function GetUrlStatus() {
 for ((j=1;j<=3;j++))
 do
 wget -T 10 --tries=1 --spider http://${1} > /dev/null 2>&1
 if [ $? -ne 0 ]
 then
            let FAILCOUNT+=1
 else
 FAILCOUNT=0
 break
 fi
 done

 [ $FAILCOUNT -gt 1 ] && RETVAL=1 || RETVAL=0
 return $RETVAL
 }

 function Send_Mail() {
 NowTime=$(date +"%Y-%m-%d %H:%M:%S")
 SC="http://${1} service is error,${NowTime}."
 mail -s "$SC" $MAIL_USER < ${LOG_FILE}
 }

 #service check
 i=0
 while [ $i -lt ${SERVER_ALL_LEN} ]
 do
 SERVER_IP=$(echo ${SERVER_ALL_LIST[$i]} | awk -F: '{print $1}')
 SERVER_PORT=$(echo ${SERVER_ALL_LIST[$i]} | awk -F: '{print $2}')
 echo -n -e "${BLUE} check ${SERVER_ALL_LIST[$i]}: ${CLOSE}" |tee
${LOG_FILE}
 if GetUrlStatus ${SERVER_ALL_LIST[$i]}
 then
 echo -e "${GREEN} Server is working properly! ${CLOSE}"
 elif ping -c 1 $SERVER_IP > /dev/null 2>&1
 then
 echo -e "${RED} ping ok,pls check service! ${CLOSE}" |tee
-a ${LOG_FILE}
 Send_Mail ${SERVER_ALL_LIST[$i]}
 else
 echo -e "${RED} ping failure,pls Contact your administrator!
${CLOSE}" |tee -a ${LOG_FILE}
 Send_Mail ${SERVER_ALL_LIST[$i]}
 fi

 let i++

 done
 #Delete temporary files
 rm -f ${LOG_FILE}


 // 脚本执行及测试:{
 [root@kittod ~]# bash server.sh
 check 192.168.91.128:80: ping ok, pls check service! 
  check 192.168.91.129:80: Server is working properly!
 check 192.168.91.130:80: ping failure,pls Contact your
administrator
 邮件报警:(邮件中颜色无法显示)
 •[34m check 172.21.200.16:80: •[0m•[31m ping failure,pls Contact
your administrator! •[0m
 }

 // 其他检测方法:

 使用curl检测:
 function GetUrlStatus() {
 for ((j=1;j<=3;j++))
 do
 SERVER_STATUS_CODE=$(curl -o /dev/null -s -m 10 --connect-timeout
 -w %{http_code} "http://${1}")
 if [ ${SERVER_STATUS_CODE} -ne 200 ]
 then
 let FAILCOUNT+=1
 else
 FAILCOUNT=0
 break
 fi
 done

 [ $FAILCOUNT -gt 1 ] && RETVAL=1 || RETVAL=0
 return $RETVAL
 }

 使用nmap探测端口是否open判断服务是否异常:
 function GetUrlStatus() {
 for ((j=1;j<=3;j++))
 do
 SERVER_PORT_STATUS=$(nmap -P0 -p${SERVER_PORT} -sS -vv
${SERVER_IP} | grep ${SERVER_PORT} | tail -1 | awk '{print $2}')
 if [ "${SERVER_PORT_STATUS}" != "open" ]
 then
 let FAILCOUNT+=1
 else
 FAILCOUNT=0
 break
 fi
 done

 [ $FAILCOUNT -gt 1 ] && RETVAL=1 || RETVAL=0
 return $RETVAL
 }

14.2 安全脚本

自动化禁止恶意IP访问

应用场景:防止恶意IP尝试ssh登录。

脚本说明:将密码输入错误超过4次的IP地址通过iptables防火墙阻止访问。

分析:

1)首先,需要知道ssh远程访问记录在哪个文件中/var/log/secure

2)其次,模拟远程访问输错密码,查看日志文件

Dec 26 11:34:53 agent1 sshd[3060]: Failed password for root from 192.168.211.1

port 2075 ssh2

3)再次,通过日志可以看到关键信息“Failed password”表示密码错误

有可能是手误输错,所以就需要设定几次错误为恶意试探密码,建议设置为4

另一个关键信息是需要将密码错误的IP地址提取出来

对提取出来的IP地址进行统计次数

4)最后,需要明确怎么在脚本中通过iptables策略设置阻止恶意IP访问

策略添加到哪里合适

防火墙配置文件等

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值