Завдання.
Заносимо до таблиці pf <attackers> значення адрес хто мав спроби підключитися до NTP служби у внутрішній мережі.
І таким чином блокуємо повний доступ до сервера і локальної мережі цим адресам.
Додатково використаний порт Simple Log Watcher
pf.conf:
Заносимо до таблиці 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";
}
Немає коментарів:
Дописати коментар