lighttpd Problem: Virtual Host mit falscher UID | uneingeschränktes Ordner Browsing

Apache, Lighttpd, nginx, Cherokee
sonnenrot
Posts: 63
Joined: 2007-10-14 21:41

lighttpd Problem: Virtual Host mit falscher UID | uneingeschränktes Ordner Browsing

Post by sonnenrot » 2007-10-14 22:11

Hallo,

lighttpd läuft mit falscher UID, Virtual Hosts nutzen nicht ihren Document.Root und die php.ini lesbar.

Könntet ihr mich bitte bei der Fehlersuche unterstützen?

System: Debian/etch - lighttpd 1.4.13-4etch4 - php5-cgi 5.2.0-8+etch7

Vorgegangen nach diesem HowTo: http://trac.lighttpd.net/trac/wiki/HowT ... ermissions

Server selbst ist erstmal dank Firewall vom Netz getrennt.

1# /etc/lighttpd/lighttpd.conf
2# Ordnerbaumstruktur mit vollständigen Berechtigungen
3# fastcgi Startupscript

Code: Select all

server.modules              = ( 
            "mod_access",
            "mod_alias",
            "mod_accesslog",
       "mod_fastcgi",
 )

fastcgi.server = ( ".php" => ((
                     "bin-path" => "/usr/bin/php5-cgi",
                     "socket" => "/tmp/php.socket",
                     "max-procs" => 2,
                     "bin-environment" => (
                       "PHP_FCGI_CHILDREN" => "5",
                       "PHP_FCGI_MAX_REQUESTS" => "1000"

                     ),
                     "bin-copy-environment" => (
                       "PATH", "SHELL", "USER"
                     ),
                     "broken-scriptfilename" => "enable"
                 )))

server.document-root       = "/var/www/vhosts/"

server.errorlog            = "/var/log/lighttpd/error.log"

server.tag = "webserver"

static-file.exclude-extensions = ( ".fcgi", ".php", ".rb", "~", ".inc", ".pl" )

index-file.names           = ( "index.php", "index.html",
                               "index.htm", "default.htm" )

accesslog.filename         = "/var/log/lighttpd/access.log"

url.access-deny            = ( "~", ".inc" )


server.port               = 3040

server.pid-file            = "/var/run/lighttpd.pid"

dir-listing.encoding        = "utf-8"
server.dir-listing          = "enable"

server.username            = "lighty"

server.groupname           = "lighty"


$HTTP["remoteip"] =~ "127.0.0.1" {
   alias.url += (
      "/doc/" => "/usr/share/doc/",
      "/images/" => "/usr/share/images/"
   )
   $HTTP["url"] =~ "^/doc/|^/images/" {
      dir-listing.activate = "enable"
   }
}

include_shell "/usr/share/lighttpd/create-mime.assign.pl"

include_shell "/usr/share/lighttpd/include-conf-enabled.pl"


$HTTP["host"] =~ "(^|.)strategiekongress.org$" {
    server.document-root = "/var/www/vhosts/bewegung/html"
    server.errorlog = "/var/www/vhosts/bewegung/logs/error_log"
    accesslog.filename = "/var/www/vhosts/bewegung/logs/access_log"
    fastcgi.server = ( ".php" =>
                       (
                          ( "socket" => "/var/www/fastcgi/bewegung/bewegung.socket",
                            "broken-scriptfilename" => "enable"
                          )
                        )
                      )
}


Verzeichnisstruktur

Code: Select all

|-- [drwxr-xr-x lighty   lighty  ]  fastcgi
|   |-- [drwxr-x--- vh_user  vh_user ]  vh_user
|   |   |-- [srwxrwx--- vh_user  vh_user ]  vh_user.socket
|   |   `-- [-rw-r--r-- root     root    ]  php.ini
|   `-- [drwxr-x--- root     root    ]  startup
|       `-- [-rwxr-x--- root     root    ]  vh_user-startup.sh
`-- [drwxr-xr-x lighty   lighty  ]  vhosts
    `-- [drwxr-x--- vh_user  vh_user ]  vh_user
        |-- [drwxr-x--- vh_user  vh_user ]  html
        |   `-- [-rw-r----- vh_user  vh_user ]  index.php
        `-- [drwxr-x--- lighty   vh_user ]  logs
            |-- [-rw-r--r-- lighty   lighty  ]  access_log
            `-- [-rw-r--r-- lighty   lighty  ]  error_log


