PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Apache 2.2 / suExec / php-fcgi



rep
30.01.08, 09:58
Hallo Leute,

ich schaue gerade wie man die Rechte auf einem LAMP Hostingserver so setzen kann das sie nur das bereitstellen was Sie sollen. Egal wie Restriktiv man das macht, habe ich aktuell ein Problem, das in allen Umgebungen die ich mir ausmalen kann aktuell Probleme gibt.

Ich werde morgen, wenn ich die Daten habe, mal genaustens alles hier posten, aber wollte schon mal euch die Gelegeneheit geben ähnliches hier zu Erzählen.


Ich habe Beispielsweise einen Apache 2.2.6 selbst kompiliert, und PHP rufe ich per Wrapper auf. suExec gibt jedem VHost einen eigenn User und eine Gruppe. Den ProFTPd habe ich so weit, das alle leute die was hochladen die selben rechte und Benutzer/gruppen haben wie der suExec Vhost Benutzer. Und eine umask im Wrapper Skrtip von PHP sorgt dafür das die Rechte auch von Dateien die mittels PHP über fopen oder so angelegt werden korrekt sind.

Doch wenn ich per Formular und file_upload (HTTP Post) einen Daeti hochlade, dann hat diese Rechte aller 0600 und ist somit zwar per PHP zu verarbeiten, aber kann vom Webserver und so von keinen Surfer aufgerufen werden. Das ist momentan das einzige Problem... Jemand schon mal da Probleme gehabt.

Ich will das die PHP Entwickler nicht auf jeden Server irgendwelche anderen Rechte oder gar 0777 setzen müssen. Das soll alles von anfang an stimmen. Und obiges ist aktuell das einzige Problem.

Gruß

marce
30.01.08, 10:16
evtl. wird das Recht durch das Upload-Script so gesetzt?

Roger Wilco
30.01.08, 13:40
$ suexec -V
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="apache"
-D AP_LOG_EXEC="/var/log/apache2/suexec_log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_SUEXEC_UMASK=077 <-- Da muss eine andere Umask zur Compilezeit eingetragen werden.
-D AP_UID_MIN=1000
-D AP_USERDIR_SUFFIX="public_html"

rep
30.01.08, 16:19
Hallo,

das Uploadskript ist nur ein "HTML" Formular, und es ist eine Funktion von PHP die dies dann verarbeitet. Da kann man nichts mit rechten übergeben, und das Manuelle nachträgliche setzen kann nicht die Lösung sein die man wählen sollte.



-D AP_SUEXEC_UMASK=077 <-- Da muss eine andere Umask zur Compilezeit eingetragen werden.
-D AP_UID_MIN=1000
-D AP_USERDIR_SUFFIX="public_html"


Das dachte ich auch, habe hier aber schon alles eingestellt, und egal was... es war immer das selbe ergebnis, es hat sich auch zum Nachteil nix geädnert, es hatte sich gar nix geändert... ich hatte 022 002 000 077 und was weiß ich nicht alles Probiert...

marce
30.01.08, 16:30
Ähm, mit Uploadscript meine ich eben die PHP-Funktion. Und viele dieser PHP-Scripte (so es ein fertiges ist und kein selbst geschriebenes) haben irgendwo eine Konfigdatei, in der man die umask angeben kann.

rep
30.01.08, 18:46
Ich werde morgen mal den 3-5 Zeiler posten mit allen anderen Einstellungen, aber ob man in einer Konfigueration umask oder chmod ändert, es sollte auch ohne Änderung einer Anwendung gehen, oder?

Sonst kann ich ja alle Kunden anschreiben wenn ich sowas einsetze oder ändere. Das kann doch nicht die Lösung sein, sowas NUR in diesem Fall dann im Skript zu machen. umask im Wrapper hilft bei fopen oder so auch, das muss doch dann in diesem Fall auch irgendwie gehen...

Ich weigere mich daran zu glauben hier einen Workaround nutzen zu müssen. :-) Das muss doch "vernünftig" gehen, oder sehe ich das falsch?

rep
02.02.08, 15:44
Hallo Leute,

leider hat es ein bisschen gedauert, ich habe so viel versucht, das ich erstmal wieder den normalen Umstand ans laufen bekommen musste. Eigentlich hatte ich auch mod_fcgid schon am laufen, aber das geht gerade nicht mehr. Aber das Problem war auch das gleiche... hier meine Komponennten.

hier die Details des Apache 2.2.8



