[PHP] Setup Fragen

Hallo!
Ich habe mir neulich einen Webserver und PHP server gemacht und hab dazu ein paar Fragen. Aber hier erstmal die Server:
-apache_2.2.4-win32-x86-no_ssl
-php-5.2.1 über win32 installer
Meine erste Frage ist, welche Ports ich denn nun öffnen muss, um vom Internet aus auf den Server zu gelangen. Über (localhost) und locale IP funktioniert der Server. Hab schon Probiert, die Ports 80 und 443 TCP/UDP zu öffnen, trotzdem reagiert der Server nicht =(

Meine zweite Frage ist, ob dieser Zugriff auch sicher ist? Ich hab gelesen, man sollte den PHP server mit Installer installiert nicht online stellen, da er Sicherheitsrisiken birgt. Kann ich die jetzt manuell noch ausbessern? Oder habt ihr spezielle Sicherheitstips? Oder muss ich den Server letztendlich nochmal manuell aufsetzen?

Danke im Vorraus
 
naja Grundsätzlich ist ein Apache mit PHP auf Windowsservern keine gute Idee...

Abgesehen davon soltest du dir die php.ini mal durchschauen...
und

-open_basedir (enthällt allerdings eine kleine Sicherheitslücke)
-upload_tmp_dir
-session.save_path
-disable_functions
-cgi_exec_dir

solltest du dir mal genauer anschauen...

php_safe_mode kannste knicken da es einfach Schrott ist^^
Ist in der nächsten php-version auch sehr wahrscheinlich nichtmehr implementiert...

Desweitern musst du Die Apache-Config studieren...
Es ist extremst wichtig dass du diese korrekt einstellst um Sicherheitslücken zu schließen

am Anfang der Config nach "ServerRoot" würde ich erst mal ein
<Directory />
Order Allow,Deny
Deny from All
</Directory>

setzen um egenerell erst mal jeglichen Zugriff zu verbieten...

und ganz wichtig:
Lass den Apache nicht in der root-Gruppe laufen!



Zur Erreichbarkeit:

Such ma in der Config den Eintrag "Listen" diesen Port (TCP) musst du in deienr Firewall Freigeben (standartmäßig 80).
Eventuell steht dieser Eintrag auch in der "ports.conf" im Config-Verzeichnis

443 ist nur für SSL zuständig, was du allerdings nicht installiert hast
 
Original von Extinction
Hab schon Probiert, die Ports 80 und 443 TCP/UDP zu öffnen, trotzdem reagiert der Server nicht =(

Bin mir nicht sicher aber es könnte sein, dass der Apache in der Standarteinstellung nur an lokalen Interfaces (IP-Adressen) lauscht. Müsste dann imo
Code:
Listen *:80
heißen.
Ansonsten könnte man auch noch probieren, die Routerfirewall auszustellen. Allerdings sollte sowas keine dauerhafte Lösung sein ...
 
thx erstmal =)

und ganz wichtig:
Lass den Apache nicht in der root-Gruppe laufen!
Hm... Wo kann man das den einstellen? In der httpd.conf in conf oder meinst du den ganzen PC nicht mit admin rechten starten?

Listen *:80
funktioniert auch nicht. Der server macht zwar keine Probleme beim Neustart, aber was geändert hat sich nicht. Vorher stand es auf Listen 80
Merkwürdig dabei ist: Auch Listen 192.168.2.23:80 funktioniert. (also über lokal)
Listen 84.1x2.x2x.139:80 (also extern, ip zensiert ^^) funktioniert nicht. "the request operation has failed" beim neustart.
Mag scheinbar keine externen IP's...
 
Original von keksinat0r
naja Grundsätzlich ist ein Apache mit PHP auf Windowsservern keine gute Idee...

Was ist denn das nun für ne Antwort?! Warum sollte ein Apache auf einer Windows Machine keine gute Idee sein? Und jetzt komm mir bitte nicht mit Sicherheit: Ein schlecht konfiguriertes Linux-System macht genauso wenig Sinn...

Wie hast du denn versucht auf den Server zuzugreifen? Übers eigene Netzwerk ( http://Netzwerk-IP:80/index.html ) oder z.b. über DynDNS ( http://deine_id.no-ip.org:80 )?
Eine andere Fehlerquelle könnte sein, dass der Port schon belegt ist. Also einfach mal 81 statt 80 nutzen und darauf zugreiffen. Ein beliebtes Programm ist z.b. Miranda ( Client für ICQ, MSN,... )

Zur Sicherheit: Wie keksinat0r schon genannt hat: Passe die PHP.ini und andere Configdateien an, schränke den Benutzer auf ein bestimmtes Verzeichnis ein ( der open_basedir-Bug sollte meines Wissens bereits behoben sein... ),.. Gegen SQL Injections, XSS-Attacken, usw kannst du dich auch mittels mod_secure schützen. Du musst dich damit auseinandersetzen, damit dein System am Ende auch wirklich sicher ist. Wenn man hier dir einfach nur irgendwelche Einträge nennt wird dein System nach wenigen Monaten wieder zu den unsicheren gehören ;)
 
Es ist nunmal eine Tatsache dass Windowsserver idR unsicherer sind als UNIX-Server...
Und wenn man unter UNIX seine Benutzer und Rechte nicht angemessen verteilt ist man selbst schuld...

Und nein:
Die Basedir-Lücke ist in PHP5 noch nicht volständig behoben, es wurde lediglich erschwert ihn auszunutzen.
Dieser Bug hängt nämlich direkt mit der Art und Weise wie PHP mit Dateien umgeht zusammen...

Erst in PHP6 wird dieser Bug voraussichtlich vollständig behoben sein... (was ja nichtmehr so lange dauern wird :))


