Script zum checken des Apache error_log

In der heutigen Zeit ist man vor nichts mehr sicher. Kaum, dass man eine Webapplication nicht auf den aktuellen Stand hat (also unmittelbar nach dem Veröffentlichen von Updates plus eine Stunde) kann es passieren, dass darüber Angriffe gefahren werden. Und das schlimmste: Man bekommt es noch nicht einmal mit. Da hilft es nur Vorsorge zu treffen, damit man immerhin weiß, was auf dem Server abgeht.

Die meisten der Attacken gehen heute über irgendwelche Web Applikationen. Dabei ist es ziemlich egal ob PHP, Perl, Ruby oder sonst was. Passen die Programmierer einmal kurz nicht auf haben sie schon ein riesige Lücke \“eingebaut\“. Und die Hacker sind ziemlich schnell und finden meist die Lücke vor den Programmierern. Zu meist wird die Lücke so genutzt, dass ein fremdes Skript von irgendeinen Server geladen wird, welches dann im eignen Webspace ausgeführt wird. Über diese Skript können dann weitere Dateien nachgeladen und andere böse Sachen gemacht werden. Ein ziemlich bekannte PHP Shell ist ist die r57shell. Ist die Datei erst einmal auf dem Webspace geht es erst richtig los. Man kann dann nur hoffen (oder selbst machen), dass er Server gut gesichert ist und nicht zu viele Informationen nach \“außen\“ getragen werden. Aber selbst dann ist man nicht sicher, ob über den Account DoS-Angriffe gefahren werden. Dazu reicht schon ein einfaches Script. Über diese Shell kann man auch Quellcodes kompilieren und die Programm ggf starten. Ganze böse Sache. Denn dadurch wird der Rechner zum Bot und/oder Dateiserver.
Wie auch immer die Operationen müssen zumeist im \“Blindflug\“ gemacht werden. Und hier kommt das Script zum Tragen. Alle Ausgaben von PHP und sonstigen Sprachen welche auf Stderr gehen werde im globalen Apache error_log geschrieben und nicht in dem vom vhost. Regelmäßige Kontrolle dieser Datei ist also angesagt damit man immerhin weiß, dass eingebrochen wurde und man schnell reagieren kann.
Normal sollte in diesem error_log nur die normalen Zugriffsfehler sein, welche immer nach dem gleichen Schema beginnen. Wenn jedoch ein Script auf Stderr schreibt dann wird diese Schema unterbrochen und der String wird direkt in die Datei geschrieben. Dies macht sich diese Checkskript zur Nutze. Es schaut einfach, ob es solche Einträge vorhanden sind und gibt diese auf Stdout aus. Es ist also ideal um es als Cronjob laufen zu lassen. So lange nichts passiert gibt es keine Ausgabe, ansonsten bekommt man eine Mail mit den Einträge 🙂
Einträge, wo man weiß, dass diese ab und an vorkommen kann man in einem Array definieren und diese werden dann nicht gemeldet. Wie oft man das Skript laufen lässt muss man selbst entscheiden. Einmal am Tag sollte aber Pflicht sein. Öfters ist besser, denn dann kann man schneller reagieren 🙂

[sourcecode language=\’php\‘]
= $seekStart )
fseek( $handle, $seekStart );

while ( !feof($handle) )
{
$buffer = fgets($handle);
if ( $buffer[0] != $startChar )
{
$found=false;
foreach( $allowedStrings as $str )
{
if ( stristr( $buffer, $str ) !== FALSE )
{
$found=true;
break;
}
}

if ( $found==false)
echo $buffer;
}
}

// remeber the current position
$seekStart = ftell($handle);

// write config file
$conf = @fopen( $confFile, \’w\‘ );
if ( $conf )
{
fputs( $conf, $seekStart );
fclose( $conf );
}

fclose($handle);
}
?>
[/sourcecode]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.