Debian server beheer

PHP beveligen

open_basedir en upload_tmp_dir

Als je niets doet aan je php installatie kan een php script bestanden vanuit je hele server openen. Je kunt echter per virtuele host aangeven welke bestanden php wel en niet mag openen. Open het configuratiebestand in /etc/apache2/sites-available en voeg de volgende twee regels toe:

php_admin_value open_basedir /home/gebruiker php_admin_value upload_tmp_dir /home/gebruiker/tmp

De eerste regels zegt dat php als onderdeel van deze virtuele host alleen bestanden mag openen uit de map /home/gebruiker. Je moet er dus voor zorgen dat alle bestanden die je site nodig heeft in die map staan. Als je een php-script gebruikt om bestanden te uploaden naar je server komen die standaard in de map /tmp terecht. Daar kan PHP nu niet meer bij daarom moet je met de tweede regel aangeven dat elke site een eigen /tmp map krijgt. Zorg dat die map ook bestaat en de juiste eigenaar heeft, anders lukt het uploaden alsnog niet.

Stop het openen van bestanden op andere servers

Standaard kan PHP met een simpele opdracht bestanden openen vanaf een andere server. Er zijn voorbeelden geweest waarin dat misbruikt is. Je kunt deze mogelijkheid uitschakelen. Bewerk php.ini:

cp /etc/php5/apache2/php.ini /etc/php5/apache2/php.ini.backup1 nano /etc/php5/apache2/php.ini

Zoek de regel die begint met allow_url_fopen en verander die in:

allow_url_fopen = Off

Om dat effect te laten hebben moet je Apache herstarten:

/etc/init.d/apache2 reload

Verberg je PHP en Apache versie

Het is voor een kwaadwillend iemand makkelijk te ontdekken welke versie van PHP je draait. Bijvoorbeeld met curl:

curl -I http://www.[jouwdomein].nl/index.php

HTTP/1.1 200 OK Date: Thu, 22 Aug 2013 14:15:12 GMT Server: Apache/2.2.16 (Debian) X-Powered-By: PHP/5.3.3-7+squeeze16 Vary: Accept-Encoding Content-Type: text/html

Als je boosaardige bezoeker een kwetsbaarheid in die versie kent kan hij daar misbruik van maken. Open weer php.ini, zoek de regel die begint met expose_php en verander die in:

expose_php = Off

Als je dan toch bezig bent, stel dan meteen in dat het versienummer van apache ook niet getoond wordt:

nano /etc/apache2/conf.d/security

In dat bestand zoek je naar de regels ServerTokens en ServerSignature en verander je die in:

ServerSignature Off ServerTokens Prod

Als je nu nogmaals de curl test doet zie je dat niet meer getoond wordt dat php geïnstalleerd is en geen Apache versienummer meer te zien is.

curl -I http://www.[jouwdomein].nl/index.php

HTTP/1.1 200 OK Date: Thu, 22 Aug 2013 14:28:02 GMT Server: Apache Vary: Accept-Encoding Content-Type: text/html

Deze maatregel is 'Security through obscurity' en is geen alternatief voor andere beveiligingsmaatregelen en met name het up-to-date houden van PHP en Apache.

Schakel gevaarlijke functies uit

Je kunt er voor kiezen een aantal functies waar nare dingen mee gedaan kunnen worden uit te schakelen. Open weer php.ini en zoek de regel die begint met disable_functions en verander die in:

disable_functions = phpinfo, exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source

Zoals steeds moet je Apache herstarten voordat deze aanpassing effect heeft. En controleer daarna wel of je website het nog doen en je niet per ongeluk een functie uitgeschakeld hebt die ergens hard nodig is.

Blokkeer uitgaand verkeer voor bepaalde gebruikers

Zoals ik in het hoofdstuk over virtuele hosts uitgelegd heb, draait elke virtuele host onder zijn eigen gebruikersnaam. Met je firewall is het mogelijk om per gebruiker uitgaand verkeer te blokkeren. Een inbreker die toegang tot je systeem heeft zal proberen met curl of wget software op je server te installeren om die te misbruiken. Als je uitgaand verkeer blokkeert lukt dat niet. Als eerste moet je de uid van de gebruiker opzoeken, in dit voorbeeld lisa:

cat /etc/passwd | grep lisa | cut -d: -f1,3

lisa:4321

4321 is de uid van lisa. Blokkeer nu het uitgaande verkeer voor deze gebruiker:

iptables -A OUTPUT -o eth0 -m owner --uid-owner 4321 -j DROP

Met behulp van su kun je nu testen of het uitgaande verkeer voor deze gebruiker inderdaad geblokkeerd is:

su lisa $ curl http://2ha.nl

curl: (6) Couldn't resolve host '2ha.nl'

Omdat curl al geen verbinding krijgt met de DNS server krijg de de couldn't resolve foutmelding. Je kunt het voor de zekerheid ook nog eens op ip-adres proberen:

$ curl http://62.75.208.129

curl: (7) couldn't connect to host

Gebruiker lisa heeft dus inderdaad geen toegang meer naar buiten. Tenslotte ga je weer terug naar je eigen account:

exit

Let wel op dat je deze test doet met en ander ip-adres dan dat van je eigen server.

Het allerbelangrijkst: blijf up-to-date

De allerbelangrijkste veiligheidsmaatregel is je PHP, Apache en andere software goed up-to-date houden. Dus regelmatig:

apt-get update apt-get upgrade