[Apache + PHP] safe_mode en beveiliging

Pagina: 1
Acties:

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 07-05 12:51
Ik zit met een klein dilemma op m'n Linux server waar Apache 2.0.48 en PHP 4.3.4 op draaien. Ik heb voor PHP de safe_mode op 'off' staan, want ik wil dat m'n users gewoon gebruik kunnen maken van exec(), system(), etc. voor projecten als phpSysInfo. Nu stuit ik op het volgende probleem:

PHP wordt door Apache uitgevoerd, met dezelfde rechten (apache/apache). PHP krijgt hierdoor de mogelijkheid om in de directories van andere users te kijken, en bestanden te lezen (want Apache moet dit natuurlijk ook kunnen). Stel, een user heeft de volgende dir:

/home/sites/userblaat

Dan kan hij met een dergelijk commando de dir van een andere user bekijken en de bestanden die daarin staan lezen:

PHP:
1
echo exec("ls -al /home/sites/andere_user");


En dit is natuurlijk niet de bedoeling, want zo kunnen er wachtwoorden voor MySQL e.d. achterhaald worden :)

Hoe kan ik ervoor zorgen dat dit beveiligd wordt, zónder safe_mode op 'on' te zetten?

Dit staat niet in P&W omdat het niets met scripting te maken heeft, het gaat me puur om apache, php en de rechten die ze hebben.

  • Tomsworld
  • Registratie: Maart 2001
  • Niet online

Tomsworld

officieel ele fan :*

Bepaalde functies disablen en open basedirs per vhost instellen, zou al heel wat moeten opleveren.

"De kans dat een snee brood op een nieuw tapijt valt met de beboterde zijde onderaan, is recht evenredig met de prijs van het tapijt"


  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 07-05 12:51
Tomsworld schreef op 31 januari 2004 @ 15:24:
Bepaalde functies disablen en open basedirs per vhost instellen, zou al heel wat moeten opleveren.
Zou je wat concreter kunnen zijn? Want ik wil best bepaalde functies disablen, maar of je het over PHP, Apache of gewoon de CLI hebt weet ik niet. Ook ben ik bang dat ik dan weer bij safe_mode uitkom (die functies als exec() uitschakelt).

Open basedirs per vhost? Bedoel je een soort van chroot?

  • Tomsworld
  • Registratie: Maart 2001
  • Niet online

Tomsworld

officieel ele fan :*

JeRa schreef op 31 januari 2004 @ 15:40:
[...]

Zou je wat concreter kunnen zijn? Want ik wil best bepaalde functies disablen, maar of je het over PHP, Apache of gewoon de CLI hebt weet ik niet. Ook ben ik bang dat ik dan weer bij safe_mode uitkom (die functies als exec() uitschakelt).

Open basedirs per vhost? Bedoel je een soort van chroot?
Begin eens te zoeken dan kom je hier uit: http://nl.php.net/features.safe-mode en lees dat een paar keer grondig door.

En dan kan je idd zaken bepalen global voor heel je php install of per vhost.

"De kans dat een snee brood op een nieuw tapijt valt met de beboterde zijde onderaan, is recht evenredig met de prijs van het tapijt"


  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 07-05 12:51
Tomsworld schreef op 31 januari 2004 @ 17:15:
[...]


Begin eens te zoeken dan kom je hier uit: http://nl.php.net/features.safe-mode en lees dat een paar keer grondig door.

En dan kan je idd zaken bepalen global voor heel je php install of per vhost.
Bedankt :)

Er is in de safemode wel de mogelijkheid om een root aan te geven waar de bestanden boven niet mogen worden geopend, maar dit geldt alleen voor de functies van PHP zelf. Het komt er dus wel weer op neer dat ik de shellfuncties moet gaan disablen, terwijl het eigenlijk makkelijk zou kunnen worden opgelost door PHP via Apache te starten met de rechten van de user waarvan de bestanden worden opgevraagd. Is zoiets mogelijk?

  • Tomsworld
  • Registratie: Maart 2001
  • Niet online

Tomsworld

officieel ele fan :*

JeRa schreef op 31 januari 2004 @ 23:07:
[...]


Bedankt :)

Er is in de safemode wel de mogelijkheid om een root aan te geven waar de bestanden boven niet mogen worden geopend, maar dit geldt alleen voor de functies van PHP zelf. Het komt er dus wel weer op neer dat ik de shellfuncties moet gaan disablen, terwijl het eigenlijk makkelijk zou kunnen worden opgelost door PHP via Apache te starten met de rechten van de user waarvan de bestanden worden opgevraagd. Is zoiets mogelijk?
LEES nu toch es ook in gewone mode is dit mogelijk.

