archilles scriptworld Forum

» Startseite
  » Support-Foren
      » Häufig gestellte Fragen (FAQ)
          · FAQ: Sicherheit bei Skriptinstallationen

Seite: 1

FAQ: Sicherheit bei Skriptinstallationen Archilles
Version 6 - 15. Mai 2007 21:45:00 CEST

In dieser kleinen FAQ möchte ich auf die Absicherung einer bestehenden oder neuen Skriptinstallation eingehen. Im Prinzip ist dies universell einsetzbar und nicht nur auf meine oder speziell PHP-Skripte. Da ich gleich ins Detail gehe, muß ich einiges Wissen bei dir voraussetzen. Wenn du Fit in Sachen UNIX-Zugriffsrechte bist (Windows lasse ich außen vor, da Massenhoster vornehmlich ein UNIX oder derartiges benutzen), dann ist dies die größte Anforderung. Dabei meine ich das "klassische UGO-Modell" (Owner, Group, Other), anstatt der moderneren POSIX-ACLs. Wobei letztere natürlich in ihren Default-ACE dasselbe machen. Außerdem solltest du wissen wie man ein FTP-Programm im Setzen dieser Rechte bedient oder wie du es auf einer SSH-Shell zu tun hast. Optional bringt du noch einen guten Editor mit und etwas Zeit. Falls dir eines davon fehlt, macht das nichts. Ich habe weitere FAQ von mir verlinkt, wo du Dich mit den Grundlagen vertraut machen kannst. Ansonsten geht es nun ab die Post :-)

HINWEIS: Ich übernehme keine Haftung für eventuelle Schäden, die aus diesen Tipps entstehen könnten! Wohldem habe ich alle Verfahren selber mehrmals ausprobiert und verwende einiges seit Monaten erfolgreich auf diversen Servern. Wenn du etwas nicht verstehst und nur einen Moment daran zweifelst/zögerst, breche bitte ab und frage nach. Diese FAQ bezieht sich auf "shared-hosting", wo viele Kunden auf einem Server liegen.

Zugriffsrechte an den Server anpassen

Man stelle sich folgendes vor: Ein Skript benötigt Vollzugriff auf ein Verzeichnis, um Dateien anlegen zu können. Nun kommt ein Scherzkeks daher, der eventuell Kunde auf demselben Server ist, und löscht alle global schreibbaren Dateien. Je nach Anwendung, ist das für dich nur ärgerlich oder kann sogar Verdienstausfall bedeuten. Die gute Nachricht ist, daß bei vielen Hostern das so pauschal nicht mehr möglich ist. Jedoch verwenden viele noch "großzügige" Einstellungen, die man strikter setzen könnte, ohne deren Funktionalität zu gefährden. Damit sich auch Anfänger damit zurechtfinden, hier Schritt für Schritt, was zu tun ist:

1) Was du als erstes benötigst ist die UID und GID Deines Accounts. Das ist dein Benutzername und zugehörige Gruppe im Betriebssystem des Hosters, wo du deinen Account hast. Der Benutzername wird wohl dem entsprechen, welchen du bei einer FTP-Verbindung eingeben mußt. Die GID ist eine hilfreiche Zusatzinformation. Die kannst du entweder mit einem guten FTP-Programm wie FileZilla anzeigen lassen oder du fragst deinen Hoster kurz. Schreibe dir das nun auf, wenn du beides hast.

2) Ermittele den vollen Pfad zu deinem Account. In der Regel heißt der etwa "/home/kunde123/html". Frage bitte deinen Hoster, wenn er dir das nicht gesagt hat. Alternativ kannst Du auch erstmal bei 3) weitermachen.

3) Jetzt müssen wir PHP etwas ausquetschen. Dafür benötigst Du folgenden Inhalt in einer kleinen Datei:

PHP-Quelltext ('phpinfo.php'):
============================================================

<?php
phpinfo
();
?>

Diese speicherst du unter einem netten Namen mit .php-Endung und kopierst die auf den Server. Rufe diese Datei nun im Browser auf und du solltest eine Seitenlange Liste an PHP-Infos sehen. Keine Angst, du brauchst nicht alles zu lesen oder zu verstehen. Wichtig sind nun nur wenige Zeilen. Sofern du Lust hast, kannst du natürlich auch alles andere lesen.