bewegungs-startup.sh

Code: Select all

#!/bin/sh

## ABSOLUTE path to the spawn-fcgi binary
SPAWNFCGI="/usr/bin/spawn-fcgi"

## ABSOLUTE path to the PHP binary
FCGIPROGRAM="/usr/bin/php5-cgi"
## bind to tcp-port on localhost
FCGISOCKET="/var/www/fastcgi/vh_host/vh_host.socket"

Muss ich dieses socket file anlegen? für was ist dies da?

Code: Select all

## uncomment the PHPRC line, if you want to have an extra php.ini for this user
## open_basedir = /var/www/vhosts/vh_host/html
##
PHPRC="/var/www/fastcgi/vh_host/"

## number of PHP childs to spawn in addition to the default. Minimum of 2.
## Actual childs = PHP_FCGI_CHILDREN + 1
PHP_FCGI_CHILDREN=5

## number of request server by a single php-process until is will be restarted
PHP_FCGI_MAX_REQUESTS=1000

## IP adresses where PHP should access server connections from
FCGI_WEB_SERVER_ADDRS="127.0.0.1"

# allowed environment variables sperated by spaces
ALLOWED_ENV="PATH USER"

## if this script is run as root switch to the following user
USERID=vh_host
GROUPID=vh_host

################## no config below this line

if test x$PHP_FCGI_CHILDREN = x; then
  PHP_FCGI_CHILDREN=5
fi

export PHP_FCGI_MAX_REQUESTS
export FCGI_WEB_SERVER_ADDRS
export PHPRC

ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS PHPRC"

# copy the allowed environment variables
E=

for i in $ALLOWED_ENV; do
  E="$E $i=$(eval echo "$$i")"
done

# clean environment and set up a new one
env - $E $SPAWNFCGI -s $FCGISOCKET -f $FCGIPROGRAM -u $USERID -g $GROUPID -C $PHP_FCGI_CHILDREN

chmod 770 $FCGISOCKET


Grüße sonnenrot

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

Re: lighttpd Problem: Virtual Host mit falscher UID | uneingeschränktes Ordner Browsing

Post by Joe User » 2007-10-14 22:35

http://www.rootforum.org/wiki/howto/gent ... r/lighttpd oder http://www.rootforum.org/forum/view ... 300#288300 lassen sich mit wenig Nachdenken auf Debian und andere Distributionen portieren...

sonnenrot
Posts: 63
Joined: 2007-10-14 21:41

Re: lighttpd Problem: Virtual Host mit falscher UID | uneingeschränktes Ordner Browsing

Post by sonnenrot » 2007-10-15 09:16

@Joe Danke für den Post
Aus meiner Sicht möchte ich etwas anderes als in den Links von dir, indem ich mehrere Projekte auf einem lighty vollkommen voneinander zu trennen versuche.

Zum Beispiel durch einen eigenen User (vh_user [4000:4000], vh_user2[4001:4001] (nächster Schritt)) um .php Scripte nur mit den Berechtigungen des Users laufen zu lassen.

Da hängt es bereits, weil das ausführen von posix_getuid() posix_getgid() mir die Werte von lighty ausgeben.

Auzug aus /etc/group
lighty:x:3999:
vh_user:x:4000:vh_user,lighty

Grüße

sonnenrot


Ps.: Wenn es funktioniert werde ich als Danke mal ein HowTo verfassen und veröffentlichen.

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

Re: lighttpd Problem: Virtual Host mit falscher UID | uneingeschränktes Ordner Browsing

Post by Joe User » 2007-10-15 11:42

Nachfolgend muss nur "vh_user1" durch den jeweiligen Usernamen ersetzt werden:
Init-Script, bitte selbst an Debian anpassen:

Code: Select all

cat > /etc/init.d/spawn-fcgi-vh_user1 << "EOF"
#! /bin/sh

## ABSOLUTE path to the spawn-fcgi binary
SPAWNFCGI="/usr/bin/spawn-fcgi"

