PHP en folderrechten
December 26, 2006Onlangs was ik weer eens aan het programmeren geslagen en liep ik tegen een interessant probleem aan: rechten van folders. Wat bleek namelijk? Wanneer ik via PHP een bestand wilde kopieren naar een bepaalde folder lukte dit alleen wanneer de folder helemaal openstond (CHMOD 777).
Op Linux bestandsniveau kun je namelijk 3 groepen gebruikers lees en schrijfrechten geven: de eigenaar, leden van de groep of iedereen. Simpel gezegd: een 7 voor de groep betekend volledige rechten. Dus wanneer je alle rechten wilt hebben voor de eigenaar, de leden van de groep en de rest van de wereld zet je de rechten op 777. Dit is een situatie die niet wenselijk is dus ik heb maar een poging ondernomen om het uit te zoeken.
Wanneer je via FTP het een en ander op de website zet en/of folders aanmaakt gebeurd dit ook onder een bepaalde user en groep, bijvoorbeeld voor beide ftp. Deze user is dan de eigenaar van zowel de bestanden als de folder. Tot zover gaat alles goed, aangezien er maar sprake is van 1 user. Een PHP-script kan zonder problemen een folder benaderen en uitlezen. Echter, bij het aan maken van bestanden treedt er wel een probleem op.
PHP draait namelijk onder een andere user die lid is van een andere groep. Laten we voor het gemak even uitgaan dat de user en de groep beide apache heten. De bestanden die nu in de folder (user: ftp, groep: ftp) worden geplaatst zijn dan eigendom van apache uit de groep apache. Om dit te kunnen doen moet de folder een rechtenset hebben waarbij de laaste bit helemaal openstaat (d.w.z. 7). Voor het gemak roept men dan de folder de rechtenset 777 moet hebben.
Nu kan de gebruiker apache van de groep apache schrijven in een folder waarvan de user ftp van de groep ftp eigenaar is. Helaas kan iedereen nu schrijven in deze folder en dat is niet de bedoeling. Dus ben ik opzoek gegaan naar een oplossing. Het tweede bitje was de rechtenset voor de groep. We hebben in dit voorbeeld twee verschillende groepen dus daar moet wat mee te doen zijn. Wanneer we de folder nu zo aanpassen dat de eigenaar ftp blijft maar de groep veranderd wordt in apache kan ik volstaan met een chmod 775, welke de schrijfrechten voor iedereen al weg zou halen. Deze oplossing is al veel veiliger.
Via PHP kun je met het commando CHGRP de groep veranderen. Na wat testjes bleek dit niet te werken. De oorzaak was een instelling safe_mode die er voorzorgt dat een script uitvoerende user geen veranderingen mag doorvoeren op of in een folder waarvan deze user geen eigenaar is. Het commando wordt uitgevoerd door PHP en is dus van user apache terwijl de folder is van ftp. Het veranderen van de groep van een folder gaat dus niet werken met deze instelling aan. (Overigens werkt dit wel wanneer de safe_mode uitgeschakeld staat, maar dan kun je net zo goed met MKDIR een folder aanmaken als gebruiker apache en groep apache met de juiste rechten (755)).
Voor dit probleem met safe-mode aan zijn diverse oplossingen:
1) je gebruikt PHP om een FTP connectie te maken en zet hiermee de rechten om naar 755 (gesloten) of 777 (helemaal open).
2) je gebruikt mod_suexec van Apache. Enige nadeel is dat PHP als CGI applicatie moet draaien wat niet de snelste oplossing is
3) met PHP kopieer je het script wat je wilt gebruiken zodat de eigenaar anders wordt. Dan moet je nog een heleboel handelingen verrichten voordat je alles op 755 kan laten staan.
Voorlopig doe ik het maar even met de FTP oplossing…















