Webserver Apache schützen
Unnötige Dienste abschalten

CloudDeveloperIT-ProjekteKomponentenNetzwerkeServerSoftwareWorkspace

Nach der Installation ist der Webserver Apache häufig mit Optionen aktiv, die ungewollt Sicherheitslöcher aufreißen. Vor der Inbetriebnahme sollte der Administrator daher alle nicht benötigten Dienste und Programme abschalten beziehungsweise deinstallieren.

Weniger ist mehr

Webserver Apache schützen

Das Dilemma ist offensichtlich: Der Webserver Apache soll ständig über Internet erreichbar sein, was ihn zum idealen Ziel eines Angreifers macht. Eine Attacke von einer regulären Anfrage zu unterscheiden ist manuell kaum möglich. Der Server muss daher möglichst wenig Angriffsfläche bieten und gleichzeitig aktiv den Traffic überwachen. Die Konfigurationsdatei des Webservers kommt beim Sicherheitscheck erst relativ spät an die Reihe. Wichtiger ist vorher, das Betriebssystem und die Netzwerkverbindungen zu sichern.

Nur das Nötigste
Viele nach einer Distributionsinstallation standardmäßig laufenden Dienste sollten Sie auf dem Webserver abstellen. Ein typischer Kandidat ist beispielsweise der FTP-Dienst, denn für die Dateiübertragung zum Webserver gibt es bessere Software wie etwa die Secure-Shell (SSH). Die Dienste, die ein Rechner anbietet, sind jeweils einem oder mehreren IP-Ports zugeordnet. Horcht ein Dienst an einem eingehenden Port, dann kann man sich von außen mit diesem Dienst zumindest schon mal verbinden. Verfügt der Dienst über einen Sicherheitsmechanismus, etwa einen Passwortschutz, ist er als einigermaßen sicher zu betrachten. Allerdings sollte man nicht vergessen, dass die meisten Standarddienste die Passwörter im Klartext übertragen. Somit kann jeder mit Zugriff auf das Netzwerk solche Dienste abhören und die Passwörter einsammeln.

Nur zwei Dienste
Auf einem Webserver sollten von außen nur maximal zwei Dienste erreichbar sein. Der eine Dienst ist der HTTP Dienst. Der zweite Dienst soll die Datenübertragung zwischen dem Server und einem administrativen Client erlauben. Meist kommt dafür die Secure-Shell zum
Zug, da sie die Kommunikation zwischen Client und Server verschlüsselt.


Datenbank schützen

Webserver Apache schützen

Nur HTTP-Anfragen erlauben
Ein Webserver sollte am besten nur auf HTTP-Anfragen auf Port 80 hören und antworten. Dadurch reduzieren Sie die Angriffsfläche so weit wie möglich: Sie müssen nur noch den Apache selbst, aber keine weiteren Programme schützen. Idealerweise entfernen Sie sogar den Apache vom Webserver und ersetzen diesen durch einen Proxy-Dienst wie Squid (www.squid.org). Der Proxy nimmt dann stellvertretend alle Anfragen entgegen und leitet sie an den Webserver weiter. Vorteil: Der Apache selbst ist nach außen nicht sichtbar.
Leider reicht ein reiner HTTP-Server oftmals nicht für das Webvergnügen aus. In der Regel laufen auch noch ein Mailund ein Datenbankserver auf dem gleichen Betriebssystem. Jeder zusätzliche Dienst führt wie selbstverständlich auch zusätzliche Sicherheitslöcher ein. Diese kombinieren geschickte Angreifer miteinander und verknüpfen zwei eigentlich unproblematische Fehler in unabhängigen Softwarepaketen zu einem relevanten Problem. Dem können Sie nur begegnen, indem Sie möglichst alle permanenten Dienste auf externe Rechner auslagern. Der Mailserver lässt sich recht einfach auf eine zweite Maschine verschieben. Danach reicht ein MX-Eintrag (Mail Exchanger) im DNS, der die IP-Adresse und den Rechnernamen enthält.

