Alarmanlage für den Server mit PHP
Serverüberwachung

SicherheitSicherheitsmanagement

Hacker, Hochwasser, Hardware-Schäden – die Gefahren für Webserver sind vielfältig. Wer seine Server stets im Auge behalten will, kann sie mit fertigen oder selbst programmierten Tools überwachen.

24/7-Überwachung

Alarmanlage für den Server mit PHP

Totalausfall im Rechenzentrum. Gemerkt hat es der Webmaster erst Stunden später, weil Stammkunden sich beschwerten. Wie viel Laufkundschaft verloren ging, wird er wohl nie erfahren. Die verprellten Stammkunden dagegen wird er schmerzlich vermissen. Damit so etwas nicht passiert, sollten Webserver ständig überwacht werden. Das lässt sich mit der richtigen Software vom Arbeits-PC im Büro aus erledigen. Den möchte man aber nicht Tag und Nacht eingeschaltet lassen. Wer seinen Server rund um die Uhr überwachen will, kann einen Dienstleister beauftragen. Oder er benutzt zwei Webserver dazu, sich gegenseitig zu überwachen.


Unterschiedliche Provider

Alarmanlage für den Server mit PHP

Am besten lässt sich eine Überwachung auf zwei oder mehr Servern bei unterschiedlichen Providern installieren. Die Server laufen 24 Stunden und können sich gegenseitig überwachen. Und wenn das Rechenzentrum des einen Providers komplett ausfällt, schlägt der Server beim anderen Provider Alarm. Wer nur einen einzigen Account hat, tut sich mit Freunden oder Geschäftspartnern zusammen oder sucht sich einfach im Webmaster-Forum seiner Wahl einen oder mehrere Partner, die ihre Server ebenfalls überwachen wollen.

Ob der Server erreichbar ist, können Sie auch mit Partnern überwachen, die Sie noch nie gesehen haben. Vertrauliche Daten brauchen dabei nämlich nicht ausgetauscht werden. Und ob die Partner wirklich wachsam sind, kann jeder am eigenen Server-Log ablesen. Sollen dagegen die Server darüber hinaus noch gegen Hacker gesichert werden, wird es komplizierter. Entweder vertrauen Sie Ihren Partnern genug, um ihnen auch FTP-Zugriff auf Ihre Seiten zu geben, oder Sie betreiben diesen Teil der Überwachung ohne Partner. Der PHP-Hackerschutz per FTP lässt sich nämlich nicht nur auf einem Webserver, sondern auch auf einem Client-PC installieren. Denkbar wäre noch, die Dateien des Webservers durch ein PHP-Skript auf dem Server selbst zu prüfen. Das lässt sich aber im Ernstfall zu leicht aushebeln.

Im Folgenden stellt Internet Professionell das volle Arsenal der Server-Überwachung für Shared Hosting vor: PHP-Skripts, die auf Partner-Servern, aber auch auf Bürorechnern laufen können, Client-Programme für Windows und Linux sowie Dienstleister, die Ihnen die Überwachungsarbeit abnehmen.


Problem: Prüfintervall

Alarmanlage für den Server mit PHP

Eine Server-Überwachung in PHP steht vor allem vor einem Problem: Wie löse ich Prüfläufe in kurzen Abständen aus, ohne dabei zu viel Rechenzeit zu verbrauchen? Die Tester haben verschiedene Varianten ausprobiert und dabei alles verworfen, was Dauerbetrieb auf den beteiligten Servern erzeugt. Solche Skripts werden von den Providern früher oder später automatisch beendet. Und da hilft es auch nicht, den Überwachungsprozess auf mehrere Skripts aufzuteilen, die sich gegenseitig auslösen. Der Rekord liegt im Test bei einer Laufzeit von fünf Stunden. Und das schaffen die Tester nur, indem sie die Überwachung trickreich auf vier Skripts verteilten. Aber selbst dieser Aufbau wird schließlich von den Providern gekillt. Diese Variante eignet sich also nur für virtuelle oder dedizierte Server mit hinreichend Rechenpower.