## ABSOLUTE path to the spawn-fcgi pid file
SPAWNFCGI_PID="/var/run/spawn-fcgi-vh_user1.pid"

## ABSOLUTE path to the PHP binary
FCGIPROGRAM="/usr/bin/php-cgi"

## bind to unix-socket on localhost
FCGISOCKET="/var/run/lighttpd/spawn-fcgi-vh_user1.sock"

## bind to tcp-port on localhost
FCGIPORT="1026"

## number of PHP childs to spawn
PHP_FCGI_CHILDREN=4

## number of request server by a single php-process until is will be restarted
PHP_FCGI_MAX_REQUESTS=500

## IP adresses where PHP should access server connections from
FCGI_WEB_SERVER_ADDRS="127.0.0.1"

# allowed environment variables sperated by spaces
ALLOWED_ENV="PATH USER"
# do NOT change line below
ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS"

## if this script is run as root switch to the following user
USERID=vh_user1
GROUPID=vh_user1

case "$1" in
    start)
        echo -n "Starting spawn-fcgi-vh_user1"
        export PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS
        EX="${SPAWNFCGI} -s ${FCGISOCKET} -f ${FCGIPROGRAM} -u ${USERID} -g ${GROUPID} -C ${PHP_FCGI_CHILDREN}"
        unset E
        for i in ${ALLOWED_ENV}; do
                E="${E} ${i}=${!i}"
        done
        env - ${E} ${EX} 2>${SPAWNFCGI_PID}
        FCGI_PPID=`cat ${SPAWNFCGI_PID} | cut -d':' -f4`
        echo ${FCGI_PPID} > ${SPAWNFCGI_PID}
        chmod 0770 ${FCGISOCKET}
        ;;
    stop)
        echo -n "Shutting down spawn-fcgi-vh_user1"
        if ! kill `cat ${SPAWNFCGI_PID}` ; then
                return 1
        fi
        if [ -w ${SPAWNFCGI_PID} ]; then
                rm ${SPAWNFCGI_PID}
        fi
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac
rc_exit
EOF
chmod 0755 /etc/init.d/spawn-fcgi-vh_user1

lighttpd.conf:

Code: Select all

$HTTP["host"] == "www.domain.tld" {
    server.name = "www.domain.tld"
    server.document-root = "/var/www/vh_user1/htdocs"
    fastcgi.server = (
        ".php" => (
            (
                "socket" => "/var/run/lighttpd/spawn-fcgi-vh_user1.sock",
                "broken-scriptfilename" => "enable",
            ),
        ),
    )
}

WICHTIG: Das obige Init-Script MUSS vor Lighttpd gestartet werden!

Warum muss es immer komplizierter sein als nötig?

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: lighttpd Problem: Virtual Host mit falscher UID | uneingeschränktes Ordner Browsing

Post by daemotron » 2007-10-15 13:00

Code: Select all

fastcgi.server = ( ".php" => (( 
                     "bin-path" => "/usr/bin/php5-cgi",
                     "socket" => "/tmp/php.socket",
                     "max-procs" => 2,
                     "bin-environment" => (
                       "PHP_FCGI_CHILDREN" => "5",
                       "PHP_FCGI_MAX_REQUESTS" => "1000"

                     ),
                     "bin-copy-environment" => (
                       "PATH", "SHELL", "USER"
                     ),
                     "broken-scriptfilename" => "enable"
                 )))
Da liegt der Hund begraben - Du veranlasst damit, dass lighttpd php-cgi startet. Dadurch läuft das dann natürlich unter der UID des Webservers... wie Joe User schon geschrieben hat, musst Du FastCGI-Prozesse mit einem geeigneten Shell-Skript vor dem Lighttpd starten und in der lighttpd.conf nur noch auf die Sockets verweisen. Die kannst Du in getrennte Verzeichnisse legen, die den jeweiligen User als Eigentümer und 0700 als Berechtigung haben.

sonnenrot
Posts: 63
Joined: 2007-10-14 21:41

Re: lighttpd Problem: Virtual Host mit falscher UID | uneingeschränktes Ordner Browsing

Post by sonnenrot » 2007-10-15 20:43

@Joe User - danke für dein Script, das von mir verwendete ähnliche script, lass ich als cronjob bei einem Systemstart laden.
Warum es immer kompliziert sein muss, ich dachte mir das erhöht sie Sicherheit meiner Projekte.