Webdatenbank schützen
Interne Dienste wie eine Datenbank sollten auf separaten Rechnern innerhalb eines eigenen Subnetzes mit nicht routbaren privaten IP-Adressen laufen. Vom Webserver aus erreichen Sie das Subnetz über eine zweite Netzwerkkarte und einen Switch. Der Webserver hängt dann gleichzeitig in einem öffentlichen und einem privaten Netz. Das private Netz ist aber von außen nicht zu sehen. Noch mehr Sicherheit erreichen Sie, wenn Sie zwischen dem privaten Subnetz und dem öffentlichen Subnetz zusätzliche Firewalls einsetzen. Zuletzt sollte eine unverschlüsselte Verbindung zwischen den Rechnern des privaten und des öffentlichen Subnetzes nicht möglich sein.

Kleines Passwort-Einmaleins
Ein sicheres Passwort hat mehrere Merkmale: Es muss so lang und kompliziert sein, dass es sich nicht durch Ausprobieren mit Passwortlisten und schierer Rechenkraft knacken lässt (Brute-Force- Attacke). Keinesfalls dürfen Passwörter an einem Ort liegen, von wo sie irrtümlich nach außen gelangen können wie dem Posteingangsordner. Damit das Passwort auch sicher bleibt, sollte es niemals durch einen unverschlüsselten Kanal übertragen werden. Ein kompliziertes und hinreichend langes Passwort enthält Großund Kleinbuchstaben, Ziffern und zulässige Sonderzeichen und Umlaute und kommt je nach System auf mindesten 8 bis 12 Zeichen. So ein zufällig konstruierter Ziffernsalat lässt sich jedoch nur schwer merken. Suchen Sie einen Satz mit genügend Wörtern und benutzen Sie als Passwort die ersten Zeichen aller dieser Wörter in derselben Reihenfolge. Danach platzieren Sie noch ein paar Zahlen dazwischen. Aus »Ein Ring sie zu Knechten und alle zu Binden« wird dann einfach »ERszKuazB« und mit ein wenig Würze kommt das unknackbare »E1Rsz- KuazB2« heraus. Komplette Sätze schaffen wesentlich mehr Sicherheit gegen Brute-Force-Attacken.

Passwörter
Ferner ist es unerlässlich, dass Sie für jeden benötigten Account ein anderes Passwort verwenden. Hat sich ein Einbrecher mittels Passwort Zugang zu einem Dienst oder Rechner verschafft, kommt er somit wenigstens nicht weit.


Benutzereingaben validieren

Webserver Apache schützen

Wenn Sie auf Ihrem Webserver interaktive Seiten anbieten, dürfen die Benutzereingaben nichts enthalten, was unerwünschte Reaktionen des Webservers oder der benutzten Dienste auslöst. Eine bestimmte Zeichenfolge in einem Webformular darf beispielsweise nicht dazu führen, dass der Benutzer dadurch ein Shell-Kommando ausführt. Apache lässt sich vor solchen Angriffen schützen, indem Sie alle Eingaben der Benutzer durch Filter laufen lassen, die potenziell schädliche Eingaben abfängt.

Einbrüche erkennen
So sehr ein System auch geschützt ist, ein Einbruch wird trotzdem immer möglich bleiben. Auch wenn Sie dank aufmerksamer Konfiguration lange Zeit von einem Einbruch verschont bleiben, sollten Sie die Einbruchsversuche protokollieren. Dazu dienen Intrusion-Detection- Systeme wie das Open-Source-Programm Snort (www.snort.org). Zusätzlich zum Protokoll des Einbruchserkennungssystems sollten Sie jegliche Aktivitäten auf Ihrem Server aufzeichnen. So gut wie jedes Serveprogramm kann eine Log-Datei führen, deren Umfang und Aussehen der Benutzer selbst einstellen kann. Angriffe sind meist dann erfolgreich, wenn sich der Angreifer bekannte Sicherheitslöcher zu Nutze machen kann. Und dies schafft er relativ leicht, denn im Internet tummeln sich entsprechend vorgefertigte Skripte. Der beste Schutz davor, ist eine Binsenweisheit: Halten Sie Ihr System auf dem neuesten Stand und installieren Sie aktuelle Patches so schnell wie möglich.

