设为首页 收藏本站
查看: 1107|回复: 0

shell脚本+mysql数据库组合进行数据安全监控

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-10-20 08:34:40 | 显示全部楼层 |阅读模式
                      shell脚本 + mysql数据库 实现企业级会话边界控制器文件解析并告警

dirsx30001.sh处理文件,生成mysql备份文件的方式进行导入
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
#/bin/bash
##环境变量
path=/home/sbclog/sx30001
##由于抓取的日志文件中没有年份参数,故导入系统年份参数,以达到数据库时间字段datetime
##也可以抓取tar包的名字中的字段
date_year=`date|cut -c 25-`
#test ! -e $path/*.tar &&echo "[ "`date`" ] no search the tar file">>$path/dir.log&&exit 0
##遍历日志文件tar包,进行解包,保存了文件的全路径,及文件名
for a in `ls $path/*.tar 2>>/dev/null`
do
  ##输出当前解包的文件tar
  echo $a
  tar -xf $a -C $path
  ##解完包,将tar文件进行转移
  mv $a $path/backup/
  ##执行解析程序foundall,生成BYE.txt和INVITE.txt解析文件
  /data/sbc1/foundall $path/
  ##删除包文件
  rm -rf $path/var
  #echo $b
  ##判断解析文件是否为NULL
  FILEBYE=`sed -n '$=' $path/BYE.txt`
  FILEINVITE=`sed -n '$=' $path/INVITE.txt`
##BYE
  if [ ! -n "$FILEBYE" ]; then
    echo "[ "`date`" ] no BYE in $a">>$path/dir.log
  else
  echo "use sbc;" > $a.BYE.sql
  echo "insert into sbc1bye values" >> $a.BYE.sql
  ##################
  awk '{print "('\'$date_year/'"$1" "$2"'\'','\''"$3"'\'','\''"$4"'\'','\''"$5"'\'','\''"$6"'\'','\''"$7"'\'','\''"$8"'\'','\''"$9"'\''),"}' $path/BYE.txt >>$a.BYE.sql
  ##替换最后一行的最后一个字符为分号
  sed -i '$s/.$/;/g' $a.BYE.sql
  #sed -i 's/\//-/g' $a.BYE.sql
  ##导入数据库
  mysql -usbc_user -p123456 <$a.BYE.sql
  ##保存文件
  mv $a.BYE.sql $path/BYEsql/
##INVITE
  fi
  if [ ! -n "$FILEINVITE" ]; then
    echo "[ "`date`" ] no INVITE in $a">>$path/dir.log
  else
  echo "use sbc;" > $a.INVITE.sql
  echo "insert into sbc1invite values" >> $a.INVITE.sql
  ##################
  awk '{print "('\'$date_year/'"$1" "$2"'\'','\''"$3"'\'','\''"$4"'\'','\''"$5"'\'','\''"$6"'\'','\''"$7"'\'','\''"$8"'\'','\''"$9"'\''),"}' $path/INVITE.txt >>$a.INVITE.sql
  ##替换最后一行的最后一个字符为分号
  sed -i '$s/.$/;/g' $a.INVITE.sql
  #sed -i 's/\//-/g' $a.INVITE.sql
  ##导入数据库
  mysql -usbc_user -p123456 <$a.INVITE.sql
  ##保存文件
  mv $a.INVITE.sql $path/INVITEsql/
  fi
done




