ds3
07/10/2011, 13h07
#!/usr/bin/php
<?php
// ################################################## ##
// # #
// # 4sipviciuous VER 0.1 | 2011 #
// # DOTSMART #
// # http://www.dot-smart.com #
// # #
// ################################################## ##
//
// L intérêt de ce script est de pouvoir analyser les fichiers log d'1 asterisk et de partager les informations des scans sur la grappe entière.
// Les nœuds de la grappe connaitrons avant le scan les ip susceptibles de les scanners
// Pourquoi php-cli ? pourquoi pas !
// ereg = deprecated
//
//
// Structure de la table 4sipvicious
// CREATE TABLE IF NOT EXISTS `ip_blocked2` (
// `id` int(11) NOT NULL AUTO_INCREMENT,
// `date_insert` datetime NOT NULL,
// `date` varchar(30) NOT NULL,
// `ip` varchar(30) NOT NULL,
// `port` varchar(5) NOT NULL,
// `autorise` int(11) NOT NULL,
// PRIMARY KEY (`id`),
// KEY `ip` (`ip`,`port`,`date_insert`)
// ) ENGINE=MyISAM DEFAULT
//
// Crontab -e | */5 * * * * sudo /usr/bin/php ../../4sipvicious2.php > /dev/null 2>&1
//
// Penser au logrotate pour éviter des traitements de logs trop volumineux
//
// roadmap : ajouter exp. regulieres pour iptables et gestion du port
// ajouter la gestion de l’état 2 pour autoriser une ip depuis la database + iptables + suppression dans iptables si présente
// centraliser les clients ipbx
// passe 1 ip en défaut au bout de X tentatives, he oui les utilisateurs ont le droit de se tromper ! (gestion, peut être envoyer un émail a l utilisateur ?)
$host = "LA DB";
$login = "LE LOGIN MYSQL";
$mdp = "LE MDP MYSQL";
$db = "4sipvicious";
$action = NULL;
$stack_ip = array(); // Création de la stack ip
$stack_info = array(); // Création de la stack info
$fichier = "/var/log/asterisk/messages"; // Fichier de log asterisk
if (!$fp = fopen($fichier,"r")) // Ouverture du fichier,
{ print "Error open file\n"; exit; // si problème on affiche et exit les pointes seches
}else { print "Read file $fichier ...\n"; // Pas de problème ... la suite
while(!feof($fp)) { // La boucle du fichier
$Ligne = fgets($fp,4096); // Lecture des ligne
ereg("\[(.*){1}\].*\].*failed for '(.*):(.*)' - No matching peer found",$Ligne,$askip); // On recherche exp reg pour 1.8 supprimer :.* pour les < 1.8
if ($askip == TRUE) array_push($stack_info, array($askip[1], $askip[2], $askip[3])); // On push l'ip trouvee dans la stack avec les infos correspondantes
} // Fin de la boucle
fclose($fp); // On ferme le fichier de log
} // fin de lecture du fichier log
// Maintenant on verifie et integre Ã* la BD
$link = mysql_connect($host, $login, $mdp); // CX a la mysql
if (!$link) { die('Could not connect: ' . mysql_error()); exit; } // piti erreur pour la DB ?
mysql_select_db($db,$link); // on sélection la DB 4sipvicious
print 'DB connected successfully\n';
// Ah le (if not exist) de mysql quel bonheur
reset($stack_info); // on reset la stack
foreach ($stack_info as $v1) { // On boucle la stack ip_info
$da=$v1[0]; print "date:" .$da."|";
$ip=$v1[1]; print "ip:" .$ip."|";
$po=$v1[2]; print "port:" .$po."\n";
$query = mysql_query("select `id` from `ip_blocked2` where `date` = '".$da."' and `ip` = '".$ip."' and `port` = '".$po."';");
$num = mysql_num_rows($query);
if($num == 0)
{ // Si inexistante,ajout
$sql = "INSERT INTO `4sipvicious`.`ip_blocked2` (`id` ,`date_insert` ,`date` ,`ip` ,`port` ,`autorise`) VALUES (NULL , NOW( ) , '$da', '$ip', '$po', '0');";
$result = mysql_query($sql);
print "record insert for ".$ip;
} elseif($num > 0) {
print "record exit, remember 1 per seconde :(, we are not not reference "; // inexistante
}
}
// On s'occupe d'iptables
$commande = popen('iptables-save -c 2>&1', 'r'); // Facile
$iptables = (fread($commande, 8096)); // c'est fini !
pclose($commande); // Fermeture popen
// Bouclage de des ips et verification de son existance dans iptables
$sql = mysql_query("SELECT DISTINCT(ip), port FROM `4sipvicious`.`ip_blocked2`"); // On liste les ip unique avec le port
while ($result = mysql_fetch_array($sql)) {
if (preg_match("/".$result['ip']."/",$iptables)) { // ip db est elle existante dans iptables ?
print $result['ip']." is present, next\n";
} else{
$action .= "/sbin/iptables -I INPUT -s ".$result['ip']." -p udp --dport ".$result['port']." -j DROP\n";
print $result['ip']." is not present, next\n";
}
}
if ($action == TRUE) system($action); // On lance iptables avec toutes les ip a dropper
if (mysql_close($link)) // On ferme tout et sortie
print 'down connected successfully\n';
exit;
?>
<?php
// ################################################## ##
// # #
// # 4sipviciuous VER 0.1 | 2011 #
// # DOTSMART #
// # http://www.dot-smart.com #
// # #
// ################################################## ##
//
// L intérêt de ce script est de pouvoir analyser les fichiers log d'1 asterisk et de partager les informations des scans sur la grappe entière.
// Les nœuds de la grappe connaitrons avant le scan les ip susceptibles de les scanners
// Pourquoi php-cli ? pourquoi pas !
// ereg = deprecated
//
//
// Structure de la table 4sipvicious
// CREATE TABLE IF NOT EXISTS `ip_blocked2` (
// `id` int(11) NOT NULL AUTO_INCREMENT,
// `date_insert` datetime NOT NULL,
// `date` varchar(30) NOT NULL,
// `ip` varchar(30) NOT NULL,
// `port` varchar(5) NOT NULL,
// `autorise` int(11) NOT NULL,
// PRIMARY KEY (`id`),
// KEY `ip` (`ip`,`port`,`date_insert`)
// ) ENGINE=MyISAM DEFAULT
//
// Crontab -e | */5 * * * * sudo /usr/bin/php ../../4sipvicious2.php > /dev/null 2>&1
//
// Penser au logrotate pour éviter des traitements de logs trop volumineux
//
// roadmap : ajouter exp. regulieres pour iptables et gestion du port
// ajouter la gestion de l’état 2 pour autoriser une ip depuis la database + iptables + suppression dans iptables si présente
// centraliser les clients ipbx
// passe 1 ip en défaut au bout de X tentatives, he oui les utilisateurs ont le droit de se tromper ! (gestion, peut être envoyer un émail a l utilisateur ?)
$host = "LA DB";
$login = "LE LOGIN MYSQL";
$mdp = "LE MDP MYSQL";
$db = "4sipvicious";
$action = NULL;
$stack_ip = array(); // Création de la stack ip
$stack_info = array(); // Création de la stack info
$fichier = "/var/log/asterisk/messages"; // Fichier de log asterisk
if (!$fp = fopen($fichier,"r")) // Ouverture du fichier,
{ print "Error open file\n"; exit; // si problème on affiche et exit les pointes seches
}else { print "Read file $fichier ...\n"; // Pas de problème ... la suite
while(!feof($fp)) { // La boucle du fichier
$Ligne = fgets($fp,4096); // Lecture des ligne
ereg("\[(.*){1}\].*\].*failed for '(.*):(.*)' - No matching peer found",$Ligne,$askip); // On recherche exp reg pour 1.8 supprimer :.* pour les < 1.8
if ($askip == TRUE) array_push($stack_info, array($askip[1], $askip[2], $askip[3])); // On push l'ip trouvee dans la stack avec les infos correspondantes
} // Fin de la boucle
fclose($fp); // On ferme le fichier de log
} // fin de lecture du fichier log
// Maintenant on verifie et integre Ã* la BD
$link = mysql_connect($host, $login, $mdp); // CX a la mysql
if (!$link) { die('Could not connect: ' . mysql_error()); exit; } // piti erreur pour la DB ?
mysql_select_db($db,$link); // on sélection la DB 4sipvicious
print 'DB connected successfully\n';
// Ah le (if not exist) de mysql quel bonheur
reset($stack_info); // on reset la stack
foreach ($stack_info as $v1) { // On boucle la stack ip_info
$da=$v1[0]; print "date:" .$da."|";
$ip=$v1[1]; print "ip:" .$ip."|";
$po=$v1[2]; print "port:" .$po."\n";
$query = mysql_query("select `id` from `ip_blocked2` where `date` = '".$da."' and `ip` = '".$ip."' and `port` = '".$po."';");
$num = mysql_num_rows($query);
if($num == 0)
{ // Si inexistante,ajout
$sql = "INSERT INTO `4sipvicious`.`ip_blocked2` (`id` ,`date_insert` ,`date` ,`ip` ,`port` ,`autorise`) VALUES (NULL , NOW( ) , '$da', '$ip', '$po', '0');";
$result = mysql_query($sql);
print "record insert for ".$ip;
} elseif($num > 0) {
print "record exit, remember 1 per seconde :(, we are not not reference "; // inexistante
}
}
// On s'occupe d'iptables
$commande = popen('iptables-save -c 2>&1', 'r'); // Facile
$iptables = (fread($commande, 8096)); // c'est fini !
pclose($commande); // Fermeture popen
// Bouclage de des ips et verification de son existance dans iptables
$sql = mysql_query("SELECT DISTINCT(ip), port FROM `4sipvicious`.`ip_blocked2`"); // On liste les ip unique avec le port
while ($result = mysql_fetch_array($sql)) {
if (preg_match("/".$result['ip']."/",$iptables)) { // ip db est elle existante dans iptables ?
print $result['ip']." is present, next\n";
} else{
$action .= "/sbin/iptables -I INPUT -s ".$result['ip']." -p udp --dport ".$result['port']." -j DROP\n";
print $result['ip']." is not present, next\n";
}
}
if ($action == TRUE) system($action); // On lance iptables avec toutes les ip a dropper
if (mysql_close($link)) // On ferme tout et sortie
print 'down connected successfully\n';
exit;
?>