en ja zoek es he bv www.suphp.org

"De kans dat een snee brood op een nieuw tapijt valt met de beboterde zijde onderaan, is recht evenredig met de prijs van het tapijt"


  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 07-05 12:51
Ik heb inmiddels PHP 4.3.4 als CGI gecompileerd en SuPHP als module. Het werkt perfect, PHP-bestanden worden door PHP uitgevoerd met de rechten van de eigenaar van het betreffende bestand. Nu zijn de problemen nog niet opgelost. Ik heb dit:

Apache webserver (user: apache; group: apache)
Webgebruiker 1 (user: web1; group: users) /home/web1
Webgebruiker 2 (user: web2; group: users) /home/web2
Webgebruiker 3 (user: web3; group: users) /home/web3

Omdat Apache de directories moet kunnen benaderen zijn de /home-directories ge'chmod naar 755. Hierdoor wordt het voor de webgebruikers alsnog mogelijk om de bestanden in de andere directories te lezen. Hoe kan ik dit voorkomen, wat moet ik met de Apache-config of de SuPHP-config doen om gebruikers er van te weerhouden andere directories te bekijken? Ik ben een redelijke n00b als het gaat om het rechtensysteem in Linux, dus de vraag kan wat dom overkomen :/

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 30-08 17:59

Gerco

Professional Newbie

De 'x' uitzetten op die directories, dan is het niet meer mogelijk bestanden te listen. Het blijft mogelijk om bestanden te benaderen als je de naam ervan weet.

Een andere manier is, aangezien PHP uitgevoerd wordt als de user waarvan het is, om de rechten van web1 t/m 3 zo in te stellen dat ze elkaars homedirs niet inkunnen. Dit kun je regelen met groepen (voor elke webuser een groep, waar alleen hijzelf EN apache inzit. Files chmodden naar 750), maar een betere manier is met ACLs (vind ik).

Meer informatie over ACLs staat hier: http://acl.bestbits.at, deze zitten vanaf Linux 2.5 standaard in de kernel, maar aangezien je waarschijnlijk nog 2.4.x draait, zul je dan deze patch moeten installeren.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • MikeN
  • Registratie: April 2001
  • Laatst online: 11:07
Of gewoon de group van de homedir op de apache group instellen en vervolgens chmodden naar 710. Ben je ook klaar, zonder extra groepen en dat gedoe :)

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 07-05 12:51
Gerco schreef op 09 februari 2004 @ 12:44:
De 'x' uitzetten op die directories, dan is het niet meer mogelijk bestanden te listen. Het blijft mogelijk om bestanden te benaderen als je de naam ervan weet.
Ik wil dus niet dat dat kan.
Een andere manier is, aangezien PHP uitgevoerd wordt als de user waarvan het is, om de rechten van web1 t/m 3 zo in te stellen dat ze elkaars homedirs niet inkunnen. Dit kun je regelen met groepen (voor elke webuser een groep, waar alleen hijzelf EN apache inzit. Files chmodden naar 750)
Zo heb ik het momenteel opgelost, werkt perfect. Het probleem hiermee is dat ik voor elke webaccount een aparte groep moet maken, dit is nogal lastig bij te houden en het staat niet erg netjes in /etc/group.
MikeN schreef op 09 februari 2004 @ 13:31:
Of gewoon de group van de homedir op de apache group instellen en vervolgens chmodden naar 710. Ben je ook klaar, zonder extra groepen en dat gedoe :)
Als ik dit doe kunnen de bestanden nog wel gelezen worden, maar de inhoud van de directories niet meer. De oplossing klinkt belovend (ik hoef dan immers niet voor elke user een aparte groep aan te maken, werkt wel wat logischer imho) maar ik heb het niet voor elkaar kunnen krijgen. Wat bedoel je precies?

  • MikeN
  • Registratie: April 2001
  • Laatst online: 11:07
JeRa schreef op 10 februari 2004 @ 12:29:
[...]

Als ik dit doe kunnen de bestanden nog wel gelezen worden, maar de inhoud van de directories niet meer. De oplossing klinkt belovend (ik hoef dan immers niet voor elke user een aparte groep aan te maken, werkt wel wat logischer imho) maar ik heb het niet voor elkaar kunnen krijgen. Wat bedoel je precies?
Ik weet niet precies hoe jij de zooi in elkaar hebt zitten, maar ik heb het als volgt:

chown username.nogroup /www/username
chmod 710 /www/username
chmod 755 /www/username/public_html

En dan staan in public_html de docs :)
Apache kan dus in /www/username komen en mag public_html gewoon volledig lezen en andere mensen kunnen nergens bij.
Pagina: 1