数据库设计,把接受信息和接通信息分开来管理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--sbc1bye表设计,使用了大量varchar类型存取数据,节省空间,type使用了char类型提升检索效率(原计划是BYE和INVITE保存在同一个表中)。
CREATE TABLE `sbc1bye` (
  `time` DATETIME DEFAULT NULL,
  `from` varchar(255) DEFAULT NULL,
  `to` varchar(255) DEFAULT NULL,
  `type` char(10) DEFAULT NULL,
  `server` varchar(255) DEFAULT NULL,
  `caller` varchar(255) DEFAULT NULL,
  `called` varchar(255) DEFAULT NULL,
  `callid` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `sbc1invite` (
  `time` DATETIME DEFAULT NULL,
  `from` varchar(255) DEFAULT NULL,
  `to` varchar(255) DEFAULT NULL,
  `type` char(10) DEFAULT NULL,
  `server` varchar(255) DEFAULT NULL,
  `caller` varchar(255) DEFAULT NULL,
  `called` varchar(255) DEFAULT NULL,
  `callid` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;




通过设置视图去除重复消息。也可以灵活的添加各种条件。
1
2
3
4
5
6
7
8
9
--通过视图限制条件,更为灵活多变
CREATE OR REPLACE
    VIEW sbc1bye_v
    AS select distinct `time` btime,`from` bfrom,`to` bto,`type` btype,`server` bserver,`caller` bcaller,`called` bcalled,`callid` bcallid from sbc1bye group by `callid`;

--通过视图限制条件,更为灵活多变
CREATE OR REPLACE
    VIEW sbc1invite_v
    AS select distinct `time` btime,`from` bfrom,`to` bto,`type` btype,`server` bserver,`caller` bcaller,`called` bcalled,`callid` bcallid from sbc1invite group by `callid`;




进行检查数据库中的数据是否到达告警值。
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
#!/bin/bash

##导入变量,变量在多个会话中漂移root
. /root/.bash_profile

##通知邮箱数组
a=(
540562659@qq.com  #实验证明139移动邮箱,响应速度奇慢,建议使用163邮箱
)

##邮件内容保存路径
mailpath=/home/sbclog/sx30001

##告警值
value_limit=200

#mysql -usbc_user -p123456 -e "use sbc;select * from heji where heji>$value_limit;">$mailpath/mail.log

##生成NULL的邮件内容文件
>$mailpath/mail.log
#echo "$SCN_time_sx30002"

##产生告警的数据文件,可以修改为select where having
mysql -usbc_user -p123456 -e "use sbc;select a.* from (select bcaller,bcalled,count(bcalled) heji from  sbc1bye_v where btime>$SCN_time_sx30001 group by bcaller,bcalled) a where a.heji>$value_limit;">$mailpath/mail.log

##判断邮件内容文件是否为NULL
FILEMAIL=`sed -n '$=' $mailpath/mail.log`

if [ ! -n "$FILEMAIL" ]; then
  #echo "no value over the limit,so no mail will be sent."

  ##为NULL文件时,重置定时文件/var/spool/cron/root为每分钟检查
  sed -i 's/\*\/30 \* \* \* \* \/bin\/bash \/home\/sbclog\/mailsx30001.sh/\* \* \* \* \* \/bin\/bash \/home\/sbclog\/mailsx30001.sh/g' /var/spool/cron/root

else

  ##将邮件内容content文件处理成html表格文件,适合观察
  sed 's/\t/\<\/th\>\<th\>/g' $mailpath/mail.log |sed 's/^/\<tr\>\<th\>/g'|sed 's/$/\<\/td\>\<\/tr\>/g'|sed '1s/^/<table border="1">/g'|sed '$s/$/<\/table>/g'>$mailpath/mail.html

  #echo ${#a[@]}

  ##不为NULL文件时,设置定时文件/var/spool/cron/root为30分钟再次告警,直至人为处理
  sed -i 's/\* \* \* \* \* \/bin\/bash \/home\/sbclog\/mailsx30001.sh/\*\/30 \* \* \* \* \/bin\/bash \/home\/sbclog\/mailsx30001.sh/g' /var/spool/cron/root

  ##遍历数组发送邮件
  for mail in ${a
  • }
        do
          ##html格式发送,可以设计邮件样式
          mail -s "$(echo -e "SBC1 Exception Information\nContent-Type:text/html")" $mail < $mailpath/mail.html
      done
    fi




  • 工作人员确认数据为正常时,执行(恢复时间点,防止查询数据时间范围过大)。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #export SCN_time_sx30002="'"`date +%F" "%T`"'"
    #sed -i 's/export SCN_time_sx30002.*/export SCN_time_sx30002=\"\'`date +%F" "%T`\'\"/'  /root/.bash_profile
    #sed -i 's/date_sub(now(),interval 1 day)/"'"`date +%F" "%T`"'"/'  /root/.bash_profile

    ##将环境变量在各个会话中传递
    sed -i "s/export SCN_time_sx30001.*/export SCN_time_sx30001='`date +%F" "%T`'/" /root/.bash_profile

    #echo "restore success. now:"$SCN_time_sx30001
    #at now + 1 day -f /home/sbclog/resx30002.sh
    #at now + 1 min -f /home/sbclog/resx30002.sh

    ##at一次性定时任务,检查的为前一天的告警是否合适,故恢复时间点+了一个小时
    at now + 25 hours -f /home/sbclog/resx30001.sh



    恢复时,执行的脚本
    1
    2
    3
    4
    5
    #sed -i 's/nnn/ggg/g' /home/sbclog/122.txt
    #sed -i 's/date_sub(now(),interval 1 day)/"'"`date +%F" "%T`"'"/'  /root/.bash_profile

    ##恢复时间点,使检查点恢复成一天告警
    sed -i 's/export SCN_time_sx30001.*/export SCN_time_sx30001="date_sub(now(),interval 1 day)"/'  /root/.bash_profile




                       


    运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-128903-1-1.html 上篇帖子: shell脚本批量监控Linux server配置文件的更改 下篇帖子: Powershell 比较AD和Exchange的用户登录时间 数据安全 数据库 mysql 监控
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表