Jira ICT wint MKB Beste Choice Award - Magento Workshops 2010
Jan
05

Joomla! en PHP Safe Mode

Hosting providers die in hun omgeving PHP aanbieden hebben er van oudsher altijd voor gekozen om PHP Safe Mode in te schakelen. Dit kan veel problemen opleveren en met het gebruik van Joomla! wordt Safe Mode juist afgeraden. Wat is dat PHP Safe Mode nu eigenlijk?

Waarom PHP Safe Mode?

PHP Safe Mode is een poging om het draaien van meerdere PHP-gebaseerde applicaties op dezelfde server veiliger te maken. Een PHP-applicatie wordt altijd uitgevoerd door een webserver programma (bijvoorbeeld Apache) en het kan handig zijn om meerdere PHP-applicaties met dezelfde webserver te draaien om resources te besparen. Dat deze resource besparing nuttig is, is terug te zien in het feit dat er tal van hosting providers zijn die websites voor een erg lage prijs aanbieden.

In vrijwel alle gevallen gaat het hierbij om "shared hosting" omgevingen, waarbij een enkele webserver soms wel honderden websites (lees: PHP-applicaties) tergelijkertijd serveert. Het grote nadeel van "shared hosting" is security. Zodra een enkele website is gehackt, lopen alle andere websites gevaar.

PHP Safe Mode introduceert een aantal beperkingen in het draaien van PHP scripts vanuit de filosofie "des te minder mogelijkheden, des te veiliger". De belangrijkste beperking is dat een script van UNIX-user X niet aangeroepen kan worden door een script van UNIX-user Y. Een verschil in eigenaar ("ownership") wordt simpelweg niet toegestaan.

De omgekeerde wereld

Om een Joomla! website goed te laten functioneren, is het nodig dat alle bestanden en folders schrijfbaar zijn voor Joomla! (dus voor PHP, dus voor de webserver). Wordt er gekozen voor PHP Safe Mode, dan is het dus zaak dat alle (!) bestanden dezelfde eigenaar hebben maar dat sommige bestanden beschrijfbaar zijn voor de webserver.

Er wordt hierbij meestal gekozen om de eigenaar van alle Joomla! bestanden gelijk te stellen aan de gebruiker ("apache") waarmee de webserver (Apache) draait. Hierna wordt bepaald welke bestanden en folders schrijfbaar moet zijn en welke niet. Zo zal de folder "libraries" read-only gemaakt kunnen worden, terwijl "components" of "tmp" wel schrijfbaar zijn.

Als u dan denkt dat dat veilig is, dan moet u even in de PHP manual kijken. Er zijn tal van mogelijkheden om een bestand dat geen schrijfpermissies bevat, tijdelijk wel te voorzien van die permissies (de PHP-variant van "chmod"). De voorwaarde is dan natuurlijk wel dat de webserver de eigenaar is van die bestanden.

De enige manier om permanent te voorkomen dat een bepaald bestand schrijfbaar is voor de webserver, is door dit bestand een andere eigenaar mee te geven. En dat werkt nu juist niet vanwege Safe Mode: Een verschil in eigenaar wordt niet toegestaan.

Mode 666 is evil

PHP Safe Mode voorkomt dus juist dat het ideale plaatje qua permissies doorgevoerd kan worden. Er zijn gelukkig nog andere varianten te verzinnen: In plaats van de eigenaar in te stellen op de webserver ("apache"), kan er ook gekozen worden voor een andere UNIX user (bijvoorbeeld "appeltje"). Het enige probleem is dat de webserver als nog de juiste bestanden en folders moet kunnen beschrijven. Dit wordt dan bereikt via group-writable of world-writable permissies.

Nu zijn er nog al wat puristische systeembeheerders die in een boek hebben gelezen dat modus 666 (ofwel 777 ofwel "world-wide writable") een gevaarlijk kwaad is. Dat klopt misschien wel, maar deze systeembeheerders besteden vele uren aan het rechtzetten van de juiste permissies, terwijl zaken als Remote File Inclusion en SQL Injection aan ze voorbij gaan.

(Ik ben zelf verantwoordelijkheid voor het onderhoud van diverse webservers, waarbij gekozen is voor modus 666 (of iedergeval een vergelijkbare variant waarbij de webserver alles mag beschrijven) en neem mij voor mijn woord aan: Afgelopen 3 jaar is geen van de 300 websites gehackt. En dat is te wijten aan een strak beleid qua SQL Injection, firewall policies, code reviews, en niet aan gezever met permissies.)

Nu hebben we een veilige Joomla! installatie waarbij UNIX user "appeltje" eigenaar is van alle bestanden, maar "apache" toch alles kan beschrijven. Maar opnieuw strandt deze poging. Zolang Joomla! bestaande bestanden aanpast, is er geen probleem. Maar zodra een nieuw bestand wordt aangemaakt (bijvoorbeeld bij de installatie van een component), dan hebben die nieuwe bestanden als eigenaar de webserver. Er ontstaan een verschil in eigenaar, en PHP Safe Mode blokkeert de boel.

Alle pogingen om PHP Safe Mode blijken brak. Het lijkt alsof Safe Mode geen goede oplossing is.

En dat vinden de makers van PHP ook

Een wake-up call voor hosting providers is dat PHP versie 6 geen Safe Mode mogelijkheid meer zal hebben. De ontwikkelaars van PHP hebben lang nagedacht over het gebruik van Safe Mode en zijn uiteindelijk tot de conclusie gekomen dat PHP Safe Mode simpelweg geen goed veiligheidsmechanisme is.

Aangezien PHP Safe Mode in de toekomst obsolete zal zijn, wordt het tijd dat hosting providers naar andere vormen van PHP beveiliging gaan kijken.

De meest belangrijke PHP settings zijn hierbij:

  • open_basedir
  • disable_functions
  • disable_classes
  • allow_url_fopen
Daarnaast is het niet onverstandig eens te kijken naar andere vormen van beveiliging, zoals het draaien van de Apache-firewall mod_security.
Home Blog Joomla! en PHP Safe Mode