PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for the ‘ftp’ tag

Firewall Beschränkungen prüfen

without comments

Zuhause hat man diese Probleme wohl nicht so sehr, und auch auf einem Rootserver braucht man sich nur sehr selten damit rumplagen: Firewalls, die den Zugriff auf andere Systeme blocken.

Firewalls sind im Prinzip nichts anderes als Programme (oder Hardware), die im Netzwerk oder auf einem System installiert sind und Netzwerkpakete (nicht nur TCP/IP, sondern auch UDP, ICMP Pakete usw) untersuchen kann. Jede Firewall hat Regeln, die beschreiben, was passieren soll wenn bestimmte Pakete ankommen. Zum Beispiel kann sie die Verbindung komplett unterbinden (d.h. die ankommenden Pakete droppen) wenn ein Quellsystem 1.2.3.4 das Zielsystem 6.7.8.9 auf Port 25 versucht zu erreichen. Das wäre ein Blacklist-Eintrag.

Sicherer und häufig einfacher ist aber eine Whitelist. Dann wird prinzipiell erstmal alles gedroppt, und nur einige definierte Verbindungen dürfen durchgelassen werden. Bei einer lokalen Firewall zuhause oder auf einem Server resultiert das in 1-20 Regeln. In einer größeren Firma mit komplexen Netzwerken, vielen vielen Servern und Arbeitsrechnern, einigen dutzend IP-Bereichen und Hardware-Firewalls, die ganze Netze voneinander trennen (also nicht hunderte lokal installierte Software-Firewalls), artet diese Sicherheit häufig auch in viel Arbeit und komplexe Regeln aus.

Kürzlich mußten wir ein System mit einer komplexen Software, welche Verbindungen zu aktuell 65 anderen Systemen (es werden kontinuierlich mehr) aufbaut, um dort Daten abzuholen und abzuliefern, von einem Server auf einen anderen Server in einem anderen Netz umziehen. Da wir keine Listen hatten, zu welchen Zielsystemen eine Verbindung möglich ist und zu welchen nicht, hilft nur ausprobieren.

Da wir Informatiker ja bekanntlich faul sind (was nicht immer schlecht ist, denn faule Programmierer meiden redundanten Code, programmieren selten mehr Schnick-Schnack in eine Anwendung als benötigt usw) haben wir uns ein kleines Script geschrieben, das alle benötigten Zielsysteme durchprobiert und eine schöne Liste der nicht erfolgreichen Verbindungen ausgibt.

Unsere erste Version tat genau das: Es versucht, alle Zielsysteme auf einem bestimmten Port zu erreichen, indem es eine Socketverbindung aufbaut und dann wieder trennt. Ein schicker 40-Zeiler:

<?php
require_once('../init.php');
$configIni = Zend_Registry::get($configIni);

echo 'We are using database: ' . DATABASE_DBNAME."\n\n";

$portChecks = array();
$portChecks[] = array('Host' => $configIni->mail->standard->host, 'Port' => $configIni->mail->standard->port);
$portChecks[] = array('Host' => $configIni->mail->secure->host, 'Port' => $configIni->mail->secure->port);
$portChecks[] = array('Host' => $configIni->db->config->hostnameonly, 'Port' => $configIni->db->config->port);
$portChecks[] = array('Host' => $configIni->product1->host, 'Port' => $configIni->product1->port);

$db = MDB2::singleton('mssql://' . DATABASE_USER . ':' . DATABASE_PASS . '@' . DATABASE_SERVER . ':' . DATABASE_PORT . '/' . DATABASE_DBNAME);
$db->setFetchMode(MDB2_FETCHMODE_ASSOC);

// add FTP Checks from DB
$ftpModules = $db->queryAll('SELECT DISTINCT Server, Serverport FROM FTP');
foreach ($ftpModules as $ftpModule) {
$portChecks[] = array('Host' 	=> $ftpModule['server'],
'Port' 		=> $ftpModule['serverport'] == 0 ? 21 : $ftpModule['serverport']	);
}

// add SFTP Checks from DB
$sftpModules = $db->queryAll('SELECT DISTINCT Server, Serverport FROM SFTP');
foreach ($sftpModules as $sftpModule) {
$portChecks[] = array('Host' 	=> $sftpModule['server'],
'Port' 		=> $sftpModule['serverport'] == 0 ? 22 : $sftpModule['serverport']	);
}

echo "\nStarting Port Tests:\n";
foreach ($portChecks as $portCheck) {
$ret = @fsockopen($portCheck['Host'], $portCheck['Port']);
if (!$ret) {
echo 'Port ' . $portCheck['Port'] . ' on Host ' . $portCheck['Host'] . " (IP: ".gethostbyname($portCheck['Host']).") cannot be opened. Please check!\n";
} else {
fclose($ret);
echo ".";
}
}

In der zweiten Version kann es aktuell auch noch etwas detaillierter die eigentlichen Protokolle nutzen und sich zB auf einem FTP-Server einloggen oder SMB-Pfade prüfen. Das geht über den eigentlichen Porttest hinaus, ist aber für unsere Einsatzzwecke durchaus interessant, um zB falsche Login-Informationen oder anderweitige Probleme aufzudecken.

Written by Michael Kliewe

Juni 29th, 2009 at 5:46 pm

Posted in PHP

Tagged with , , , ,