25 лютого 2014 р.

PF firewall log alarm

Завдання.
Заносимо до таблиці pf  <attackers> значення адрес хто мав спроби підключитися до NTP служби у внутрішній мережі.
І таким чином блокуємо повний доступ до сервера і локальної мережі цим адресам.
Додатково використаний порт Simple Log Watcher


pf.conf:
block in  quick on $ext_if from <attackers> to any
block out quick on $ext_if from any to <attackers>

block in log quick on $ext_if inet proto { tcp, udp } from any to $internal_net port ntp
block in log quick on $ext_if inet6 proto { tcp, udp } from any to $internal_net6 port ntp
pflog.sh:
#!/bin/sh
killall tcpdump
tcpdump -N -n -e -t -i pflog0 '(ip6 or ip) and dst port 123 and not (dst host ntp.local)' | logger -t pf -p local0.info &
/etc/syslog.conf:
local0.info                                     /var/log/pf.log

/var/log/pf.log:
Feb 25 11:43:54 <local0.info> 12.12.12.1 pf: rule 55..16777216/0(match): block in on rl0: 111.111.111.11.80 > 12.12.12.12.123: NTPv2, Reserved, length 8

/etc/rc.conf:
swatch_enable="YES"
swatch_rules="1"
swatch_1_flags="--tail-file=//var/log/pf.log --config-file=/usr/local/etc/swatch/.pf-alert  --daemon --pid-file=/var/run/swatch_1.pid"
swatch_1_pidfile="/var/run/swatch_1.pid"


/usr/local/etc/swatch/.pf-alert:
watchfor /: block in on rl0: (.*) \> (.*): /i
    exec /usr/local/etc/pf-alert/parse_ip.php '$1|$2' >> /var/log/pf-block-alert.log

/usr/local/etc/pf-alert/parse_ip.php:
#!/usr/local/bin/php
<?php
$dir="/usr/local/etc/pf-alert";
$WL=$dir."/whitelist.txt";

/**
 * Validate an IPv4 IP address
 *
 * @param  string $ip
 * @return boolean - true/false
 */

function isWrongIP($ip)
{
   return ( false === filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) );
}

/**
 * Validate an IPv6 IP address
 *
 * @param  string $ip
 * @return boolean - true/false
 */

function isWrongIPv6($ip) {
   return (false === filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
}


function array_find($needle, $haystack){
   foreach ($haystack as $item)
   {
      if (strpos($needle,$item) !== FALSE)
      {
         return true;
         break;
      }
   }
return false;
}

function parse_ip($src) {
    $k=preg_split("/\./", $src, -1, PREG_SPLIT_NO_EMPTY);
    $ip=implode('.',array_slice($k,0,-1));
    if (isWrongIP($ip) && isWrongIPv6($ip)){
            $ip=false;
    }
    return $ip;
}


##############
# store db
##############

function StoreToDatabase($IP){
    $info="";
    result=shell_exec( /sbin/pfctl -qv -t attackers -T add $ip | /usr/bin/grep -e "^A");
    result=shell_exec( /sbin/pfctl -qv -t attackers -T test $ip | /usr/bin/grep -e "^M");
    return $result;
}

#####################################
#   MAIN
#####################################

$T1=$argv[1];
$wlist=file($WL, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
list($src, $dest) = split('[|]', $T1);
echo "$src,  $dest"."\r\n";
$ip=parse_ip($src);
#check white list
if (!array_find($ip, $wlist)) {
    $res=StoreToDatabase($ip);
    echo "src ip=$ip, stored=$res\r\n";
}


Немає коментарів:


Коли забув ти рідну мову, біднієш духом ти щодня...
When you forgot your native language you would become a poor at spirit every day ...

Д.Білоус / D.Bilous
Рабів до раю не пускають. Будь вільним!

ipv6 ready