zum Thema Apache-User:
Das war ein Denkfehler Meinerseits...
Wie man unter Windows entsprechende Benutzer anlegt und den Apache diese nutzen lässt weis ich nicht...
Ich bin bei Servern eben UNIX gewohnt...
Dort einfach den Benutzer anlegen und dann in der apache.conf / httpd.conf
User benutzer
Group gruppe
eintragen...
 
Ich will mir keine Windows-serverfestung/Hochsicherheitstrakt machen, sondern nur eine ausreichende Sicherheit haben. Das ist sicher auch unter windows möglich und mehr will ich auch gar nicht :)

@fetzer
Hast du so ne Wahrsagerkugel neben dem PC stehen? :rolleyes: Hab tatsächlich Miranda mit ICQ und MSN am laufen. Hab mal auf Port 81 gewechselt, bzw miranda ausgemacht. Hat aber auch keinen Erfolg gehabt. >.>
Wahrscheinlich muss man irgendwo einstellen, dass apache auch auf Zugriffe durch die externe IP reagieren soll. Oder das in der Host Datei von Windows umstellen.

Und ich hab nicht über DynDNS sondern über die tatsächliche externe IP verbunden.

Ich hab mal wegen der Gruppe nachgeguckt, da steht:
Syntax: User Unix-User-ID
Wie mach ich das nun in windows?
Das Ganze nach Schema
User benutzer
Group gruppe
in die Config zu schreiben mag apache nicht.
Btw glaube ich apache is standartmäßig als user "nobody" eingelogt und hat kaum Rechte.

Nur mal rein nach der Logik: Haben nicht alle PC's hinter dem router die gleiche externe IP?
 
Wie ich bereits oben beschrieben habe weis ich nicht ob du unter Windows überhaupt ein solches Gruppensystem anlegen kannst.
Meines wissens nach aber eben nicht, und das ist eines der Probleme wenn du Windows-Server benutzt...
Wie es bei der Server-Version aussieht weis ich auch nicht, da ich diese noch nicht benutzt habe...

Wie dem auch sei, versuch ma in deinem Router den 80/81 er Port auf deinen Server zu leiten. -> Portforwarding.
 
Original von keksinat0r
Es ist nunmal eine Tatsache dass Windowsserver idR unsicherer sind als UNIX-Server...
Und wenn man unter UNIX seine Benutzer und Rechte nicht angemessen verteilt ist man selbst schuld...

Und wer mit Windows nicht angemessen umgehen kann auch :D
Aber zu behaupten, dass Windows einfach unsicherer ist als Linux, ist einfach nur naiv. Das ist eine Behauptung, aufgestellt von Linux-Beführwortern, genauso wie von MS die These aufgestellt wird, dass Windows letztendlich doch günstiger sei.
Aber ich glaube, das gehört in einen anderen Thread und nicht hier dazwischen ;)

