自动化运维安全篇(1)_批量检测服务器iptables状态变化

实现目标:定期或者不定期的批量检测线上所有服务器的iptables状态变化,发现异常后自动将各台服务器对应的异常iptables项发邮件到管理员的邮箱。

构建原理:saltstack、shell脚本、sendEmail。基于saltstack的配置下发执行功能,批量搜集异常iptables项,搜集到的异常项用sendEmail发送邮件到管理员邮箱。

构建过程:saltstack机器以下称为master,待检测的机器称为a、b、c、d、e,发送邮件的机器称为mail。

批量检测iptables与批量检测进程的思路和实现原理是一样的,它们不同的部分(iptables的检测比进程检测复杂一点点)。

1、服务器的进程是每时每刻都在不停变化的,每次搜集到的异常进程肯定是对比白名单中多出的进程。

2、服务器的iptables设置一般是不会变化的,每次检测iptables时要将比白名单多和比白名单少的项目都给提取出来。

功能性脚本

a、b、c、d、e自检测脚本变成了这样,即返回iptables增加的项,也返回iptables减少的项:

#!/bin/bash

if [ `iptables -L | wc -l` -eq 8 ]; then
    echo "iptables Down!"
else {
      cd /srv/salt/
      iptables -nL|grep -v "^$"| grep -v "target" |sort  > iptables.tmp
      cat iptables.white | sort  > iptables
      add=`comm -3 iptables.tmp iptables | grep -v "^\s"`
      lost=`comm -3 iptables.tmp iptables | grep "^\s"`

      if [ "$add" != "" ]; then
          echo -e "Add iptables\n$add"
      fi
      if [ "$lost" != "" ]; then
          echo -e "Lost iptables\n$lost"
      fi

      rm -f iptables.tmp
      rm -f iptables
     }
fi

master下发和检测的sls文件与进程检测的类似,请参考进程检测那篇。

主要的检测和更新白名单的脚本如下(和进程检测脚本的变化不大):

#!/bin/bash

MASDIR="/srv/salt-zabbix/salt/security/conf/iptables"
MINDIR="/srv/salt"
LISTDIR="$MASDIR/list"
CMD="iptables -nL | grep -v ^$"
HOSTS=`salt-key -L | grep -v 'Keys'`
#HOSTS=`salt-key -L | grep -v 'Keys'`

update() {
    mkdir -p $LISTDIR > /dev/null 2>&1
    for minion in $HOSTS; do
        (
         salt $minion cmd.run "$CMD" | sed 's/^\s*//' | grep -v "$minion:" | grep -v "target" > $LISTDIR/$minion
        )&
    done
    wait
}

check() {
    for minion in $HOSTS; do
        (
         survive=`salt $minion test.ping`
         if [ "$survive" == "" ]; then {
             echo "salt-minion timeout!******$minion"
             exit 1
         } fi
         
         salt-cp $minion $MASDIR/list/$minion $MINDIR/iptables.white > /dev/null
         salt $minion state.sls security.check.iptables.filesync > /dev/null
         salt $minion state.sls security.check.iptables.check > $MASDIR/$minion.tmp
         
         flag=`grep "stdout:" $MASDIR/$minion.tmp|awk '{$1="";print $0}'| grep -v "^$"|sed 's/^\s*//'`
         revalue=`grep -v '^ ' $MASDIR/$minion.tmp|grep -v '^-'|grep -v '^$'|grep -v 'Summary'|grep -v 'Succeeded'|grep -v 'Failed'|grep -v 'Total'|grep -v "$minion"`
         
         if [ "$flag" == "iptables Down!" ]; then
             echo "iptables Down!******$minion"
         elif [ "$flag" == "" ]; then
             echo "iptables OK!******$minion"
         else {
             echo "iptables Warning!******$minion"
             echo "$flag"
             if [ "$revalue" != "" ]; then
                echo "$revalue"
             fi
              }
         fi
         rm -f $MASDIR/$minion.tmp
        )&
    done
    wait
}

case "$1" in
  update)
	update
	;;
  check)
	check
	;;
  *)
	echo $"Usage: {update|check}"
esac

联动脚本和进程检测那篇也是类似的,参考那个就可以。

同样和进程检测一样,耦合各个脚本的执行时间就能愉快的检测监控iptables的变化了。

转载请注明出处:http://www.xiaomastack.com/2014/09/14/auto-secure-1/ 谢谢!

发表评论:

你的电子邮件地址将不会被公开.

3 + 7 =