webserver user "www-data" absichern?

Apache, Lighttpd, nginx, Cherokee
mischa
Posts: 3
Joined: 2011-02-28 14:32

webserver user "www-data" absichern?

Post by mischa » 2011-02-28 14:33

Ich würde gerne dem user "www-data" unötige rechte entziehen (zb schreibrechte), damit im falle eines einbruchs, der "hacker" keine .php dateien manipulieren kann. meine idee dazu war, dass ich den ordner /var/www/ als eigentümer "root" gebe und als gruppe www-data. diese gruppe bekommt dann ausschließlich lese rechte.

chown -R root:www-data /var/www/
chmod 550 /var/www/test.com/
chmod 440 /var/www/test.com/test.php


nachdem ich etwas danach gegoogelt habe, bin ich auf folgenen eintrag gestoßen, auf dem auch genau das behandelt wird. allerdings wird dort als eigentümer www-data verwendet und als gruppe "root". wäre das nicht fatal, weil der "hacker" als www-data sich in diesem fall mehr rechte (zb schreibrechte) selbst geben könnte? oder habe ich was falsch verstanden? :oops:

danke!

mischa
Posts: 3
Joined: 2011-02-28 14:32

Re: webserver user "www-data" absichern?

Post by mischa » 2011-02-28 15:19

eine eigene partition mit read only würde nicht gehen, weil es wie du schon gesagt hast, es u.a. auch ein tmp odner gibt, der beschrieben werden muss von dem webserver user "www-data".

also fasse ich nochmal zusammen:

rechte richtig vergeben bzw entziehen, als eigentümer "root" und gruppe "www-data".

Code: Select all

chown -R root:www-data /var/www/
chmod 550 /var/www/default/
chmod 550 /var/www/test.com/
chmod 440 /var/www/test.com/test.php
chmod 0770 /var/www/tmp/


lighttpd default (unabhänig vom vhost) ein ordner höher setzen als /var/www/, damit niemand über die server ip in falsche ordner gehen kann, oder auch zb mod_auth umgehen könnte!

Code: Select all

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


außerdem in php selbst das leben schwer machen. z.b. bekommt jede vhost eigene open_basedir pfade.

Code: Select all

open_basedir = /var/www/test.com/:/var/www/tmp/
upload_tmp_dir = /var/www/tmp/
disable_functions = file_get_contents,symlink,debug_backtrace,fsockopen,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,stream_socket_accept,stream_socket_client,stream_socket_get_name,stream_socket_recvfrom,stream_socket_sendto,stream_socket_server,proc_nice,pcntl_getpriority,pcntl_wait,get_headers,headers_list,memory_get_peak_usage,stream_socket_shutdown,escapeshellcmd,url_fopen


viel mehr sicherheit ist wohl nicht möglich, oder?

danke.

mischa
Posts: 3
Joined: 2011-02-28 14:32

Re: webserver user "www-data" absichern?

Post by mischa » 2011-02-28 15:45

jeder vhost müsste dann natürlich ein eigenen tmp ordner bekommen. da hast du natürlich recht. :)

kundenaccounts in dem sinne gibt es nicht, weil ich nur eigene webseiten hoste. ftp server gibt es ebenfalls nicht, weil wenn ich mal eine neuere version einer webseite hochlade, ich einfach winscp verwende. rechte kann ich danach ja problemlos neu setzen. also das wäre kein problem.

bzgl chroot muss ich mir das nochmal genau ansehen, eigentlich bin ich kein fan davon, weil es u.a. beim updaten via apt-get dann schon sehr streßig werden könnte. jedenfalls für mich. :wink:

User avatar
rudelgurke
Posts: 405
Joined: 2008-03-12 05:36

Re: webserver user "www-data" absichern?

Post by rudelgurke » 2011-02-28 16:42

Wenn möglich, unbedingt Chroot - vorher aber den Kernel nachrüsten, sonst bringt dass herzlich wenig.
Und wenn du nur 1 Seite betreibst und deine Anwendungen kennst, kannst du durchaus den Webroot als read-only mounten und dann per mount ein schreibares Verzeichnis drüber legen.

Und vor allem nicht vergessen /etc/apache2 - wenn's denn ein Debian ist - sonst die Verzeichnisse wo die Apache Config abgelegt wird - als root:root und 0400 einzurichten. Geht ja keinen was an was dort steht.

AWOHille
Posts: 271
Joined: 2011-09-05 09:00

Re: webserver user "www-data" absichern?

Post by AWOHille » 2011-09-05 17:59

Ich möchte das Thema noch mal aufgreifen. Ist es sinnvoll, für jede vhost eine eigene open_basedir einzurichten? Wie genau stelle ich das an z.B Domain1.com, Domain2.com usw.?

Gruß Hille
Last edited by AWOHille on 2011-09-05 17:59, edited 1 time in total.

ddm3ve
Moderator
Moderator
Posts: 1177
Joined: 2011-07-04 10:56