Und nun die Praxis
Zuerst stellen Sie sicher, dass auf Linux nur absolut notwendige Dienste laufen. Diese deaktivieren Sie in Suse 9.1 über das Verwaltungsprogramm »Yast« im Menü System/Runlevel ändern. Danach kümmern sich darum, dass die Apache-Software möglichst wenig Angriffsfläche bietet. Außer dem HTTP-und dem SSHServer darf sich kein Server nach draußen verbinden. Zudem muss der Apache-Webserver mit einem vorher festgelegten Satz an Komponenten auskommen. Obendrein sollten Sie auf dem Linux- System eine Firewall in Betrieb nehmen. Alle modernen Linux-Distributionen bringen dafür eine grafische Oberfläche für die Konfiguration mit. Auf Suse 9.1 befindet sich diese im Yast-Menü Sicherheit. Es spricht auch nichts dagegen, auf dem Webserver-Rechner das grafische Fenstersystem »XFree86« (www.X.org) zu installieren. Viele Werkzeuge sind im Grafikmodus deutlich einfacher zu handhaben als auf der Kommandozeile und gerade bei der Grundkonfiguration des Servers hilfreich. Im späteren Betrieb brauchen Sie das X-Window-System nicht mehr laufen zu lassen und kö
nnen es deinstallieren. Während Sie das Linux-System installieren und konfigurieren, sollten Sie nicht mit dem Internet verbunden sein. Erst wenn Sie die elementaren Sicherheitsmaßnahmen wie Dienste abzustellen erledigt haben, können Sie die Verbindung wiederherstellen.


Test des Serves

Webserver Apache schützen

Erster Test: Verbindung prüfen
Nachdem Sie die Grundinstallation gesichert haben, überprüfen Sie zunächst mit dem »netstat«-Kommando, welche Serversockets in Benutzung sind: netstat -l Der Befehl liefert einen Überblick, welche Dienste laufen und bereit sind, eingehende Verbindungen anzunehmen. Den Maildienst SMTP beispielsweise installieren die Linux-Distributionen immer im empfangsbereiten Zustand. Haben Sie sich an unsere Empfehlung gehalten, sollten lediglich zwei Server- Sockets auftauchen: einer für HTTP und einer für SSH. Tauchen weitere Dienste mit Server-Sockets auf, überarbeiten Sie die Grundkonfiguration nochmals und deaktivieren Sie die entsprechenden Dienste. Anschließend booten Sie das System und prüfen die Konfiguration erneut. Webserver konfigurieren Erst jetzt lohnt sich ein Blick in die Konfigurationsdatei »httpd.conf« des Webservers. Die Standardinstallation des Apache legt immer einen Haufen Dinge an, die Sie aber gar nicht brauchen. Dazu zählen zum Beispiel ein virtuelles Verzeichnis für die Online-Dokumentation sowie verschiedene öffentlich zugängliche Module, die Status- und Statistikinformationen über den Apache liefern. Diese und die folgenden Angaben beziehen sich auf den Apache 1.3. Zwar ist der Apache 2 schon einige Jahre verfügbar, aber in der Praxis kommt meist die Version 1.3 zum Einsatz: Die offizielle PHPSite rät gar vom Einsatz des Apache 2 im Zusammenhang mit PHP ab. Keinesfalls benötigen Sie dutzende oder hunderte von »LoadModule()«-Statements, über die sich Module nachladen lassen. Setzen Sie hingegen ausschließlich die Module ein, die Sie wirklich brauchen. Dies können Sie natürlich nur beurteilen, wenn Sie genau wissen, was das jeweilige Modul bewirkt. Damit Sie nicht alle Beschreibungen studieren müssen, haben wir bereits eine sinnvolle Auswahl vorgenommen (siehe Kasten »Sinnvolle Apache-Module«).

