Richtiger Eigentümer beim PHP Dateiupload im Userdir

Apache, Lighttpd, nginx, Cherokee
special_k
Posts: 12
Joined: 2008-12-08 12:19

Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by special_k » 2008-12-08 12:40

Hallo allerseits!
Mein Apache ist z.Z. so eingerichtet, dass jeder Benutzer im public_html-Verzeichnes seines Home-Dirs Webseiten ablegen kann. Die Userdirs werden mittels mod_ldap_userdir ermittelt.
Das Problem ist nun die bekannte verzwickte Sache mit dem Dateieigentümer bei PHP Uploads: Da die Dateien beim Upload immer als www-irgendwas angelegt werden, zählen die nicht mit zum Quota, was natürlich ne nette Lücke ist um schön das Quotalimit zum umgehen... Ich habe schon gelesen, dass man mittel der Kombination PHP-FastCGI-suExec den richtigen Dateieigentümer setzen könnte, aber ich weiß nicht wie ich das mit den Userdirs machen soll, denn die werden ja über LDAP ermittelt... Hat jemand ne Ahnung? Oder wäre es einfach praktikabler nen cronjob laufen zu lassen, der ab und zu mal alle Dateien im public_html "chown'd"?

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by Roger Wilco » 2008-12-08 19:26

special_k wrote:Ich habe schon gelesen, dass man mittel der Kombination PHP-FastCGI-suExec den richtigen Dateieigentümer setzen könnte, aber ich weiß nicht wie ich das mit den Userdirs machen soll, denn die werden ja über LDAP ermittelt...

Ja, mit SuExec, SuPHP, CGIWrap und wie sie alle heißen, kannst du die PHP- (oder allgemein CGI-) Skripte unter dem jeweiligen Benutzer, dem sie gehören, laufen lassen. Dass die Verzeichnisse für mod_userdir dabei aus einem LDAP-Verzeichnis kommen, macht nichts.

special_k
Posts: 12
Joined: 2008-12-08 12:19

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by special_k » 2008-12-08 20:46

Ah, ok, danke für die schnelle Antwort! Ich dachte es ist dafür nötig, für jedes Verzeichnis mittels suExec-Direktiven den jeweiligen User festzulegen.

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by Roger Wilco » 2008-12-08 21:05

special_k wrote:Ah, ok, danke für die schnelle Antwort! Ich dachte es ist dafür nötig, für jedes Verzeichnis mittels suExec-Direktiven den jeweiligen User festzulegen.

Mit SuExec ja, mit SuPHP nein.

EDIT: Ok, der Link von Joe User sagt, dass das auch mit SuExec stressfrei geht. ;)

User avatar
Joe User
Project Manager
Project Manager
Posts: 11138
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by Joe User » 2008-12-08 21:14

special_k wrote:Ich dachte es ist dafür nötig, für jedes Verzeichnis mittels suExec-Direktiven den jeweiligen User festzulegen.

Nicht in Verbindung mit UserDir, siehe http://httpd.apache.org/docs/2.2/suexec.html
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

special_k
Posts: 12
Joined: 2008-12-08 12:19

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by special_k » 2008-12-08 21:46

Alles klar, danke schön! Dann werd ich das mal ausprobieren...

special_k
Posts: 12
Joined: 2008-12-08 12:19

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by special_k » 2008-12-15 12:41

Hallo nochmal!
Ich habe nun einige HowTos im Internet gefunden, aber manche widersprechen sich gegenseitig und viele sind auch nicht mehr ganz aktuell...
Ich bin erstmal diesem Tutorial gefolgt: http://www.howtoforge.com/forums/showthread.php?t=12302 habe aber keine suexec-fcgi selbst kompiliert... Ist das denn auch wirklich nötig? Wenn ich das richtig verstanden habe, wird dort die suExec so angepasst, dass kein File-Owner-Check mehr stattfindet, aber führt das das suExec-Ding nicht ad absurdum? Jedenfalls meckert dementsprechend suexec rum beim Ausführen den Startscripts:

error.log

Code: Select all

