suEXEC macht was es soll... und noch mehr ?!

Apache, Lighttpd, nginx, Cherokee
hever
Posts: 74
Joined: 2003-09-14 15:23
Location: Münster

suEXEC macht was es soll... und noch mehr ?!

Post by hever » 2008-06-19 13:57

Hallo zusammen,

in meiner Konfiguration werden die Logs eines VirtualHosts in ein .logs Unterverzeichnis des DocumentRoots geschrieben.
suEXEC ist für die VirtualHosts aktiviert, da CGI Scripte und PHP unter dem jeweiligen Benutzer ausgeführt werden sollen.
In das .logs Verzeichnis soll nun ein perl Script, welches die Logdateien filtert (selbst geschrieben) und in ein .stat Unterverzeichnis soll die Statistik (AWStats). Diese Scripte sollen nicht von dem Benutzer gelöscht oder geändert werden können. Die Scripte dürfen ruhig gelesen und auch als Benutzer ausgeführt werden (alternative wäre Ausführung als www-data).

Da ich suEXEC benötige, kann ich nicht einfach den Eigentümer des Scripts ändern.

Eine Lösung die ich sehr anstrebe wäre:
Das Verzeichnis .logs oder .stat einem anderen Benutzer zuordnen. Dies funktioniert nicht, weil es ein UID/GID Mismatch Fehler von suEXEC gibt, obwohl das meiner Meinung nach nicht so dokumentiert ist (http://httpd.apache.org/docs/2.2/suexec.html#model) und eigentlich funktionieren sollte. (Das Verzeichnis ist erstmal nicht schreibbar durch andere.) suEXEC macht also mehr als es soll. PHP mit mod_fcgid macht hier keine Probleme (logischerweise).

Eine zweite Lösung wären zentrale Scripte:
Hier kommt jedoch viel Aufwand wie Authentifizierung hinzu. Bei awstats müsste man dem Script irgendwie mitteilen um welches Logverzeichnis es sich handelt, etc. Sicherlich möglich aber viel Aufwendiger und anfälliger für Fehler.

Eine dritte Lösung wäre:
... die Einführung von "logs" und "stat" subdomains in eigenen VirtualHosts mit eigenem Benutzer. Aber mir wäre auch von der Semantik her die Verzeichnisse lieber. Also so will ich es auch nicht.

Ich hoffe das suEXEC Problem lässt sich lösen oder es gibt Möglichkeiten für mich suEXEC zu umgehen und hier hoffe ich auf Hilfe. Denn die Lösung einfach dem Verzeichnis einen anderen Benutzer zu geben wäre mir sehr lieb.

Code: Select all

<VirtualHost *:80>
    ServerName DOMAIN.TLD
    ServerAlias DOMAIN.TLD

    SuexecUserGroup BenutzerUID BenutzerGID
    DocumentRoot /var/www/UID/public/

    ErrorLog "|usr/sbin/rotatelogs /var/www/UID/public//.logs//%Y-%m-%d.error.log 86400 120"
    CustomLog "|usr/sbin/rotatelogs /var/www/UID/public//.logs//%Y-%m-%d.access.log 86400 120" combined

    <Directory /var/www/UID/public//.logs//>
        AuthName "Logs"
        AuthType Basic
        AuthBasicAuthoritative Off
        AuthUserFile /dev/null
        require user UID

        AuthMySQLEnable On
        AuthMySQLDB DB
        AuthMySQLUser USER
        AuthMySQLPassword PASS
    AuthMySQLUserTable TABLE
        AuthMySQLNameField FIELD
        AuthMySQLPasswordField FIELD
        AuthMySQLPwEncryption md5

        Options +Indexes
        IndexOptions NameWidth=*
        IndexOptions +FancyIndexing

        Options +ExecCGI
        AddHandler cgi-script .pl
        AddType text/html .pl
    </Directory>

    <Directory /var/www/UID/public//>
        AddHandler fcgid-script .php .php3 .php4 .php5 .php6
        FCGIWrapper /var/www/cgi-bin/UID/php-fcgi .php
        FCGIWrapper /var/www/cgi-bin/UID/php-fcgi .php3
        FCGIWrapper /var/www/cgi-bin/UID/php-fcgi .php4
        FCGIWrapper /var/www/cgi-bin/UID/php-fcgi .php5
        FCGIWrapper /var/www/cgi-bin/UID/php-fcgi .php6
        Options +ExecCGI

        AllowOverride AuthConfig Indexes FileInfo
        Order Allow,Deny
        Allow from All
    </Directory>
</VirtualHost>


suEXEC Fehler:

Code: Select all

[2008-06-19 11:45:46]: uid: (BenutzerUID/BenutzerUID) gid: (BenutzerGID/BenutzerGID) cmd: perl.pl
[2008-06-19 11:45:46]: target uid/gid (BenutzerUID/BenutzerGID) mismatch with directory (www-data/www-data) or program (BenutzerUID/BenutzerGID)

[Thu Jun 19 13:45:46 2008] [error] [client] suexec policy violation: see suexec log for more details
[Thu Jun 19 13:45:46 2008] [error] [client] Premature end of script headers: perl.pl


Und auch nochmal die Berechtigungen:

Code: Select all

dr-xr-xr-x  3 www-data www-data 4.0K 2008-06-19 11:54 .logs
-rwxr-xr-x  1 BenutzerUID  BenutzerGID  493 2008-06-18 17:06 perl.pl

hever
Posts: 74
Joined: 2003-09-14 15:23
Location: Münster

Re: suEXEC macht was es soll... und noch mehr ?!

Post by hever » 2008-06-21 00:13

Letzendlich habe ich mich für eine Lösung entschieden, in der ich jeweils eine eigene Subdomain anlege und diese über mod_proxy einbinde.

Codeschnipsel:

Code: Select all

    ProxyRequests Off
    ProxyPass /.logs/ http://logs.domain.tld/
    ProxyPassReverse /.logs/ http://logs.domain.tld/


Hier wird das Script durch einen eigenen oder keinen suExec Benutzer ausgeführt und kann trotzdem über das Verzeichnis aufgerufen werden...