Monitoring mit HTTP-Refresh oder HTTP-Status-Codes funktionieren weder auf Shared Hosting noch auf dedizierten Servern, weil sie voraussetzen, dass auf der Gegenseite ein Browser läuft. Bei der gegenseitigen Überwachung zweier Server versagen diese Header-Attribute. Mehr als zwei Server einzubinden, die sich reihum überwachen, erweist sich im Test wiederum als zu kompliziert. Und Cronjobs sind, wenn überhaupt verfügbar, nur alle paar Stunden erlaubt. Das reicht zwar zur regelmäßigen Prüfung auf Defacements, kann aber nicht die ständige Erreichbarkeit sicherstellen.


Lösung: Website-Besucher

Alarmanlage für den Server mit PHP

Die Lösung ist ebenso einfach wie genial. Kai Blankenhorn macht es mit seinem Skript pseudo-cron vor: Spannen Sie die Benutzer ein! Statt die Server mit Endlosschleifen oder Pingpong-Systemen zu überlasten, wird die Server-Überwachung mit der include-Anweisung in eine viel besuchte Seite eingebunden. Jedes Mal, wenn ein Benutzer die Seite aufruft, löst er damit die Überwachung aus.

Eine regelmäßige Überwachung alle zehn Sekunden lässt sich damit natürlich nicht garantieren. Dafür braucht sich bei dieser Methode niemand den Kopf zu zerbrechen, wie oft sein Server sinnvollerweise geprüft werden sollte. Wenn die Partner-Server ungefähr gleich viele Besucher haben, passt die Überwachungsfrequenz automatisch.

Zwei oder mehr Webmaster tun sich zusammen. Wer mehrere Accounts bei unterschiedlichen Hostern hat, kann das natürlich auch alleine durchziehen. Jeder Teilnehmer speichert eine Datei mit Namen erreichbar.txt auf seinem Server. Diese Datei wird zur Prüfung regelmäßig abgerufen. Sie braucht nur ein Zeichen zu enthalten. Es wäre auch denkbar, die Startseiten der Websites zu verwenden. Wenn nicht nur die Erreichbarkeit per HTTP, sondern auch PHP geprüft werden soll, wird statt einer einfachen Textdatei ein minimales PHP-Skript verwendet, zum Beispiel dieses:


echo "Server erreichbar, PHP funktioniert";
?>


PHP und MySQL überwachen

Alarmanlage für den Server mit PHP

Wer darüber hinaus weitere Funktionen wie MySQL, Perl oder bestimmte Skripts überwachen will, muss weitere Aufrufe einbauen. Der Fairness halber sollten alle Teilnehmer ungefähr gleiche Test-Dateien verwenden.

Den Testlauf selbst binden Sie mit einer einfachen include-Anweisung ein, und zwar am Ende der Seite, etwa so:




include "pingtopeer05.php";
?>

So kann der Server seinen Partner-Server überwachen, ohne dass der Seitenaufbau für den Benutzer auch nur eine Millisekunde verzögert wird. Übrigens: Das Skript heißt pingtopeer, weil seine Funktion dem bekannten Ping entfernt ähnelt und es mit gleichberechtigten Partnern (Peers) arbeitet.

Das Überwachungs-Skript selbst prüft zunächst, wie lange der letzte Prüflauf zurückliegt. Sind das weniger als zehn Sekunden, beendet es sich sofort. Dieser Wert lässt sich natürlich anpassen. Statt eines eigenen Zeitstempels können Sie dazu auch die Zugriffszeit der Logdatei auswerten.


$datei = fopen("zeitstempel.txt","r");
$zeitstempel = fgets($datei, 100);
fclose($datei);
$zeitdifferenz = $jetzt - $zeitstempel;
if ($jetzt - $zeitstempel > 10) {
# Überprüfung durchführen
} else {
# Es wurde erst vor weniger als 10 Sekunden geprueft, Ende.
exit();
}


Mehrere Server

Alarmanlage für den Server mit PHP