Ich gehe mal davon aus, daß dein Hoster die folgenden Angaben nicht fälscht. Manche tun dies, viele nicht. Im Zweifelsfall fragst du deinen Support. Ein paar werden eventuell aus Sicherheitsgründen versteckt/geändert, was an sich jedoch nicht verwerflich ist.

Ganz oben steht die PHP-Version. Schreibe dir diese auf. Falls du mal Probleme mit einem Skript haben solltest und der Autor dir nicht helfen kann, bleibt dir noch ein Blick in die PHP-Bugliste übrig, ob mit der Version was nicht stimmt. Diese kann sich mit der Zeit natürlich ändern, wenn der Hoster eine neuere einspielt :-)

Etwas darunter folgt die "Server API". In der Regel siehst du dort "Apache" oder "CGI". Auch das schreibst du dir nun bitte auf. Diese Angabe entscheidet später über die einzustellenden Rechte. Fehlt dieser Wert ist das nicht gut. Dies ist die einzige, die ich zwingend später benötige. Nerve notfalls deinen Hoster danach. Er profitiert auch davon, wenn du dein Account selber etwas strenger konfigurierst.

Ziemlich weit unten folgen die "PHP Variables". Wo wir schonmal dabei sind, können wir auch noch den verwendeten Webserver aufschreiben. Suche im "_SERVER"-Block nach einem "SERVER_SIGNATURE" oder "SERVER_SOFTWARE". In aller Regel wirst du einen "Apache" vorfinden. "DOCUMENT_ROOT" ist dein Wurzelverzeichnis für alle Webdateien.

3) So mit diesen Angaben bewaffnet geht es nun los. Je nachdem, was die "Server API" angezeigt hat, teilt sich nun der Weg, was zu tun ist. Den ersten Block mit Apache solltest du in jedem Fall lesen, weil er auch Allgemeines enthält und du so die Unterschiede besser verstehen solltest.

Apache

In dieser Konfiguration läuft PHP als Modul innerhalb des Webservers. Damit erhält es alle Rechte dieses Servers. Mit der größte Nachteil ist, daß alle vom Webserver/PHP erstellten Dateien mit dessen UID erstellt werden. Die Dateien gehören dem Server und nicht dir. Gegebenfalls kannst du die UID/GID des Webservers bei den PHP-Informationen im Block "apache" unter "User/Group" auslesen. Sie dürften von deinen abweichen. Ist der Server restriktiv konfiguriert, kannst du diese Dateien mit deinem Benutzerkonto (FTP/Shell) nicht mal löschen. Ein PHP-Dateimanager schafft hier, nebenbei, Abhilfe. Fordert ein Skript nun Schreibrechte auf einer Datei/Verzeichnis hast du wenig Chancen. Wenn du die Ordner anlegst, erhalten sie deine UID/GID. Mit nahezu 100%iger Wahrscheinlichkeit sind Webserver und du nicht in derselben Gruppe. Somit bleibt für den Server nur noch "Others" übrig. Und das meint dann wirklich alle anderen, auch andere Kunden auf dem Server. Andersherum, wenn der Webserver die anlegt, sodaß man die Rechte einschränken könnte (was man dann nicht kann, weil sie nicht dir gehören), dann hättest du wieder dasgleiche Dilemma mit dem zum-teufel-nicht-löschen-können.

Hier solltest du die Tore wirklich nur da aufmachen, wo sie benötigt werden. Wenn dein Hoster "safe_mode" oder "open_basedir" benutzt, ist die Chance, daß ein anderer Kunde Blödsinn auf deinem Account treibt, geringer. Manchmal gibt es auch "schlechte" Skripte, die verrückt spielen und immensen Schaden anrichten können. In der PHP-Informationsübersicht kannst du ziemlich weit oben die beiden Parameter prüfen. Die "open_basedir" sollte dein Heimatverzeichnis darstellen. Steht es auf "." ist es auch gut, nur kann das bei einigen Skripten Probleme machen. Das Heimatverzeichnis kann in einigen Fällen der "DOCROOT" entsprechen. Alle öffentlichen Dateien können aber noch in einem eigenen Ordner liegen. Pauschal läßt sich das schwer sagen. Prinzipiell ist dein Heimatverzeichnis das, was du als höchste Ebene im FTP ansteuern kannst; meistens "/home/kunde123".

