Hey,
Ik heb een VPS met daarop een paar websites. Op dit moment beheer ik zelf de sites en uploaden wordt niet toegestaan, dus ik kan het qua veiligheid redelijk bijhouden. Binnenkort komt er echter wat bij dat niet meer door mij gedaan wordt, dus ik wil ook dat het wat veiliger ingericht wordt. Ik ben wat aan het proberen geweest op VMs, maar ik kom er niet helemaal uit. (Het is niks commercieëls of zo, maar het zou toch fijn zijn als het goed ingericht is)
Wat ik heb:
Debian 6 32-bits
Apache2.2
PHP-FPM/FastCGI
(MySQL)
Het apache gedeelte gaat prima. Het gaat echter niet helemaal goed met PHP. Ik kan bijvoorbeeld een php-shell uploaden en vervolgens de gehele server uitlezen.
Wat ik wil hebben:
- Op een eenvoudige wijze later nog virtual hosts kunnen aanpassen/verwijderen/toevoegen
- PHP veilig ingericht hebben. Dus niet dat iemand zo'n PHP-shell kan uploaden en vervolgens de hele server kan benaderen (of andere exploits/beveiligingsproblemen?)
Ik dacht dus dat ik in ieder geval verschillende pools moest aanmaken (/etc/php5/fpm/pool.d/) en elke vhost met zijn php pool instellen. Dan moet ik het nog verder beschermen, zodat PHP alleen dingen kan doen die betrekking hebben op de DocumentRoot van apache en niet daarbuiten.
Ik dacht dat dit met chroot omgevingen mogelijk moest zijn, maar ik weet niet of dit -de- manier is om het te doen. Ik vond er niet heel veel guides over, maar de beste die ik vond was deze: http://www.makina-corpus....apache-and-chroot-php-fpm
Echter wordt hier geen rekening gehouden met meerdere virtual hosts.
Ik weet dus niet wat ik precies moet doen om te krijgen wat ik wil en welke methode de "beste" is.
Volgens mij wordt dit (als het goed is) altijd al gedaan bij bijvoorbeeld shared hosting omgevingen, dus zo "bijzonder" zou het toch niet moeten zijn. Toch kan ik er vrij weinig over vinden.
Heeft iemand ideeën?
EDIT: Wat dingen die ik dus zelf zag, maar waarvan ik niet zeker weet of het klopt en of het voldoende is qua bescherming/veiligheid:
1. php safe-mode schijnt niet heel geliefd te zijn. Ik begrijp dat het wat veiligheid toevoegt maar dat het ook vanaf PHP6 verwijderd gaat worden. Dus dat niet gebruiken?
2. Het volgende kwam ik al wel tegen. Aangezien ik per virtual host een aparte "pool" heb in PHP-FPM zou ik het volgende dus kunnen instellen:
/etc/php5/fpm/pool.d/<poolname>.conf
---
Bovenstaand dus de eigenaar van het PHP proces, zo zouden er ook geen problemen moeten komen met de eigenaar / permissies van files in de webroot, correct?
Hierdoor zouden de gevaarlijke PHP functies uitstaan waardoor bv. php shells niet meer mogelijk zijn en blijft PHP "contained" in de webroot (/var/www/domeinuser1/) en kan dus niet bij andere bestanden op de server of commando's e.d. uitvoeren. Dat klopt ook?
Zijn er nog andere dingen waar ik aan moet denken? Of is het op deze manier veilig en dus "contained"?
Alvast bedankt,
Ik heb een VPS met daarop een paar websites. Op dit moment beheer ik zelf de sites en uploaden wordt niet toegestaan, dus ik kan het qua veiligheid redelijk bijhouden. Binnenkort komt er echter wat bij dat niet meer door mij gedaan wordt, dus ik wil ook dat het wat veiliger ingericht wordt. Ik ben wat aan het proberen geweest op VMs, maar ik kom er niet helemaal uit. (Het is niks commercieëls of zo, maar het zou toch fijn zijn als het goed ingericht is)
Wat ik heb:
Debian 6 32-bits
Apache2.2
PHP-FPM/FastCGI
(MySQL)
Het apache gedeelte gaat prima. Het gaat echter niet helemaal goed met PHP. Ik kan bijvoorbeeld een php-shell uploaden en vervolgens de gehele server uitlezen.
Wat ik wil hebben:
- Op een eenvoudige wijze later nog virtual hosts kunnen aanpassen/verwijderen/toevoegen
- PHP veilig ingericht hebben. Dus niet dat iemand zo'n PHP-shell kan uploaden en vervolgens de hele server kan benaderen (of andere exploits/beveiligingsproblemen?)
Ik dacht dus dat ik in ieder geval verschillende pools moest aanmaken (/etc/php5/fpm/pool.d/) en elke vhost met zijn php pool instellen. Dan moet ik het nog verder beschermen, zodat PHP alleen dingen kan doen die betrekking hebben op de DocumentRoot van apache en niet daarbuiten.
Ik dacht dat dit met chroot omgevingen mogelijk moest zijn, maar ik weet niet of dit -de- manier is om het te doen. Ik vond er niet heel veel guides over, maar de beste die ik vond was deze: http://www.makina-corpus....apache-and-chroot-php-fpm
Echter wordt hier geen rekening gehouden met meerdere virtual hosts.
Ik weet dus niet wat ik precies moet doen om te krijgen wat ik wil en welke methode de "beste" is.
Volgens mij wordt dit (als het goed is) altijd al gedaan bij bijvoorbeeld shared hosting omgevingen, dus zo "bijzonder" zou het toch niet moeten zijn. Toch kan ik er vrij weinig over vinden.
Heeft iemand ideeën?
EDIT: Wat dingen die ik dus zelf zag, maar waarvan ik niet zeker weet of het klopt en of het voldoende is qua bescherming/veiligheid:
1. php safe-mode schijnt niet heel geliefd te zijn. Ik begrijp dat het wat veiligheid toevoegt maar dat het ook vanaf PHP6 verwijderd gaat worden. Dus dat niet gebruiken?
2. Het volgende kwam ik al wel tegen. Aangezien ik per virtual host een aparte "pool" heb in PHP-FPM zou ik het volgende dus kunnen instellen:
/etc/php5/fpm/pool.d/<poolname>.conf
---
code:
1
2
| user = user1 group = user1 |
Bovenstaand dus de eigenaar van het PHP proces, zo zouden er ook geen problemen moeten komen met de eigenaar / permissies van files in de webroot, correct?
code:
1
2
3
4
5
| chdir = / php_admin_value[open_basedir] = /var/www/domeinuser1/:/usr/share/php5:/tmp:/usr/share/phpmyadmin:/etc/phpmyadmin:/var/lib/phpmyadmin php_admin_value[disable_functions] = apache_child_terminate, apache_setenv, define_syslog_variables, escapeshellarg, escapeshellcmd, eval, exec, fp, fput, ftp_connect, ftp_exec, ftp_get, ftp_login, ftp_nb_fput, ftp_put, ftp_raw, ftp_rawl ist, highlight_file, ini_alter, ini_get_all, ini_restore, inject_code, mysql_pconnect, openlog, passthru, php_uname, phpAds_remoteInfo, phpAds_XmlRpc, phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, popen, posix_getpwuid, posix_kill, posix_mkf ifo, posix_setpgid, posix_setsid, posix_setuid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, syslog, system, xmlrpc_entity_decode |
Hierdoor zouden de gevaarlijke PHP functies uitstaan waardoor bv. php shells niet meer mogelijk zijn en blijft PHP "contained" in de webroot (/var/www/domeinuser1/) en kan dus niet bij andere bestanden op de server of commando's e.d. uitvoeren. Dat klopt ook?
Zijn er nog andere dingen waar ik aan moet denken? Of is het op deze manier veilig en dus "contained"?
Alvast bedankt,
[ Voor 32% gewijzigd door wizkid_niels op 04-07-2012 20:40 ]