Re: webserver user "www-data" absichern?

Post by ddm3ve » 2011-09-05 18:16

Ja, genau so.

z.B.

/var/www/domain1.tld
/var/www/domain2.tld

Wenn Du für jede Domain einen Eigenstädigen Benutzer anlegst, lässt sich das aber Fast CGI Prozesse und FS ACLs gut absichern.
02:32:12 21.12.2012 und dann sind Deine Probleme alle unwichtig.

AWOHille
Posts: 271
Joined: 2011-09-05 09:00

Re: webserver user "www-data" absichern?

Post by AWOHille » 2011-09-05 21:15

Und genauso will es bei mir nicht klappen.

/etc/php5/apache2/php.ini

Code: Select all

open_basedir = /var/www/mein_verzeichnis1

Code: Select all

open_basedir = /var/www/mein_verzeichnis2


Habe ich irgend was übersehen?

Gruß Hille

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

Re: webserver user "www-data" absichern?

Post by Roger Wilco » 2011-09-05 22:36

Du musst schon die korrekte Syntax benutzen, siehe http://de.php.net/manual/en/ini.core.ph ... en-basedir

Darüber hinaus ist es recht sinnlos, die Web-Verzeichnisse für alle Benutzer in deine open_basedir-Pfade aufzunehmen. Dadurch gewinnst du keine Sicherheit.

Um einen Sicherheitsgewinn zu erhalten, musst du pro Benutzer bzw. pro Domain eine eigene open_basedir-Variable setzen, z. B. durch die Apache httpd-Konfiguration (bei Einsatz von mod_php) oder durch eine eigene php.ini.

ddm3ve
Moderator
Moderator
Posts: 1177
Joined: 2011-07-04 10:56

Re: webserver user "www-data" absichern?

Post by ddm3ve » 2011-09-06 03:57

Hi,

bei Fastcgi könnte ein passendes Script wie folgt aus sehen:

Code: Select all

#!/bin/sh

## Absoluter Pfad zur spawn-fcgi binary
SPAWNFCGI="/usr/bin/spawn-fcgi"

## Absoluter Pfad zur PHP binary
FCGIPROGRAM="/srv/www/cgi-bin/php5"

## bind to tcp-port on localhost
FCGISOCKET="/var/sockets/domain.tld/domain.socket"

## uncomment the PHPRC line, if you want to have an extra php.ini for this user
## store your custom php.ini in /var/www/fastcgi/iza/php.ini
## with an custom php.ini you can improve your security
## just set the open_basedir to the users webfolder
## Example: (add this line in you custom php.ini)
## open_basedir = /var/www/vhosts/iza/html
##
PHPRC="/etc/php5/domain"

## 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=300

## 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=<user>
GROUPID=<group>

################## 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 -c $PHPRC" -u $USERID -g $GROUPID -C $PHP_FCGI_CHILDREN

chmod 770 $FCGISOCKET



Bitte Code an Deine Bedürfnisse anpassen!
Ebenfalls die Verzeichnisse für socket und php Konfiguration anlegen, danach kannst Du für jede Domain eigene FCGI Prozesse starten, die unter dem jeweiligen Benutzerkontext laufen. Das ganze erlaubt Dir das ganze für jede Domain sauber ab zu sichern, individuelle php Konfigurationen zu betreiben und die FCGI Prozesse individuell an zu passen.

Beenden tu man das ganze wie folgt:

for i in `ps -ef | grep php5 |grep -v lighttpd | grep -v grep| cut -b 10-14 `; do kill -9 $i; done

Wobei grep -v lighttpd das verzichtbar ist, bei mir laufen noch per lighttpd definiert Default subdomains für alle Webseiten.

Siehe dazu auch:

http://www.rootforum.org/wiki/Aufbau_Webserver
Last edited by ddm3ve on 2011-09-06 11:19, edited 1 time in total.
02:32:12 21.12.2012 und dann sind Deine Probleme alle unwichtig.

AWOHille
Posts: 271
Joined: 2011-09-05 09:00

Re: webserver user "www-data" absichern?

Post by AWOHille » 2011-09-06 10:05

Hallo,

danke erst mal. Ich habe es per httpd-Konfiguration gelöst. Eine Frage noch abschließend, soll in der /etc/php5/apache2/php.ini der Eintrag z.B.:

Code: Select all

open_basedir = /var/www


auskommentiert werden oder kann er stehen bleiben?

Gruß Hille

User avatar
rudelgurke
Posts: 405
Joined: 2008-03-12 05:36

Re: webserver user "www-data" absichern?

Post by rudelgurke » 2011-09-06 10:36

Wenn du FastCGI verwendest und jedem Vhost seine eigene php.ini unterschiebst, haben Einträge in dieser Datei praktisch keine Verwendung.
Persönlich - nur persönlich - setze ich dort "engine = off" falls doch etwas schief läuft und ein Host aus irgendwelchen Gründen doch die Standard ini liest.
Erleichtert die Fehlersuche etwas.