[Mon Dec 15 13:29:03 2008] [warn] FastCGI: (dynamic) server "/var/www/php-fastcgi/php-fcgi-starter" (uid 0, gid 0) started (pid 4765)
suexec policy violation: see suexec log for more details


suexec.log

Code: Select all

[2008-12-15 13:29:18]: uid: (root/root) gid: (0/0) cmd: php-fcgi-starter
[2008-12-15 13:29:18]: cannot run as forbidden uid (0/php-fcgi-starter)


Wenn ich dem php-fcgi-starter Skript nen anderen Eigentümer als root gebe, passiert gar nix, außer dass in der error.log irgendwann vermerkt wird:

Code: Select all

[Mon Dec 15 13:34:46 2008] [error] [client 10.0.2.2] FastCGI: comm with (dynamic) server "/var/www/php-fastcgi/php-fcgi-starter" aborted: (first read) idle timeout (30 sec)
[Mon Dec 15 13:34:46 2008] [error] [client 10.0.2.2] FastCGI: incomplete headers (0 bytes) received from server "/var/www/php-fastcgi/php-fcgi-starter"


Soll man also doch suexec selbst kompilieren mit diesem Patch oder gibt es noch eine andere Möglichkeit?

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by Roger Wilco » 2008-12-15 20:33


special_k
Posts: 12
Joined: 2008-12-08 12:19

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by special_k » 2008-12-17 11:28

