Webserver absichern

hellbringer

Active Member
Dieses Thema wurde in diesem Forum bestimmt schon durchgekaut, nur ich komm wohl nicht auf die richtigen Suchbegriffe.

Ich würde gerne wissen wie man einen Webserver (also Apache mit Perl, PHP, MySQL) sinnvoll absichern kann. Also er sollte zumindest soweit sicher sein, dass kein gewöhnlicher Script-Kiddie mit irgendwelchen Exploits oder PHP-Cracks Zugriff auf den Server bekommt. Die Benutzer auf dem Server sollten aber möglichst nicht eingeschränkt werden. Mir wäre es am liebsten, wenn jeder Benutzer seinen eigenen Bereich hat, aus dem er oder seine Scripts nicht ausbrechen können.

Auf dem Server (AMD64, 1GB RAM) laufen noch postfix, courier und pureftp. Die Benutzer werden mit MySQL verwaltet.

Hab leider nicht sehr viel Ahnung von Unix. Ein Bekannter (er verwendet Debian) hat mir ein paar Schlagworte wie "pam-sql" und "chroot" auf den Kopf geworfen. Ebenso hab ich hier schon etwas von "jail" gelesen. Brauche ich sowas?

Ich würde mich über ein paar Starttipps von erfahrenen FreeBSD-Anwendern freuen, bevor ich mich in das Gebiet reinhänge.
 
hundertprozentige siherheit gibts nicht, die gefahr geht weniger von den benutzern des system aus das sie ins system einbrechen sondern mehr von usern die mal durch zufall aufs system gelangen und ihre kentnisse und ihr glück daran testen
 
Flex6 schrieb:
hundertprozentige siherheit gibts nicht, die gefahr geht weniger von den benutzern des system aus das sie ins system einbrechen sondern mehr von usern die mal durch zufall aufs system gelangen und ihre kentnisse und ihr glück daran testen

Mir geht es im Grunde darum, wenn mal ein Benutzer gehackt wird (Eigenverschulden durch fehlerhaftes PHP Script, etc.), dass nur seine eigenen Daten davon betroffen sind, und alle anderen Benutzer sowie auch der Server selber nicht angetastet werden können.

Durch Zufall kommt hoffentlich niemand aufs System. Ich versuche es soweit abzusichern, dass nur Zugriff auf die öffentlichen Dienste (http, ftp, mail) möglich ist. Und genau deswegen möchte ich diese Dienste möglichst sicher gestalten, da von ihnen die größte Gefahr ausgeht. Nebenbei führe ich ständig Updates durch, damit keine bekannten Exploits das System gefährden.
 
hellbringer schrieb:
Die Benutzer auf dem Server sollten aber möglichst nicht eingeschränkt werden. Mir wäre es am liebsten, wenn jeder Benutzer seinen eigenen Bereich hat, aus dem er oder seine Scripts nicht ausbrechen können.
Ohne die Strukur auf dem Server nun näher zu kennen, denke ich aber doch mal ganz stark, daß du Jails haben möchtest. Dann bekommt jeder Benutzer sein Jail, wie einen virtuellen Server quasi, und kann darin rumspielen. Eine Anleitung zu dem Thema gibt es z.B. unter http://www.bsdforen.de/showthread.php?t=9867.
 
hellbringer schrieb:
Nur verstehe ich nicht, wie ich Jails anwenden soll. Dann müsste ich bei jedem einzelnen User einen Apache installieren. Und wie entscheidet der Server, dass http://hostname/user1 an Apache von User 1 geht und http://hostname/user2 an Apache von User 2?
Jede Jail hat eine eigene IP-Adresse. Also müsstest du (d)einen DNS-Server entsprechend konfigurieren, z.B. user1.domainname.tld, user2.domainname.tld usw.
Oder du lässt unter hostname einen abgespeckten Apache mit mod_rewrite laufen, der die Nutzer anhand des Pfades auf die entsprechenden IP-Adressen/DNS-Namen der Jails umleitet.

Gruß c.
 
