Am o configurare cu mulți utilizatori, care își pot găzdui pagina web personală (servită de apache prin mod_userdir
), situat sub public_html
în casele lor. Suportul php este activat și în apache.
Momentan am următoarea configurație în /etc/apache2/mods-enabled/userdir.conf
<IfModule mod_userdir.c>
UserDir <home basedir>/*/public_html
UserDir disabled root
<Directory <home basedir>/*/public_html>
AllowOverride FileInfo AuthConfig Limit Indexes Options
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
<Limit GET POST OPTIONS>
Require all granted
</Limit>
<LimitExcept GET POST OPTIONS>
Require all denied
</LimitExcept>
</Directory>
</IfModule>
Problema este că, deoarece fiecare script php este rulat de utilizator www-data
, fiecare pagină de utilizator are permisiuni asupra tuturor celorlalți utilizatori public_html
. De exemplu, pot obține un shell invers php și pot inspecta conținutul altor utilizatori.
Am încercat să adaug
php_admin_value open_basedir "."
în interiorul Director
eticheta de mai sus. Acest lucru previne gaura de securitate descrisă mai sus, dar de fapt permite doar script-ului php să coboare în ierarhia directoarelor. De exemplu
<?php
chdir('assets');
echo getcwd();
chdir('..');
echo "<br>";
echo getcwd();
?>
produce
<home>/public_html/assets
<home>/public_html/assets
Problema este rezolvată dacă <home>/public_html
calea este codificată în format open_basedir
variabilă, dar desigur că trebuie să pot face acest lucru pentru toți utilizatorii prin intermediul unei variabile.
Apache stochează wildcardul (<home basedir>/*/public_html
) se potrivesc într-o variabilă pe care o pot accesa în interiorul Director
etichetă? Sau există alte modalități mai bune de a face acest lucru, de exemplu rularea fiecărei pagini de utilizator într-un mediu asemănător chroot?