Hast du so ne Wahrsagerkugel neben dem PC stehen?
Nein, eine Kaffeetasse mit Kaffeesatz drin reicht mir inzwischen auch schon :D
Egal. Kannst du nichtmal deine httpd.conf posten ( bitte über http://phpfi.com/ verlinken o.ä. )?

Nur mal rein nach der Logik: Haben nicht alle PC's hinter dem router die gleiche externe IP?

Dafür ist das Portforwarding da: Kommt ein Paket auf diesem Port an, so wird es an den PC mit der angegebenen Andresse weitergereicht. Dafür sind Router schliesslich da: Sie regeln den Datenverkehr zwischen den PCs im Netzwerk und dem Internet ;)

Hier mal noch das Tutorial vom BSI zu einer Apache-Installation:
http://www.bsi.bund.de/gshb/deutsch/m/m04193.htm
 
Ich habe mir jetzt das Kapitel "Sichere Installation unter Windows" durchgelesen, aber dort steht auch nicht drinn, wie ich Apache denn jetzt den Benutzer "apache" oder die Usergruppe zuweise.
Hier die Config Datei:
http://phpfi.com/220446

Hier ein Bild vom router Setup:


Die Erreichbarkeit soll aber erstmal Priorität haben. Mir nützt kein sicherer Sevrer, wenn eh niemand ihn erreichen kann...

Edit:
:D Es funktioniert. Das mit den Ports läuft, es hat nich funktioniert, weil ich von meinem eigenen PC aus auf die externe IP zugegriffen hab.
Jetzt hab ich mal den Port 81 geöffnet und nem Freund über ICQ meine IP gegeben. Der konnte auf meine html zugreifen. :D

Nun also wieder zum User Problem.
 
Original von Extinction
Ich habe mir jetzt das Kapitel "Sichere Installation unter Windows" durchgelesen, aber dort steht auch nicht drinn, wie ich Apache denn jetzt den Benutzer "apache" oder die Usergruppe zuweise.
Hier die Config Datei:
http://phpfi.com/220446
Wie gesagt, unter Windows geht das glaubich garnicht...
Da hilft nur das starten des Service mit einem eingeschränkten Benutzerkonto, wobei man da immer noch genug Unfug anstellen kann... (soviel zum Thema Sicherheit)


Original von Extinction
Die Erreichbarkeit soll aber erstmal Priorität haben. Mir nützt kein sicherer Sevrer, wenn eh niemand ihn erreichen kann...
Und genau das ist ein möglicherweise sehr fataler Fehler...
Wenn dein Server nicht entsprechend abgesichert ist kann man theoretisch von außen dein gesamtes Netz lahmlegen...
PHP ist eine sehr "mächtige" Scriptsprache mit der man auch jede Menge Unfug anstellen kann...
(Unter Windowsservern die nicht entsprechend abgesichert sind kann man zum Beispiel ganz einfach diverse Dateien auf deiner Platte bearbeiten, so zum Beispiel auch Systemrelevante Dateien wie zB deine boot.ini, diverse Systembibliotheken, und und und... - noch mehr zum Thema Sicehrheit :) )


ps: poste auch mal deine php.ini.
 
Bei <a href="http://phpfi.com/220446" target="_blank">http://phpfi.com/ [/url]konnte ich die ini nicht hochladen. Ist zu groß.
Also hab ich ne .txt draus gemacht und sie hier im Forum hochgeladen.

Also als Admin einen Apache/PHP Server starten ist keine gute Idee? Man wird die Rechte doch wohl irgendwie beschränken können?!
 
Naja, die ganze php.ini ist auch nicht interessant. Entscheidend ist, dass du möglichst spartanisch bleibst. Wichtig sind die Direktiven vom Kaliber register_globals, allow_url_fopen, magic_quotes_gpc und was man sonst noch so an Hinweisen im Abschnitt zur Sicherheit von PHP in der Doku findet.

Ansonsten sollte man einfach sicher programmieren: alle Variablen initialisieren und Benutzereingaben grundsätzlich prüfen und ggf. escapen. Damit ist mehr geholfen als mit ein paar PHP-Einstellungen.
 
