#!/bin/bash #$Id: chkfw,v 1.104 2016/11/12 09:27:49 fulford Exp $ # $Source: /src/merlin/usr/local/etc/RCS/chkfw,v $ # $Revision: 1.104 $ # Author C W Fulford. # Copyright 2012 - 2013 (c) C W Fulford. # Licensed for public use under the LGPL. # For assistance contact fulford@fulford.net 0709 229 5385 ################################################################### cmd=`basename $0` syntax="$0 [[-C] [-cc <email_copy>] [-d] [-m <max_wait in minutes>] [-l] [-p #[,#...]] [-T] [-u|-U] [-v]] <hostname> |-h|-V" ver=`echo "$Id: chkfw,v 1.104 2016/11/12 09:27:49 fulford Exp $"|awk '{print $3,$4,$5}'` while [ $# -gt 0 ];do case $1 in -C) chkonly=:;shift;; -cc) cc=$2;shift 2;; -d) verbose=0;debug=1;set -x;shift ;; --force-restore) forcerestore=:;shift;; -h) if [ $# -eq 1 ];then man 8l chkfw exit else echo "syntax: $syntax">&2 exit fi;; -l) log=:; shift;; -m) max_wait=$2; shift 2;; -n) now=1;shift;; -p) ports=$2 ;shift 2 ;; -T) txt=00022220009@txtservice.co.uk;shift;; -u) if [ ${update-0} -gt 1 ];then echo "$syntax">&2 exit 1 else update=1 fi shift;;# update tmplt only -U) if [ ${update:-0} -eq 1 ];then echo "$syntax">&2 exit 1 else update=2 fi shift;;# update tmplt config and fw boot file -v) verbose=0 ;shift 1;; -V) echo "$cmd $ver";exit;; -*) echo "syntax: $syntax" >&2; exit 1;; *) if [ $# -eq 1 ];then host=$1;shift else echo $syntax >&2 exit 1 fi;; esac done #set variables [ -z "$host" ]&& { echo $syntax >&2; exit 1 ;} ip=`nslookup $host|awk '/Address:/{if($2 !~ "#")print $2}'` cname=`nslookup $ip |awk '/name =/{print $4}'` cc=${cc:-fulford@fulford.net} delay=0 debug=${debug:-0} email_rcpt=fulford@fulford.net logdir=/var/log/$host [ -d $logdir ] ||sudo mkdir -m 775 $logdir|| { echo "$cmd: Can't create $logdir">&2 exit 1 } fwchlog=$logdir/`date +%y%m%d%X` fw_restore=0 iptables=/etc/sysconfig/iptables iptables_cfg=/etc/sysconfig/iptables-config srcdir=/src/$host iptables_src=${srcdir}/${iptables} iptables_cfg_src=${srcdir}${iptables_cfg} max_wait=${max_wait:-30} # After 30 minutes cron will rerun process msgf=/tmp/f$$ now=${now:-0} ports=${ports:-22} psa_fwsw=/usr/local/psa/var/modules/firewall/active.flag tmplt=/usr/local/etc/$host.d/fw tmp=/tmp/`basename $0`$$ tmp_ports=/tmp/ports.$$ txtsent=/var/tmp/${cmd}${host}-txt update=${update:-0} [ $verbose ] && echo "$cmd: host=$host ip=$ip cononical=$cname" # Serious situation send alert by text and e-mail. _alert (){ read msg [ ! -f $txtsent -a -n "$txt" ] && cc="$cc,$txt" mailx -s "URGENT $host - $msg" \ -c $cc \ $email_rcpt </dev/null touch $txtsent [ $verbose ] && echo "$cmd: alert sent" >&2 [ $log ] && logger -t $cmd-$host "$msg" ||{ echo "$cmd failed line:$LINENO: logger -t $cmd-$host $msg" >&2 } } # function to check if target server up, $port available and ssh ok. _host_up (){ mins=0 nports=`echo $ports|sed -e 's/,/ /g'|wc -w` plist=`echo $ports|sed -e 's/,/ /g'` [ $verbose ] && echo "$cmd: $nports port(s) to check ie. $plist" for p in $plist ;do found=n while [ "$mins" -lt $max_wait -a $found = "n" ];do nmap -p $p $host >$tmp_ports date=`date` [ $verbose ]&& echo "$cmd: checking port $port" if grep -q "$p/tcp open" $tmp_ports ;then found=y msg="port $p open - $date" [ $verbose ] && echo "$cmd: $msg" else msg="waiting for port $p on $host $date" #if this is first iteration send alert [ $mins -eq 0 ]&& echo "$msg"|_alert & [ $verbose ]&& echo "$cmd: $msg" >&2 sleep 60 mins=`expr $mins + 1` fi done if [ $found = n ];then msg="$host port $p unavailable - $date" echo "$msg"|_alert [ $verbose ]&& echo "$cmd: $msg" >&2 fi nports=`expr $nports - 1` done; return $nports } # function to check status of running firewall _fwok (){ date=`date` ssh -q $host "sudo iptables -nL" >$tmp date > $fwchlog if [ `sudo diff $tmp $tmplt|tee -a $fwchlog |wc -l` -eq 0 ];then e_val=0 else e_val=1 fi return $e_val } _update (){ update=$1 ssh -q $host "sudo iptables -nL" >$tmp tmplt_dir=`dirname $tmplt` [ ! -d $tmplt_dir ] && sudo mkdir -p $tmplt_dir [ ! -f $tmplt ] && sudo touch $tmplt ndiffs=`sudo diff $tmp $tmplt|wc -l` #counts the lines if [ $ndiffs -gt 0 ];then [ $verbose ] && echo "$cmd: updating $tmplt" arc=$tmplt.`date +%s` sudo cp $tmplt $arc sudo cp $tmp $tmplt else [ $verbose ] && echo "$cmd: $tmplt is up to date" fi [ $debug -gt 0 ] && echo $ndiffs >&2 src_dir=`dirname $iptables_cfg_src` [ -d $src_dir ] || sudo mkdir -p $src_dir [ -f $iptables_cfg_src ] || sudo touch $iptables_cfg_src ssh -q ${host} cat $iptables_cfg > $tmp if ! diff $tmp $iptables_cfg_src>/dev/null;then [ $verbose ] && echo "$cmd: updating $iptables_cfg_src" sudo cp $tmp $iptables_cfg_src else echo "$cmd: $iptables_cfg_src is up to date" fi if [ $update -gt 1 ];then [ -f $iptables_src ]||sudo touch $iptables_src ssh -q ${host} "cat $iptables" >$tmp.iptables if ! diff $tmp.iptables $iptables_src>/dev/null;then [ $verbose ] && echo "$cmd: updating $iptables_src" sudo cp $tmp.iptables $iptables_src else echo "$cmd: $iptables_src is up to date" fi fi return $ndiffs } if _host_up;then if [ $update -gt 0 ];then _update $update exit $? fi # check fw status if _fwok ;then [ $verbose ] && echo "$cmd: active fw matches $tmplt ok" >&2 [ -f $fwchlog ] && rm $fwchlog msg="active fw matches $tmplt ok" [ $log ]&&{ logger -t $cmd-$host "$msg"||{ echo "$cmd failed $LINENO: logger -t $cmd-$host $msg">&2 } } fw_restore="no" else msg="active FW differs from $tmplt see ${fwchlog} $date." echo "$msg"| _alert & [ $verbose ] && echo "$cmd $msg" >&2 fw_restore=: fi [ $verbose ] && echo "$cmd: fw_restore is set to $fw_restore" >&2 # Check fw config if server were rebooted, is the remote # configuration the same as the source on the admin server. if ssh -q $host "cat ${iptables_cfg}"| sudo diff - $iptables_cfg_src>/dev/null then ipcfg_ok=0 [ $verbose ] && echo "$cmd: ${iptables_cfg} ok" >&2 else fw_restore=no date=${date:-`date`} msg="FW reboot config changed -$date." echo "Warning - $msg"|_alert [ $verbose ]&& echo "$cmd: $msg" >&2 fi # Check if fw boot file the same as on admin server if ssh -q $host "cat ${iptables}"| sudo diff - $iptables_src>/dev/null then ipcfg_ok=0 [ $verbose ] && echo "$cmd: $iptables ok" >&2 else fw_restore=no date=${date:-`date`} msg="$cmd boot file $iptables changed -$date" echo "$msg"|_alert [ $verbose ]&& echo "$cmd: $msg" >&2 fi # Check if psa firewall activated. if ssh -q $host "test -e $psa_fwsw" ;then fw_restore=no date=${date:-`date`} echo "$msg psa firewall activated -$date." |_alert [ $verbose ] && echo "$cmd: psa firewall activated on $host" >&2 else [ $verbose ] && echo "$cmd: psa firewall not activated" >&2 fi if [ -n "$forcerestore" ] ;then fw_restore=yes cat $iptables_src |ssh -q $host "sudo dd of=$iptables" cat ${iptables_cfg_src}|ssh -q $host "sudo dd of=$iptables_cfg" fi if [ "$fw_restore" = "yes" ] ;then [ -n "$chkonly" ] && exit echo ssh -q $host "sudo /etc/init.d/iptables restart&" sleep 10 if _fwok ;then msg="FW restored" else msg="FW restore failed" fi echo "$msg - see $fwchlog"|_alert fi [ -f $tmp ] && rm $tmp [ -f $txtsent ] && rm $txtsent [ -f $tmp_ports ] && rm $tmp_ports fi ###################################################################### # This program is free software: you can redistribute it and or # # modify it under the terms of the Lesser GNU General Public License # # as published by the Free Software Foundation, either version 3 of # # the License, or (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # A copy of the Lesser GNU General Public License and the GNU # # General Public License is available at # # <http://www.gnu.org/licenses/>. # ######################################################################
Copyright
© 2003-2017
Clifford W Fulford.
Fulford Consulting Ltd.
Regd. Co. 4250037 in England & Wales.
Regd. office 162, Edward Rd. Nottingham NG2 5GF, England, UK.
Related web sites: City Linux | Flare Support | West Bridgford | Fulford Portal | Joan Mary Fulford (Nottingham Writer) | Fulford Gallery | Amharic Interpreter | Arabic Interpreter | Tigrinya Interpreter
The layout and associated style sheets for this page are taken from the World Wide Web Consortium and used here under the W3C software licence.