Skocz do zawartości
omajgat

nginx + php + www-data + chmody + wielu userów :|

Polecane posty

Witam, mam na serwerze nginx+php, wszystko dziala z usera www-data. Lecz z moich obserwacji wynika iz nie jest to bezpieczne. Gdy index.php ma chmod 700, www-data nie ma dostepu. Jezeli ustawie na odczyt dla 'innych'(www-data) czyli 704, plik zostanie wczytany, jednak w tym momencie mozna podejrzec jego zawartosc z innego uzytkownika za pomoca komendy shell_exec. Na serwerze jest kilku uzytkownikow, wiec ich dane nie sa bezpieczne zbytnio poniewaz kazdy moze podejrzec tresc configow itd.

Czy zna Ktos sposob w jaki mozna rozwiazac ten problem?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Zablokuj komende shell_exec, i wszystkie inne, ktore uznasz za stosowne. jak masz kilku userow tylko to np mozesz kazdemu dac oddzielny process php z wlasnym userem. Mozesz dokompilowac fpm do php... opcji jest sporo ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

jak masz kilku userow tylko to np mozesz kazdemu dac oddzielny process php z wlasnym userem

 

To ciekawie brzmi, jednak nic konktretnego nie wyguglowalem na ten temat, moze zna Ktos jakis tajny tutorial? ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Witam, mam na serwerze nginx+php, wszystko dziala z usera www-data. Lecz z moich obserwacji wynika iz nie jest to bezpieczne. Gdy index.php ma chmod 700, www-data nie ma dostepu. Jezeli ustawie na odczyt dla 'innych'(www-data) czyli 704, plik zostanie wczytany, jednak w tym momencie mozna podejrzec jego zawartosc z innego uzytkownika za pomoca komendy shell_exec. Na serwerze jest kilku uzytkownikow, wiec ich dane nie sa bezpieczne zbytnio poniewaz kazdy moze podejrzec tresc configow itd.

Czy zna Ktos sposob w jaki mozna rozwiazac ten problem?

 

To nie ma znaczenia. Ważne jest z jakiego usera bangla php.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

hmm.. moze tak, dla przykładu:

/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u user -g grupa -f "/usr/bin/php5-cgi -c /etc/php5/cgi/dowolne.ini" -C 1 -P /var/run/fastcgi-php.pid 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

hmm.. moze tak, dla przykładu:

/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u user -g grupa -f "/usr/bin/php5-cgi -c /etc/php5/cgi/dowolne.ini" -C 1 -P /var/run/fastcgi-php.pid 

 

Lepiej php-fpm ze zdefiniowanymi poolami per user.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Probowalem zrobic z 3 opisow. Zaden oczywiscie nie zadzialal tak jak powinien...

Przykre troche to jest ;-/

Dziekuje za pomoc.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Sprawa okazala sie bardzo prosta i te wszystkie cyrki z kompilacja roznych wersji php byly zbedne, poniewaz wystarczylo uzyc podanej wyzej komendy.

/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9001 -u foo -g foo -f /usr/bin/php5-cgi -C 1 -P /var/run/fastcgi-foo.pid

Mam jednak 2 pytania...

1. Gdy odpalam powyzsza komenda z -C 1 znaczy to ze ma stworzyc 1 proces. A tworzy 5. Jaka jest tego przyczyna?

2. Po odpaleniu spawn-cgi z prawami usera foo na porcie 9001, ustawiam w configu nginxa oczywiscie odpowiedni port, w tym przypadku 9001. Php wykonuje skrypty tego usera, z prawami tego usera. Ale tylko wtedy, gdy ustawie chmod 704, czyli dam mozliwosc odczytu pliku innym. Przy 700 nie ma dostepu.... Wiec troszke to sie mija z celem, czy tak to ma dzialac?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Pamiętaj ze nginx działa z prawami usera www-data. A jeżeli odwołujesz się do jakichkolwiek plików innych niż *.php nginx serwuje sam treść, z pominięciem procesu PHP, więc .. masz odpowiedź? :>

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Tak, aby pliki *.php działały i było bezpieczne przed innymi użytkownikami, nalezy nadac grupe: user:www-data + chmod 770, aby widzial je nginx ktory pracuje wlasnie z usera www-data.

Więc cel został osiągniety, poniewaz kazdy ma 'swoje' fcgi odpalane z usera. Przy chmodzie 770 drugi user traci dostep...

 

Zrobilem prosty skrypt, moze sie komus przyda (co prawda doskonały nie jest, ale dziala ;p):

#!/bin/bash

PID=/var/set/$USER/fcgi.pid
BIN=/usr/bin/spawn-fcgi
CGI=/usr/bin/php5-cgi
TMP=/tmp/fcgi/${USER}.fcgi.tmp

function start(){
if [ -f ${PID} ]; then
		echo -e "---> Plik ${PID} istnieje. Oznacza to że php-fastCGI jest już wł±czone."
		exit 2
fi
	${BIN} -s ${TMP} -u ${USER} -g ${USER} -f ${CGI} -C 5 -P ${PID}
READPID=`cat /var/set/$USER/fcgi.pid`
echo -e "Fast-CGI zostało odpalone. PID: $READPID."
chmod 0777 ${TMP}
chmod 0700 ${PID}
}

function stop(){
if [ ! -f ${PID} ]; then
		echo -e "---> Plik fcgi.pid nie istnieje, więc php-fastCGI nie jest uruchomione."
		exit 2
fi
READPID=`cat /var/set/$USER/fcgi.pid`
kill -15 $READPID
rm ${PID}
rm ${TMP}
if [ ! -f ${PID} ]; then
		echo -e "---> php-fastCGI zostało pomy¶lnie wył±czone."
fi
}

case $1 in
start)
	start
	;;
stop)
	stop
	;;
restart)
	stop
	sleep 1
	start
	;;
*)
	echo -e "---> Używaj: php-www {start|stop|restart}"
	;;
esac

 

W konfigu usera nginxa:

	location ~ \.php$ {
	fastcgi_pass unix:/tmp/fcgi/user.fcgi.tmp;

Dzieki skryptowi, uzytkownik moze sobie sam odpalac prosta komenda php-www start/stop/restart

 

A jak wyglada kwestia z -C 5? Jzeli podam liczbe ponizej 5, w dalszym ciagu odpala sie 5 procesow, czy jest na to jakas rada?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Strasznie fantazjujesz:

 

  1. nginx działa z prawami www-data
  2. php-fpm tworzy workerów z uidem usera i grupą www-data
  3. chmod 2710 na katalogi: drwx--s---
  4. chmod 640 na pliki: -rw-r-----
  5. chown -R loginusera:www-data htdocs

Polecenia robiące powyższe:

 

cd ~/www/moj.vhost.pl 
find htdocs -type d -exec chmod 2710 {} \;
find htdocs -type f -exec chmod 640 {} \;
chown -R loginusera:www-data htdocs

Koniec.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Zaloguj się, aby skomentować

Będziesz mógł dodać komentarz po zalogowaniu się



Zaloguj się

×