Ansonsten ruft es die Datei vom Partner-Server ab und notiert das Ergebnis in einer Logdatei. Ist die Datei nicht erreichbar, wird der Webmaster alarmiert. Achtung: Denken Sie daran, zur Alarmierung eine alternative Mail-Adresse zu verwenden, damit die Mail nicht auf demselben Server verschwindet, dessen Ausfall sie zu melden versucht.


if (fopen("http://".$web."/erreichbar.txt", "r")) {

# Status schreiben
$datei = fopen("pingtopeer.log","a");
fwrite($datei, $datum." - erreichbar: ".$web."\n");
fclose($datei);
} else {
# Status loggen
$datei = fopen("pingtopeer.log","a");
fwrite($datei, $datum." - NICHT erreichbar: ".$web."\n");
fclose($datei);
# Mail an Admin schicken.
mail($mail, $web." nicht erreichbar - ".$datum, 'From: Pingtopeer')
}

Die Variablen $mail und $web werden in einer Konfigurationsdatei hinterlegt. So können mehrere Server gleichzeitig oder im Wechsel überprüft werden. Wie oft der eigene Server überprüft wird, lässt sich sehr leicht kontrollieren: Lassen Sie einfach in der Webstatistik die Zugriffe auf die Datei erreichbar.txt anzeigen. Wie oft Ihr eigener Server den Partner-Server angetestet hat, sehen Sie im eigenen Log von pingtopeer.


Client-Alternativen

Alarmanlage für den Server mit PHP

Während der Bürozeiten kann natürlich auch ein Programm auf einem Client-Rechner die Erreichbarkeit des Webservers sicherstellen. Wer Linux auf dem Desktop hat, bastelt dazu ein Skript, das den Ping-Befehl mit cron, if und mail verknüpft. Sollen auch HTTP oder weitere Funktionen geprüft werden, lässt sich das eben vorgestellte Skript auch mit einem auf dem Client installierten PHP-Interpreter ausführen.

Windows-Anwender können zudem einfach das Programm Freeping installieren. Freeping kann unter www.tools4ever.com nach Registrierung kostenlos heruntergeladen werden. Dort gibt es übrigens auch kostenpflichtige Monitoring-Tools, die wesentlich mehr können. Freeping benutzt – wie der Name sagt – den Ping-Befehl, um zu prüfen, ob Server erreichbar sind. Ist das nicht der Fall, zeigt es ein rotes Icon und auf Wunsch zusätzlich eine Popup-Meldung an. Es können beliebig viele Server überwacht werden, die Überwachungsintervalle sind frei einstellbar.


Defacement-Schutz

Alarmanlage für den Server mit PHP

Um sich gegen Defacement zu schützen, sollten regelmäßig die statischen Dateien auf dem Webserver überprüft werden. Um nicht zu viel Traffic zu erzeugen, werden per FTP die Ordnernamen, Dateinamen und für jede Datei das Zugriffsdatum und die Größe abgerufen. Wenn sich irgendetwas an diesen Daten geändert hat, wird Alarm ausgelöst. Im Folgenden entwickeln Sie ein PHP-Skript, mit dem sich Webserver gegenseitig überwachen können. Ein ähnliches Skript für Linux-Clients wurde schon in der März-Ausgabe von Internet Professionell vorgestellt.

Auf Windows-Clients können Sie das kostenlose Hackdetect verwenden. Hackdetect gibt es als Freeware unter hackdetect.com. Das Programm bietet eine komfortable Oberfläche. Es können beliebig viele Server überwacht werden. Hackdetect liest zunächst eine komplette Liste der Dateien von jedem Server ein und überprüft diese regelmäßig oder auf Anforderung. Alarm gibt das Programm aber nur mit einem Fenster auf dem Desktop. Eine Mail-Funktion ist nicht enthalten. Für jeden Server können Ordner definiert werden, die von der Überwachung ausgenommen werden sollen. Wer noch mehr Aufwand treiben will, kann den Ipcheck-Server-Monitor von Paessler benutzen. Das Programm legt seine Daten auf einem SQL-Server ab und kann eine Vielzahl von Diensten auf mehreren Servern überwachen. Es ist unter paess ler.com zu haben. Bei der Freeware-Edition beträgt das Prüfintervall mindestens 15 Minuten.