@jfreund
Danke für den elementaren Hinweis, damit läuft es. Mit 0700 habe ich es nicht hinbekommen bei mir funktioniert nur 0770.

ein weiteres Problem: das lighty Standard server.document-root="var/www/vhosts/" ermöglicht Ordner Browsing
und /var/www/vhosts/bewegung/html/ ergibt einen 403 Error. Wie könnte ich das abschalten?
Last edited by sonnenrot on 2007-10-15 20:55, edited 1 time in total.

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: lighttpd Problem: Virtual Host mit falscher UID | uneingeschränktes Ordner Browsing

Post by daemotron » 2007-10-15 20:46

Sorry, mein Fehler - Lighty muss ja auch noch an den Socket rankommen. Bei mir sind die Verzeichnisse 0750, und Lighttpd ist Mitglied in den Gruppen der Webuser (also z. B. web01:web01) - denn lighty reicht lesender Zugriff auf den Socket.

sonnenrot
Posts: 63
Joined: 2007-10-14 21:41

Re: lighttpd Problem: Virtual Host mit falscher UID | uneingeschränktes Ordner Browsing

Post by sonnenrot » 2007-10-15 21:00

das ist bei mir auch der Fall, aber es möchte nicht funktionieren.

vS:/var/www/fastcgi/vh_user1# ls -l
insgesamt 4
srwxr-x--- 1 vh_user1 vh_user1 0 2007-10-15 20:26 vh_user1.socket
-rw-r--r-- 1 root root 45 2007-10-14 19:57 php.ini

vs:cat /etc/group
lighty:x:4999:
vh_user1:x:5000:vh_user1,lighty

Das funktioniert, leider nicht. Ich versteh bloss nicht wieso, weil ich es wie von dir angeraten, so bereits eingestellt hab.

Ps.: Ist es eine "schlaue" Idee das HomeUser Verzeichnis von vh_user1 auf /var/www/vhosts/vh_user1 zu setzen, damit eine sftp Anmeldung möglich wird oder ist das ein größeres Sicherheitsrisiko? Sollte ich eine besondere shell einstell?

`-- vh_user1
|-- html
| `-- index.php
`-- logs
|-- access_log
`-- error_log

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

Re: lighttpd Problem: Virtual Host mit falscher UID | uneingeschränktes Ordner Browsing

Post by Joe User » 2007-10-15 21:27

Lies alle meine Configs mal in Ruhe genau durch und vergleiche sie mit Deiner, dann sollte Dir auch der wichtige(!) Unterschied auffallen. Den ganzen /var/www/fastcgi-Quatsch kannst Du Dir mittels PHPRC im Init-Script übrigens komplett sparen.
Den "Standard-Document-Root" kannst Du auf /var/www/localhost/htdocs setzen und das Browsen durch fremde VHosts verhinderst Du mit dem Entziehen der bedenklichen World-Rechte.
Das Homeverzeichnis kannst Du auf /var/www/vhosts/vh_user (0700/vh_user/vh_user) setzen, dann sollte der Docroot aber auf /var/www/vhosts/vh_user/htdocs (0770/vh_user/vh_user) stehen.
Der User lighty muss selbsverständlich in der Gruppe vh_user sein, sonst funktioniert keiner meiner Vorschläge...

sonnenrot
Posts: 63
Joined: 2007-10-14 21:41

Re: lighttpd Problem: Virtual Host mit falscher UID | uneingeschränktes Ordner Browsing

Post by sonnenrot » 2007-10-20 23:08

Den nutzen und den großen Vorteil deines scriptes erkenne ich, aber leider komme ich mit dem Script nicht klar - weil ich mit den Unterschieden zw. den distris nicht vertraut bin.

Deswegen habe ich es auf dem alten Weg realisiert :(.

Habe zu dem Begriff Worldrechte leider nichts gefunden. Welche Rechte muss ich wie beschränken vh_user in seinem home directory steckt und nichts weiter machen darf, als [b]nur[/b] dort zu lesen schreiben und ausführen. (Dateien hochladen scp sftp, rechte ändern)

und werde jetzt mal das Lighty HowTo übersetzen.