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访问
策略添加到哪里合适
防火墙配置文件等