Und gibt's eine Möglichkeit dass ich Apache nur einmal installieren muss? Ein Art Link nach außerhalb der Jail, aber nur read-only? Weil ich stell mir das ziemlich mühseelig vor, bei 100+ Benutzer jeden einzelnen aktuell zu halten.

Wie mache ich, dass nicht 100 Apaches gleichzeitig laufen? Mit inetd starten? Muss ich irgendwas beachten, damit nicht der Arbeitsspeicher sinnlos verschwendet wird?
 
hellbringer schrieb:
Und gibt's eine Möglichkeit dass ich Apache nur einmal installieren muss? Ein Art Link nach außerhalb der Jail, aber nur read-only? Weil ich stell mir das ziemlich mühseelig vor, bei 100+ Benutzer jeden einzelnen aktuell zu halten.

Wie mache ich, dass nicht 100 Apaches gleichzeitig laufen? Mit inetd starten? Muss ich irgendwas beachten, damit nicht der Arbeitsspeicher sinnlos verschwendet wird?

Wie schon gesagt wurde, "100%-ige Sicherheit gibt es nicht" aber jedem ein eigenes Jail geben ist etwas übertrieben. Zumal einige Biester sich davon nicht stören lassen. Ich hatte bei einem Kunden mal ein Spanisches Script gefunden, das durch ein PHP-Sicherheitsloch rein kam und nur gespamt hat. Das würde in einem Jail, in dem E-Mail-Formulare funktionieren, überhaupt keine Einschränkungen erfahren.

Meine Persönliche Meinung (auf Erfahrung begründet) ist:
1. PHP sicher machen, wenn es denn sein muss (meiner Meinung nach ist nur sicher wenn es gelöscht ist)
(Ich würde als Script-Sprache Python oder Ruby (kein Perl) verwenden.)
2. SuEXEC verwenden und richtig konfigurieren.
3. ca. alle 6-12 Monate (je nach veröffentlichten Lücken) updaten.

Das sollte für fast alle Fälle ausreichen ohne den Aufwand ins unermessliche zu treiben.

Info zu Perl:
Perl ist zwar beliebt, weil es einfach zu lernen und zu bedienen ist (Python aber auch) und wird darum auch oft an falscher Stelle eingesetzt. Auf der Webseite steht aber ausdrücklich das es unter hoher Last nicht richtig arbeitet (das ist KEIN Fehler) und das dieses auch kein Entwicklungsziel von Perl ist. Perl ist entwickelt worden um Administratoren (nicht den Programmierern) ein Werkzeug zum leichteren administrieren an die Hand zu geben.
Das hat nur noch keiner begriffen!!!
 
hellbringer schrieb:
Nur verstehe ich nicht, wie ich Jails anwenden soll. Dann müsste ich bei jedem einzelnen User einen Apache installieren.
Das kannst du machen, mußt du aber nicht. Je nach Anforderungsprofil und Struktur des Servers eben.
hellbringer schrieb:
Und wie entscheidet der Server, dass http://hostname/user1 an Apache von User 1 geht und http://hostname/user2 an Apache von User 2?
Lies doch mal die Dokumentation, da steht alles drin. Einen guten Link auf das Jails-Howto hier im Forum habe ich dir sogar schon vorgekaut. Daneben findet man mit Google oder auch hier im Forum genügend Lesestoff zu genau dieser Frage.
hellbringer schrieb:
Wie mache ich, dass nicht 100 Apaches gleichzeitig laufen? Mit inetd starten?
Kommt drauf an, was du für ein Zugriffsprofil hast. Da mußt du dir schon selbst aus den Zugriffsstatistiken ein Bild machen. Aber du brauchst sowieso für jede Verbindung einen fork() und FreeBSD unterstützt Shared Memory. Am RAM soll's nicht liegen, aber bedenke die zusätzliche CPU-Belastung, die inetd durch ständiges Starten des Apaches verursacht, gerade auch bei hohen Zugriffszahlen.
hellbringer schrieb:
Muss ich irgendwas beachten, damit nicht der Arbeitsspeicher sinnlos verschwendet wird?
Da achtet ein Unix-System schon selbst drauf.
 
Zurück
Oben