Meine Empfehlung:

- Dein Heimatverzeichnis auf 755 (rwxr-xr-x)
- Alle PHP-Dateien auf 644 (rw-r--r--)
- Zu schreibende Dateien auf 666 (rw-rw-rw-)
- und solche Verzeichnisse auf 777 (rwxrwxrwx)
- Ansonsten 644 für Dateien und 755 für Verzeichnisse
- Nicht öffentlich lesbare am Ende mit 00

CGI(/FastCGI)

In diesem Fall läuft PHP als CGI-Anwendung über eine Schnittstelle mit dem Webserver. Der Vorteil ist, daß PHP nun unter deiner UID ausgeführt werden kann und seine Daten an den Webserver übergibt, welcher weiterhin unter seinem Konto läuft. Damit gehören nun auch alle PHP-Erstellten Dateien dir und du hast dieselben Rechte wie PHP. Jedoch Vorsicht: Der Webserver ist nun für deine so erstellten Dateien "Others". Andere Kunden oder spinnende Skripte laufen nun auch unter deren UID und sind daher weniger gefährlich. Global schreibbare Dateien können natürlich weiterhin von allen gelöscht werden! "safe_mode" oder "open_basedir" verlieren hier an Bedeutung. In dieser Konfiguration hast du bessere Chancen als vorher. Außer in wenigen Ausnahmefällen, läßt sich das nun sehr resitriktiv angehen. Beachte aber nun, daß PHP dieselben Rechte wie du hast und trotzdem in Deinen Verzeichnissen "wüten" kann. Vorher konnte "es" nur in freigegebene Ordner schreiben.

Meine Empfehlung:

- Dein Heimatverzeichnis auf 755 (rwxr-xr-x)
- Alle PHP-Dateien auf 644 (rw-r--r--)
- Zu schreibende Dateien auch auf 644 (rw-r--r--)
- und solche Verzeichnisse auf 755 (rwxr-xr-x)
- Ansonsten 644 für Dateien und 755 für Verzeichnisse
- Nicht öffentlich lesbare am Ende mit 00

Dieser Text wurde gefaltet. Bitte zum Öffnen anklicken...
Probleme bei "CGI": Wenn die Rechte zu straff sind, dann erhälst du in der Regel einen "Internal Server Error 500". Probiere dann die Rechte in kleinen Portionen zu erhöhen. Überhaupt solltest du erstmal an wenigen Dateien testen, ob es funktioniert. Auf manchen Servern kann es sein, daß PHP Ausführrechte benötigt, was dann mindestens auf 744 hinausläuft. Bei den anderen APIs sollte eine Meldung wie "Access Denied 403" oder "Not Found 404" erscheinen.

Noch ein letzter Tipp bei "CGI": Du kannst dir auch selber die Schreibrechte entziehen bei Skripten und bei 444 respektive 555 bleiben. FTP sollte weiterhin möglich sein; auf jeden Fall ein chmod zurück. Letzteres könnten theoretisch auch bei 511 erfolgreich laufen oder gar 400/500. Hier kommt es an, was der Webserver auch lesen können muß. Das PHP läuft ja hier separat davon und gibt sein Ergebnis an den Server intern ab.

ISAPI/NSAPI

Hmm, diese API ist mir bisher selten untergekommen. Aber da es Module sind, dürfte hier dasselbe gelten wie bei "Apache".

anderes

Tja, dann habe ich so aus dem Stehgreif keine Tipps für dich...

WICHTIG: Es, egal welche API zum Einsatz kommt, genügt ein Sicherheitsloch, um alles zunichte zu machen. Sei es im Webserver, in PHP oder in der benutzten Anwendung. Aber wenig Sicherheit ist besser als gar keine!

Seite: 1

Copyright (c) by "archilles scriptworld Forum", 2009. All rights reserved.
This archive has no free license, but any copyright laws applicable by your local country.