Schutz mit PHP

Alarmanlage für den Server mit PHP

Die folgende Lösung ist in PHP geschrieben. Sie liest alle Unterverzeichnisse rekursiv aus, und zwar auch, wenn der Server die Option -R für Dateilisten per FTP nicht unterstützt. Das ist zum Beispiel bei Strato so. Das PHP-Skript lässt sich auf Webservern zur gegenseitigen Überwachung verwenden. Sie können es aber auch auf einem Linux- oder Windows-Client laufen lassen. Auf dem Client muss nur ein PHP-Interpreter installiert sein. Der ist bei Linux ohnehin meist dabei. Für Windows bekommen Sie ihn unter www.php.net/downloads.php.

Jeder Defacement-Schutz muss zunächst einen gültigen Sollzustand festhalten, damit Abweichungen davon später festgestellt werden können. Dazu dient das Skript sidephp_soll.php. Es speichert die Dateiliste des Partnerservers auf dem lokalen Server mit der Endung SOLL. Der Kern des Skripts ist eine rekursive Funktion, die sich selbst aufruft, sobald sie in einem Ordner auf einen Unterordner trifft:


function gesamtverzeichnis($verbindung, $ordner, $dateihandle) {
$liste = ftp_nlist($verbindung, $ordner);
foreach($liste as $datei) {
$dateigroesse = ftp_size($verbindung, "/".$datei);
if ($dateigroesse == -1) {
$temp = gesamtverzeichnis($verbindung, "/".$datei, $dateihandle);
}
}
return;
}

Den Startordner bekommt die Funktion als Parameter übergeben. Die Dateiliste wird abgerufen und mit foreach() zeilenweise abgearbeitet. Für jeden Eintrag wird die Dateigröße mit ftp_size() abgefragt. Stößt diese Funktion auf einen Fehler, gibt sie das Ergebnis -1 aus. Das ist dann der Fall, wenn die Dateigröße eines Ordners abgefragt wird. Der Fehler wird also benutzt, um Ordner als solche zu erkennen. Dann wird die gesamte Funktion für den gefundenen Unterordner erneut aufgerufen.

Leider läuft die Funktion in eine Endlosschleife, wenn sie auf einen leeren Ordner trifft. Es muss daher eine Bedingung eingebaut werden, die die Rekursion bei leeren Ordnern ausschließt:


if ($liste == "") {
echo "leer
";
} else {
# Rekursion
}


Ausgabe und Kontrolle

Alarmanlage für den Server mit PHP

Jetzt muss nur noch die Dateigröße ermittelt und das Ganze ausgegeben werden:

$dateidatum = ftp_mdtm($verbindung, "/".$datei);
echo "Datum: ";
fwrite ($dateihandle, "Datum: ");
echo $dateidatum;
fwrite ($dateihandle, $dateidatum);
echo " - Groesse: ";
fwrite ($dateihandle, " - Groesse: ");
echo $dateigroesse;
fwrite ($dateihandle, $dateigroesse);
echo " - Datei: ";
fwrite ($dateihandle, " - Datei: ");
echo $datei;
fwrite ($dateihandle, $datei);

Die echo-Ausgaben dienen lediglich der Kontrolle. Die Ausgaben in die Datei erzeugen die Dateiliste, die vom eigentlichen Überwachungs-Skript ausgewertet wird.

Diese Liste könnte auch knapper gehalten werden. Aber im Zweifelsfall kann es nicht schaden, wenn die Datei auch für Menschen verständlich bleibt.

Ist der Sollzustand einmal festgehalten, kann er regelmäßig kontrolliert werden. Dazu wird immer wieder das Skript sidephp07.php gestartet, das genau auf die gleiche Weise die Dateiliste vom Partnerserver abruft. Diese wird mit der Endung IST gespeichert und mit der ersten verglichen. Zuerst wird nur die Größe der beiden Dateilisten verglichen. Sind die Listen unterschiedlich lang, können Sie sich die Prüfung der einzelnen Zeilen sparen und gleich Alarm auslösen:

