Am 30.05.2014 23:18, schrieb li...@rhsoft.net:
> 
> Am 30.05.2014 22:48, schrieb Wietse Venema:
>> li...@rhsoft.net:
>>>> You also need to drop "secondary groups". On UNIX, that's
>>>> done with  setgroups() or initgroups(), before dropping 
>>>> root privileges
>>>
>>> thanks for the hint, looks not that it's supported
>>> http://www.php.net/manual/en/book.posix.php
>>
>> It took me a few seconds to find that PHP has initgroups.
>>
>> site:php.net initgroups
> 
> indeed - no excuse except blindness :-(
> implemented - thanks!
> 
> in the meantime i installed and configured the mysql-server
> scary, my first from-scratch mysql-setup after 11 years
> 
> most i likely wrote the code for insert/update (currently
> untested) and also planned a 'dnsbl_auto' feature which is
> set by the honeypot-service for auto-expires and remove
> old entries will skip records where it is 0 to provide
> a webinterface later to add blocked IP's manually

well, some typos in column-names and script fixend

it works, even before written the init-script the first manual start
caught IP's connecting to a not as MTA anncounced machine which answers
the question if it's worth the work and was not clear at start

it took five seconds until 220.225.200.7 was caught

mysql> select * from dnsbl;
+-----------+-----------------+-----------------+------------+
| dnsbl_key | dnsbl_ip        | dnsbl_timestamp | dnsbl_auto |
+-----------+-----------------+-----------------+------------+
|         1 | ***myip***      |      1401485331 |          1 |
|         2 | 220.225.200.7   |      1401485584 |          1 |
|         3 | 96.242.95.29    |      1401485528 |          1 |
|         4 | 112.120.65.223  |      1401485552 |          1 |
|         5 | 212.174.252.130 |      1401485693 |          1 |
+-----------+-----------------+-----------------+------------+
5 rows in set (0.00 sec)

CREATE TABLE `dnsbl` (
  `dnsbl_key` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `dnsbl_ip` varchar(255) COLLATE latin1_german1_ci NOT NULL DEFAULT '',
  `dnsbl_timestamp` int(10) unsigned NOT NULL DEFAULT '0',
  `dnsbl_auto` tinyint(1) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`dnsbl_key`),
  UNIQUE KEY `dnsbl_ip` (`dnsbl_ip`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 
COLLATE=latin1_german1_ci;
____________________________________________________

#!/usr/bin/php
<?php
 /** listen on all interfaces */
 $address = '0.0.0.0';
 /** tcp port to listen */
 settype($_SERVER['argv'], 'array');
 settype($_SERVER['argv'][1], 'integer');
 if(empty($_SERVER['argv'][1]))
 {
  $port = 25;
 }
 else
 {
  $port = $_SERVER['argv'][1];
 }
 /** configuration */
 $whitelist  = array();
 $simulation = false;
 $ttl        = 3600 * 24 * 7;
 /** database account */
 $db_host    = 'localhost';
 $db_user    = 'dnsbl';
 $db_db      = 'dnsbl';
 $db_table   = 'dnsbl';
 $db_port    = 3307;
 $db_pwd     = '************';
 /** disable output buffering */
 ob_implicit_flush();
 /** create the socket */
 if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) ) === false)
 {
  exit('socket_create() failed: reason: ' . 
socket_strerror(socket_last_error()) . "\n");
 }
 if(@socket_bind($sock, $address, $port) === false)
 {
  exit('socket_bind() failed: reason: ' . 
socket_strerror(socket_last_error($sock)) . "\n");
 }
 if(@socket_listen($sock, 5) === false)
 {
  exit('socket_listen() failed: reason: ' . 
socket_strerror(socket_last_error($sock)) . "\n");
 }
 /** drop privileges to 'nobody' */
 if(!@posix_initgroups('nobody', 99) || !@posix_setgid(99) || 
!@posix_setuid(99))
 {
  exit('Drop privileges failed' . "\n");
 }
 /** service loop */
 while(1 == 1)
 {
  /** accept connection */
  $msgsock = @socket_accept($sock);
  /** get the remote address */
  $remote_ip = '';
  @socket_getpeername($msgsock , $remote_ip);
  /** insert remote adress to database or update the timestamp to avoid expire 
if it already exists */
  if(!empty($remote_ip) && !in_array($remote_ip, $whitelist))
  {
   switch($simulation)
   {
    /** database mode */
    case false:
      /** connect to database */
      $db_conn = mysqli_init();
      $rw = mysqli_real_connect($db_conn, $db_host, $db_user, $db_pwd, $db_db, 
$db_port);
      if($rw)
      {
       /** try to find existing record and update only timestamp */
       $fehler = 0;
       $result = mysqli_query($db_conn, 'select dnsbl_key from ' . $db_table . 
' where dnsbl_ip=\'' .
mysqli_real_escape_string($db_conn, $remote_ip) . '\';', MYSQLI_STORE_RESULT) 
or $fehler = 1;
       if($fehler)
       {
        echo 'SQL-ERROR: ' . mysqli_error($db_conn) . "\n";
       }
       else
       {
        if(mysqli_num_rows($result))
        {
         $row = mysqli_fetch_row($result);
         mysqli_free_result($result);
         $fehler = 0;
         $result = mysqli_query($db_conn, 'update ' . $db_table . ' set 
dnsbl_timestamp=' . time() . ' where
dnsbl_key=' . intval($row[0]) . ';', MYSQLI_USE_RESULT) or $fehler = 1;
         if($fehler)
         {
          echo 'SQL-ERROR: ' . mysqli_error($db_conn) . "\n";
         }
        }
        /** insert new ip into database */
        else
        {
         mysqli_free_result($result);
         $fehler = 0;
         $result = mysqli_query($db_conn, 'insert into ' . $db_table . 
'(dnsbl_ip, dnsbl_timestamp, dnsbl_auto)
values (\'' . mysqli_real_escape_string($db_conn, $remote_ip) . '\',' . time() 
. ', 1);', MYSQLI_USE_RESULT) or
$fehler = 1;
         if($fehler)
         {
          echo 'SQL-ERROR: ' . mysqli_error($db_conn) . "\n";
         }
        }
       }
       mysqli_close($db_conn);
      }
      break;
    /** debug: echo connecting remote address on stdout */
    case true:
      echo $remote_ip . "\n";
      break;
   }
  }
  /** close connection */
  @socket_close($msgsock);
 }
?>

Reply via email to