Изоляция виртуальных хостов в Apache с MPM ITK: запуск VirtualHost от разных UID
- Взлом одного сайта на сервере приводит к несанкционированному доступу к файлам и базам данных соседних клиентов.
- Все VirtualHost работают от единого системного пользователя
www-dataилиapache. - Сложности с разграничением прав на запись (права 777 в каталогах
uploads).
1. Установка модуля MPM ITK
# Debian / Ubuntu
apt-get install -y libapache2-mpm-itk
# Включение модуля
a2enmod mpm_itk
systemctl restart apache22. Создание изолированных системных пользователей
useradd -m -d /var/www/site1 -s /usr/sbin/nologin user_site1
useradd -m -d /var/www/site2 -s /usr/sbin/nologin user_site2
chmod 750 /var/www/site1
chmod 750 /var/www/site23. Конфигурация VirtualHost с директивой AssignUserID
Отредактируйте файл сайта /etc/apache2/sites-available/site1.conf:
<VirtualHost *:80>
ServerName site1.itstm.ru
DocumentRoot /var/www/site1/public_html
# Запуск процессов обработки запросов от индивидуального пользователя и группы
<IfModule mpm_itk_module>
AssignUserID user_site1 user_site1
LimitUIDRange 1000 2000
LimitGIDRange 1000 2000
</IfModule>
<Directory /var/www/site1/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog /var/www/site1/logs/error.log
CustomLog /var/www/site1/logs/access.log combined
</VirtualHost>4. Валидация и перезапуск Apache
apachectl configtest && systemctl reload apache2 Частые вопросы (FAQ)
В чем недостаток производительности MPM ITK по сравнению с MPM Event?
MPM ITK выполняет fork() и setuid() для каждого входящего клиентского запроса. Это снижает максимальный RPS сервера, поэтому перед Apache с MPM ITK обязательно должен стоять Nginx для статики и кэширования.
Может ли скрипт на site1 прочитать конфигурационный файл site2?
Нет. Так как процесс site1 выполняется с UID 'user_site1', стандартные права файловой системы Linux (0750) полностью блокируют доступ к каталогу /var/www/site2.