$solldateigroesse = filesize($adresse.".soll");
$istdateigroesse = filesize($adresse.".ist");
if ($solldateigroesse != $istdateigroesse) {
echo "Dateigroessen weichen ab";
# Mail an Admin schicken.
mail($mail, "ALARM! Web-Inhalte geaendert!", 'From: Alarmanlage')
exit();
}


Details

Alarmanlage für den Server mit PHP

Sind beide Dateilisten gleich lang, werden sie zeilenweise verglichen. Dazu werden beide Dateien geöffnet:

$soll = fopen($adresse.".soll", "r");
$ist = fopen($adresse.".ist", "r");

Es wird je eine Zeile eingelesen:

$sollzeile = fgets ($soll, 1000);
$istzeile = fgets ($ist, 1000);

Findet das Skript einen Unterschied, schlägt es Alarm und bricht ab:

if ($istzeile != $sollzeile) {
# Abweichung gefunden, Alarm!
echo "ALARM!";
echo "
";
echo $istzeile;
echo "weicht ab.";
# Mail an Admin schicken.
mail($mail, "ALARM! Web-Inhalte geaendert!", 'From: Alarmanlage')
# Abbruch, um alles weitere soll sich der Admin kuemmern.
exit();
}

Wer die Dateien gründlicher analysieren möchte, kann ein Vergleichs-Skript hier herunterladen und einbinden: www.holomind.de/phpnet/diff2.src.php.


Sicherheit

Alarmanlage für den Server mit PHP

Ein Schwachpunkt bei der Server-Überwachung per FTP sind die Zugangsdaten. Diese müssen im Klartext auf dem Rechner gespeichert werden, der die Überprüfung durchführt. Damit die Daten nicht allzu offen im Web herumliegen, bietet es sich an, sie in ein spezielles Verzeichnis zu packen und dieses mit .htaccess zu sichern:

Order deny,allow
Deny from all
Allow from localhost

Oder Sie verzichten doch lieber auf die Überwachung von Server zu Server und starten das Skript von einem Client im Büro. Bleibt noch die Übermittlung des Passworts. Das sollte nach Möglichkeit verschlüsselt erledigt werden. SSL-Verschlüsselung lässt sich aktivieren, wenn beide Parteien das unterstützen.

In PHP wird dafür statt ftp_connect() die Funktion ftp_ssl_connect() benutzt. Die ist aber erst seit PHP 4.3.0 vorhanden und steht daher nicht auf allen Accounts zur Verfügung. Auf dem Test-Account bei 1&1 können die Tester die Verschlüsselung nutzen, bei Strato nicht.


Cronjobs

Alarmanlage für den Server mit PHP

Dafür bietet Strato aber einen anderen Service, der sich ausgezeichnet für die Server-Überwachung eignet und bei vielen Hostern nur in umfangreicheren Serverpaketen zur Verfügung steht, nämlich Cronjobs. Diese werden in frei definierbaren Intervallen von mindestens vier Stunden automatisch gestartet.

Sie finden die Cronjobs auf Ihrem Strato-Account unter Einstellungen. Wenn Sie hier ein PHP-Skript starten wollen, müssen Sie es zusammen mit dem PHP-Interpreter aufrufen, zum Beispiel so:

/bin/php ./sidephp/sidephp07.php


Fazit

Alarmanlage für den Server mit PHP

Es gibt viele Gründe, weshalb Webserver ausfallen können. Zum Glück gibt es aber auch ein reichhaltiges Arsenal zur Überwachung der Maschinen. Das beste Verhältnis von Aufwand und Überwachungsleistung bekommen Sie, wenn Sie die vorgestellten PHP-Skripts installieren und Ihre Server mit Partnern oder zwei eigenen Hosting-Paketen gegenseitig überwachen.

Alle Dateien und Listings zum Workshop finden Sie auf der Heft-CD und unter listings.internet-pro.de.