Server version: Apache/2.2.8 (Unix)
Server built: Feb 1 2008 12:33:46
Server's Module Magic Number: 20051115:11
Server loaded: APR 1.2.12, APR-Util 1.2.12
Compiled using: APR 1.2.12, APR-Util 1.2.12
Architecture: 32-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/usr/local/httpd/2.2.8-custom"
-D SUEXEC_BIN="/usr/local/httpd/2.2.8-custom/bin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="logs/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd-custom.conf"


Hier die suExec Einstellungen



-D AP_DOC_ROOT="/daten/hosting"
-D AP_GID_MIN=1000
-D AP_HTTPD_USER="www-data"
-D AP_LOG_EXEC="/usr/local/httpd/2.2.8-custom/logs/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_SUEXEC_UMASK=027
-D AP_UID_MIN=1000
-D AP_USERDIR_SUFFIX="html"


Dann habe ich PHP als fcgi compiliert, die genauen Einstellungen bzw. Module sind denke ich egal, deswegen hier mal nur das wichtigste:



"./configure" \
"--prefix=/daten/hosting/tools/php/525" \
"--with-config-file-path=/daten/hosting/tools/php/525/lib" \
"--enable-force-cgi-redirect" \
"--enable-fastcgi" \
"--enable-debug=no" \
"--without-mm" \
"--without-pear" \



Hier dann der Wrapper, für den Kunden 12345678 im Beispiel. Das Verzeichnis des Kunden ist: /daten/hosting/h12345678



#!/bin/sh

PHPRC="/daten/hosting/h12345678/bin/php5"
export PHPRC
umask 0027
exec /daten/hosting/tools/php/525/bin/php-cgi


der Wrapper hat den Benutzer h12345678 und die Gruppe h12345678, im VHost des Kunden wird später folgendes eingestellt.
Das PHP binary selbst ist vom root, kann aber ausgeführt werden vom Kunden. 775 sind hier die Rechte.



SuexecUserGroup h12345678 h12345678
<Directory /daten/hosting/tools/php/525>
Order Allow,Deny
Deny from None
Allow from All
</Directory>
ScriptAlias /php5/ /daten/hosting/h12345678/bin/php5/
Action application/php5-cgi /php5/php-wrapper
AddType application/php5-cgi .php



mittels "chattr -V +i DATEI" wird die Veränderung der Dateien verhindert: Dazu gehören die Wrapper, und das Suexec binary.
Zum testen habe ich aber eh erstmal dies alles weggelassen. Geht sich erst um die Funktion.


Nun ist es möglich, Dateien als Benutzer h12345678 und mit der Gruppe h12345678 ins DocumentRoot zu legen, und die Rechte 0640 zu vergeben.
Wenn dann per fopen oder sonstwie Dateien angelegt werden über PHP, dann haben diese ebenfalls die Rechte 0640 und die identischen Benutzer/Gruppen.
Durch die Hinzufügung des Benutzers www-data in die Gruppe h12345678 kann auch der Webserver die Daten lesen, und den Benutzern ausliefern.

Wie im Thread aber schon besprieben, geht der Upload von Dateien mehr oder weniger schief. In der php.ini ist "upload_tmp_dir" angepasst auf /daten/hosting/h12345678/php/tmp.

Die PHP Datei, bzw. das HTML Formular hier auch kurz.



<html>
<head>
<title>Upload Test</title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="datei">
<input type="submit" value="upload">
</form>
</body>
</html>



PHP "upload.php"



<?php

move_uploaded_file( $_FILES['datei']['tmp_name'], "test.jpg" );

?>



Getestet habe ich auch nur den Upload, also ohne die PHP Funktion "move_uploaded_file", um zu schauen ob die Funktion was "falsch" macht. Aber direkt in dem tmp Verzeichnis sind die rechte schon falsch. Und zwar egal was in der umask von suexec beim compilieren angegeben wurde, oder beim Wrapper von PHP, es ist immer 0600, Das verstehe ich nicht, und sollte meiner Meinungn nach auch nicht so sein.

Vielleicht kann mir dabei ja jemand helfen. Oder mach ich was grundsätzlich falsch. Bei Fragen zu den Details, einfach fragen. Danke!

Gruß
rep

rep
05.02.08, 14:18
Hallo,

kann mir hier keiner helfen, bzw. weiß jemand ob es normale ist das die Dateien bei einem Upload 0600 rechte haben?

Wenn dies so ist, dann würde ich mich echt für den Grund interessieren.

Gruß