Hm, ich hatte das ausprobiert, bin damit aber nicht zum Ziel gekommen, daher bin ich wieder auf libapache2-mod-fastcgi umgestiegen. Ich hab mir mal angeschaut wie die Leute von ispCP das gemacht haben und jetzt funktioniert das auch soweit, bis auf die Sache mit den UserDirs :( Ich habe einmal eine Webanwendung die direkt im /var/www Verzeichnis liegt und standardmäßig beim Aufruf der Server-URL angezeigt werden soll und dann natürlich die UserDirs.
In meiner VHost-Konfig sag ich:

Code: Select all

...

<IfModule suexec_module>
  SuexecUserGroup local local
</IfModule>

...

<Directory /home/*[^/*]/public_html>
  Options -ExecCGI Indexes FollowSymLinks MultiViews
  Order allow,deny
  allow from all
</Directory>       


Das PHP-fastcgi-Startskript hat den Eigentümer local:local, die Webanwendung unter /var/www ebenfalls. Wenn ich jetzt ein PHP-Skript aus dem Userdir aufrufe, welches eine neue Datei anlegt, wird diese allerdings halt mit dem Eigentümer local:local angelegt... Ich habe schon probiert die Suexec-Direktive komplett rauszunehmen, in der Hoffnung das es so schlau ist und automatisch den User annimmt, dem die PHP-Datei gehört, aber leider geht das nicht, er versucht dass dann als root auszuführen, was mit Suexec natürlich nicht klappt. Jetzt bin ich schon ziemlich weit gekommen, wäre schade wenn es jetzt daran scheitern würde... Hat jemand ne Idee?

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by Roger Wilco » 2008-12-17 22:21

special_k wrote:Das PHP-fastcgi-Startskript hat den Eigentümer local:local, die Webanwendung unter /var/www ebenfalls. Wenn ich jetzt ein PHP-Skript aus dem Userdir aufrufe, welches eine neue Datei anlegt, wird diese allerdings halt mit dem Eigentümer local:local angelegt...

Anders geht es mit FastCGI auch nicht. Es läuft pro VirtualHost eben nur eine bestimmte Anzahl von PHP-Prozessen unter den jeweils eingestellten Benutzern.
Dein gewünschtes Setup ließe sich mit reinem CGI+SuExec (also kein FastCGI) oder SuPHP umsetzen.

special_k
Posts: 12
Joined: 2008-12-08 12:19

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by special_k » 2008-12-18 14:34

Nunja, ich hatte mich halt daran gehalten:
Joe User wrote:
special_k wrote:Ich dachte es ist dafür nötig, für jedes Verzeichnis mittels suExec-Direktiven den jeweiligen User festzulegen.

Nicht in Verbindung mit UserDir, siehe http://httpd.apache.org/docs/2.2/suexec.html


Und laut Suexec-Manual müsste es ja auch gehen. Ich habe mal versucht, die SuexecUserGroup-Direktive rauszunehmen, aber da nimmt er halt standardmäßig den root-User... :(
Im Endeffekt ist es aber auch irgendwie logisch, schließlich müsste er ja für jeden Nutzer nen eigenen Prozess starten, das ist ja quasi das, was suPHP macht. Ich glaube aber, das ist performancetechnisch wirklich nicht hinnehmbar.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11138
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by Joe User » 2008-12-18 15:20

special_k wrote:Nunja, ich hatte mich halt daran gehalten:
Joe User wrote:
special_k wrote:Ich dachte es ist dafür nötig, für jedes Verzeichnis mittels suExec-Direktiven den jeweiligen User festzulegen.

Nicht in Verbindung mit UserDir, siehe http://httpd.apache.org/docs/2.2/suexec.html


Und laut Suexec-Manual müsste es ja auch gehen. Ich habe mal versucht, die SuexecUserGroup-Direktive rauszunehmen, aber da nimmt er halt standardmäßig den root-User... :(

Nein, er nimmt den Owner des Scripts, siehe obigen Link.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

special_k
Posts: 12
Joined: 2008-12-08 12:19

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by special_k » 2008-12-18 15:54

Macht er eben nicht! :( Wie soll ich das denn konfigurieren? Ich habe in meiner Conf einfach nur stehen:

Code: Select all

NameVirtualHost *:80
<VirtualHost  *:80>
   ServerName projekte.f4.fhtw-berlin.de
                ServerAdmin webmaster@projekte.f4.fhtw-berlin.de

   <IfModule suexec_module>
#           SuexecUserGroup local local
   </IfModule>
   
   <IfModule mod_fastcgi.c>
      ScriptAlias /php-fastcgi/ /var/www/php-fastcgi/
      <Directory "/var/www/php-fastcgi/">
               AllowOverride None
               Options +ExecCGI -MultiViews -Indexes
               Order allow,deny
               Allow from all
           </Directory>
   </IfModule>

        DocumentRoot /var/www

       <Directory /home/*[^/*]/public_html>
         Options +ExecCGI +Indexes +FollowSymLinks +MultiViews
         Order allow,deny
         allow from all
       </Directory> 
</VirtualHost>


SuexecUserGroup ist also bewusst auskommentiert. suexec -V liefert mir:

Code: Select all

 -D AP_DOC_ROOT="/var/www"
 -D AP_GID_MIN=100
 -D AP_HTTPD_USER="www-data"
 -D AP_LOG_EXEC="/var/log/apache2/suexec.log"
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=100
 -D AP_USERDIR_SUFFIX="public_html"

special_k
Posts: 12
Joined: 2008-12-08 12:19

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by special_k » 2008-12-18 16:05

Code: Select all

-rwxrwxrwx 1 s0517910 domainusers 79 2008-12-16 18:24 phpinfo.php


Müsste also als s0517910 ausgeführt werden... (sorry wegen der kryptischen Nummer, ist ne Personen-id)
Der FCGI-Starter-Skript ist als local:local abgelegt, aber ich kann ja nicht für jeden User nen eigenes FCGI-Starter-Skript anlegen.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11138
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by Joe User » 2008-12-18 16:24

Die mod_userdir-Directiven gehören nicht in VHost-Container, sondern in die Mainconfig und müssen wie folgt aussehen:

httpd-2.2.11/docs/conf/extra/httpd-userdir.conf.in

Code: Select all

# Settings for user home directories
#
# Required module: mod_userdir

#
# UserDir: The name of the directory that is appended onto a user's home
# directory if a ~user request is received.  Note that you must also set
# the default access control for these directories, as in the example below.
#
UserDir public_html

#
# Control access to UserDir directories.  The following is an example
# for a site where these directories are restricted to read-only.
#
<Directory "/home/*/public_html">
    AllowOverride FileInfo AuthConfig Limit Indexes
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    <Limit GET POST OPTIONS>
        Order allow,deny
        Allow from all
    </Limit>
    <LimitExcept GET POST OPTIONS>
        Order deny,allow
        Deny from all
    </LimitExcept>
</Directory>
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

special_k
Posts: 12
Joined: 2008-12-08 12:19

Re: Richtiger Eigentümer beim PHP Dateiupload im Userdir

Post by special_k » 2008-12-18 18:05

Ok, sowas stand schon in meiner mods-enabled/userdir.conf :

Code: Select all

<IfModule mod_userdir.c>
  UserDir public_html
  UserDir disabled root

    <Directory /home/*/public_html>
    AllowOverride FileInfo AuthConfig Limit
    Options +ExecCGI MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    </Directory>

</IfModule>


Um ganz sicher zu gehen, habe ich nur die Apache-Standard "000-default" Config unter sites-enabled:

Code: Select all

NameVirtualHost *
<VirtualHost *>
   ServerName localhost
   ServerAdmin webmaster@localhost
   
   DocumentRoot /var/www/
   <Directory />
      Options FollowSymLinks
      AllowOverride None
   </Directory>
   <Directory /var/www/>
      Options Indexes FollowSymLinks MultiViews
      AllowOverride FileInfo
      Order allow,deny
      allow from all
   </Directory>

   ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
   <Directory "/usr/lib/cgi-bin">
      AllowOverride None
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
      Order allow,deny
      Allow from all
   </Directory>

   ErrorLog /var/log/apache2/error.log

   # Possible values include: debug, info, notice, warn, error, crit,
   # alert, emerg.
   LogLevel warn

   CustomLog /var/log/apache2/access.log combined
   ServerSignature On

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>


Die error.log spukt mir dennoch aus, dass das FastCGI-Startskript mit root-Rechten gestartet wurde:

Code: Select all

[Thu Dec 18 18:49:32 2008] [notice] Apache/2.2.3 (Debian) mod_fastcgi/2.4.2 mod_python/3.2.10 Python/2.4.4 mod_ruby/1.2.6 Ruby/1.8.5(2006-08-25) mod_scgi/1.11 mod_ssl/2.2.3 OpenSSL/0.9.8c mod_perl/2.0.2 Perl/v5.8.8 configured -- resuming normal operations
[Thu Dec 18 18:49:42 2008] [warn] FastCGI: (dynamic) server "/var/www/php-fastcgi/php-fcgi-starter" (uid 0, gid 0) started (pid 3194)
suexec policy violation: see suexec log for more details
[Thu Dec 18 18:49:42 2008] [warn] FastCGI: (dynamic) server "/var/www/php-fastcgi/php-fcgi-starter" (pid 3194) terminated by calling exit with status '107'
[Thu Dec 18 18:49:47 2008] [warn] FastCGI: (dynamic) server "/var/www/php-fastcgi/php-fcgi-starter" (uid 0, gid 0) restarted (pid 3195)


In der mods-enabled/fastcgi.conf musste ich als user und group local übergeben, damit sonst schiebt dem suexec gleich einen Riegel vor:

Code: Select all

<IfModule mod_fastcgi.c>
        FastCgiWrapper On
        FastCgiIpcDir /var/lib/apache2/fastcgi

        FastCgiConfig -minProcesses 1
                  -maxProcesses 400
                  -maxClassProcesses 5
                  -multiThreshold 80
                  -killInterval 60
                  -startDelay 5
                # -singleThreshold 100
                # -autoUpdate
                # -pass-header HTTP_AUTHORIZATION

   FastCgiServer /var/www/php-fastcgi/php-fcgi-starter -user local -group local -idle-timeout 300

   #FastCgiServer /var/www/php-fastcgi/php-fcgi-starter -idle-timeout 300

   #
        # PHP5 SUPPORT
        #
        AddHandler php-fastcgi .php .php5

   <Location /php-fastcgi/php-fcgi-starter>
      SetHandler fastcgi-script
      Options +ExecCGI
   </Location>
   
   Action php-fastcgi /php-fastcgi/php-fcgi-starter
   AddType application/x-httpd-php .php .php5
</IfModule>