自动化运维安全篇(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减少的项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/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文件与进程检测的类似,请参考进程检测上篇。
主要的检测和更新白名单的脚本如下(和进程检测脚本的变化不大):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/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的变化了。

----------------本文结束 感谢阅读----------------