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++))dowget -T 10 --tries=1 --spider http://${1} > /dev/null 2>&1if [ $? -ne 0 ]thenlet FAILCOUNT+=1elseFAILCOUNT=0breakfidone[ $FAILCOUNT -gt 1 ] && RETVAL=1 || RETVAL=0return $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 checki=0while [ $i -lt ${SERVER_ALL_LEN} ]doSERVER_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]}thenecho -e "${GREEN} Server is working properly! ${CLOSE}"elif ping -c 1 $SERVER_IP > /dev/null 2>&1thenecho -e "${RED} ping ok,pls check service! ${CLOSE}" |tee
-a ${LOG_FILE}Send_Mail ${SERVER_ALL_LIST[$i]}elseecho -e "${RED} ping failure,pls Contact your administrator!
${CLOSE}" |tee -a ${LOG_FILE}Send_Mail ${SERVER_ALL_LIST[$i]}filet i++done#Delete temporary filesrm -f ${LOG_FILE}// 脚本执行及测试:{[root@kittod ~]# bash server.shcheck 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++))doSERVER_STATUS_CODE=$(curl -o /dev/null -s -m 10 --connect-timeout-w %{http_code} "http://${1}")if [ ${SERVER_STATUS_CODE} -ne 200 ]thenlet FAILCOUNT+=1elseFAILCOUNT=0breakfidone[ $FAILCOUNT -gt 1 ] && RETVAL=1 || RETVAL=0return $RETVAL}使用nmap探测端口是否open判断服务是否异常:function GetUrlStatus() {for ((j=1;j<=3;j++))doSERVER_PORT_STATUS=$(nmap -P0 -p${SERVER_PORT} -sS -vv
${SERVER_IP} | grep ${SERVER_PORT} | tail -1 | awk '{print $2}')if [ "${SERVER_PORT_STATUS}" != "open" ]thenlet FAILCOUNT+=1elseFAILCOUNT=0breakfidone[ $FAILCOUNT -gt 1 ] && RETVAL=1 || RETVAL=0return $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访问
策略添加到哪里合适
防火墙配置文件等