Inwiefern man unter Windows Benutzer zB in Verzeichnisse "ensperren" kann weis ich nicht, allerdings kannst du PHP-Scripte auf bestimmte Verzeichnisse einschränken.

Die wichtigsten Funktionen hierfür sind:
open_basedir und disable_functions

mit open_basedir legst du fest wo PHP-Scripte ausgeführt werden dürfen, idR ist dies das Site_Root, also zB C:\website\user1\ so können Scripte in diesem Verzeichnis User1 nur in eben diesem Verzeichnis arbeiten und auf nichts außerhalb des Verzeichnisses zugreifen (abgesehen von dem Bug).
Allerdings benötigt PHP auch seine lib's (Programm Bibliotheken).
Wo die bei XAMPP (ich denke mal du benutzt dies) abgelegt sind weis ich nicht, aber Google dafür bestimmt.
Also musst du zusätzlich noch dieses Verzeichniss freigeben.
also zum Beispiel:

open_basedir = C:\webserver\user1\;lib-Verzeichnis\

zu beachten sind die \ am Ende, somit hat der User nur Zugriff auf Ordner Dateien innerhalb dieses Ordners, nicht aber auf den Ordner selbst...

ähnlich verhällt es sich mit cgi_exec_dir, nur eben für CGI-Scripte -> Google

mit disable_functions kannst du bestimmte PHP-Funktionen Deaktivieren, sodass selbst wenn jemand in deinen PHP-Scripten eine Lücke findet durch die er Scripte auf dem Server ausführen könnte nicht allzu großen Schaden anrichten kann...
ich hab auf meinem Webserver zb folgende Einstellung:

disable_functions = symlink,debug_backtrace,pfsockopen,proc_open,proc_nice,proc_terminate,proc_close,proc_get_status,shell_exec,exec,passthru,system,popen,highlight_file,diskfreespace,disk_free_space,disk_total_space,show_source,php_uname,ini_alter,ini_restore,ini_set,getrusage,get_current_user,set_time_limit,getmyuid,getmypid,dl,leak

Das allerdings muss jeder für sich selbst entscheiden welche Funktionen hier deaktiviert werden...

session.save_path, upload_tmp_dir und sind idR nur für den Multi-Userbetrieb wichtig.

register_globals, magic_quotes_gpc und co sind in PHP5 standartmäßig schon deaktiviert und das sollte möglichst auch so bleiben ;)

schau dir am besten mal die Einstellugnen von Funpic an:
http://phpinfo.funpic.de
Und schau nach was die so eingestellt haben.
phpinfo.* ist übrigens eine bereits mehr oder weniger zum Standard gewordene Subdomain um eben diese Informationen zu bekommen, sollte also auch bei diversen anderen Hosts funktionieren ;)

--

Dann muss ich nochmals sagen, studier wirklich die Configs und lern PHP, CGI und den Apache mit allem drum und dran erst mal richtig kennen um eines Tages keine bösen Überraschungen zu bekommen...
Vor kurzem bekam ich auf meinem Server eine Hackerattacke ab... ~125MB Logfile ist daraus geworden, mehr aber nicht, da mein Server entsprechend abgesichert ist :)

PS: ich sollte so spät keine Beiträge im HaBo mehr schreiben... ich muss alle meine Posts mindestens 3 mal wegen Schreibfehlern editieren... X(
 
Also register_globals kenn ich schon. Is auch auf off, habe mir vorgenommen alles mit $_POST, $_GET und $_REQUEST zu machen.
Bei disable_functions muss ich mich wohl mal durch die ganzen Funktionen wühlen. (vorher hatte ich nichts deaktiviert O.o)
Ich hab bei der Gelegenheit auf disable_classes gesehen. Gibt es dafür auch empfehlenswerte Einstellungen, oder können alle Klassen bleiben?

In den Rest muss ich mich auch nochmal einlesen.
Danke für die Hilfe =)
 
Die Klassen kannst du eigentlich alle zulassen...
Du kannst beim Apache übrigens für jeden vHost eine "eigene config" anlegen...

<VirtualHost *>
php_admin_value option value
</VirtualHost>

also zB php_admin_value open_basedir C:\bla

Diese Eisntellungen gelten dann nur für den aktuell aufgerufenen vHost...
 
Zurück
Oben