Module
Besonders Module wie »server-status « und «server-info«, die Sie nach der Installation unweigerlich etwas weiter unten in »httpd.conf« finden, sollten Sie nur während der Konfigurationsphase verwenden. Danach kommentieren Sie diese Module sowie die Konfigurationsstatements am besten aus. Auch bei einer umfangreichen Site sollten Sie demnach mit einer Konfigurationsdatei auskommen, die nicht größer als 10 KByte ist. Nach dem Abschalten der Dienste und dem Säubern der »httpd.conf« besitzen Sie bereits einen verhältnismäßig sicheren Webserver. Prüfen Sie danach noch, ob alle Verzeichnisse mit einem Default- Directory-Handler ausgestattet sind. Zumindest eine »index.html«-Datei sollte sich in jedem öffentlichen Verzeichnis befinden. Bei allen gängigen Linux-Distributionen finden Sie auch eine grafische Konfigurationsoberfläche für die beigepackte Firewall.
Im letzten Konfigurationsschritt verwenden Sie noch das X-Window- System, um bequem passende Firewall- Regeln für den Webserver aufzustellen. Bei einem reinen Webserver ist das verhältnismäßig einfach: Eingehende Verbindungen darf der Server lediglich an Port 80 entgegennehmen und ausgehende Pakete darf die Firewall grundsätzlich nur als Antwort auf diese eingehenden Pakete zulassen.

Letzte Hinweise
Diese ersten Regeln werden Sie später verbessern müssen. Irgendwann wird es beispielsweise notwendig werden, die Zeit des Servers regelmäßig mit einer Atomzeituhr zu synchronisieren. Eventuell möchten Sie auf dem Server auch einen Mailserver etablieren. Dann muss die Firewall ausgehendes SMTP zulassen. Noch ein wichtiger Hinweis: Lassen Sie den Apache-Webserver niemals als Benutzer »root« laufen. Der Server wird zwar immer von »root« gestartet, danach sollte er jedoch unter dem Account laufen, der als »User« in der Konfigurationsdatei eingetragen ist. Dieser User sollte zudem keinerlei administrative Rechte haben. Da »root« das Apache-Programm startet, darf in die »httpd.conf« auch nur der Benutzer »root« schreiben. Gleiches gilt für das Apache-Verzeichnis und alle Väter davon. Ist dies nicht der Fall, kann der Angreifer das Apache-Binary durch ein eigenes Programm ersetzen ? und dieser Apache-Ersatz würde dann von »root« ausgeführt.


Checkliste & Module

Webserver Apache schützen

Sinnvolle Apache-Module
Die komplette Load-Module-Sequenz in einer »httpd.conf« für einen Apache mit Support für PHP (4), komprimierte Webseiten, Authentifizierung für geschützte Webseiten-Bereiche, minimales CGI, Logfiles und Expires-Header (sowie einigen abhängigen Modulen) sieht folgendermaßen aus:

LoadModule php4_module /usr/lib/apache/libphp4.so
LoadModule config_log_module /usr/lib/apache/mod_log_config.so
LoadModule mime_module /usr/lib/apache/mod_mime.so
LoadModule negotiation_module /usr/lib/apache/mod_negotiation.so
LoadModule dir_module /usr/lib/apache/mod_dir.so
LoadModule cgi_module /usr/lib/apache/mod_cgi.so
LoadModule access_module /usr/lib/apache/mod_access.so
LoadModule auth_module /usr/lib/apache/mod_auth.so
LoadModule expires_module /usr/lib/apache/mod_expires.so
LoadModule headers_module /usr/lib/apache/mod_headers.so
LoadModule setenvif_module /usr/lib/apache/mod_setenvif.so
LoadModule gzip_module /usr/lib/apache/mod_gzip.so

Webserver-Checkliste
.. Nicht benutzte Dienste abschalten
.. Nach außen geführte Dienste auf unterschiedliche Rechner verteilen
.. Interne Dienste auf unterschiedliche Rechner auslagern
.. Verschiedene Passwörter für unterschiedliche Rechner verwenden
.. Sichere Passwörter wählen
.. Webserver in einer entmilitarisierten Zone (DMZ) betreiben
.. Auf dem Webserver eine Firewall laufen lassen
.. Unerwünschte Accounts entfernen oder sichern
.. Nur sichere Kommunikationswege mit dem Server verwenden
.. Prüfung von Benutzereingaben bei interaktiven Seiten
.. Intrusion-Detection-Systeme (IDS) einsetzen
.. Protokolle mitführen, speichern und regelmäßig prüfen
.. Systeme auf aktuellem Stand halten
.. Apache nicht im Kontext des Benutzers »root« betreiben