Виртуальные хосты Apache: безопасная настройка для Debian/Ubuntu
Всем привет! Данная статья описывает правильную, безопасную настройку виртуальных хостов в Debian.
Пользуясь данной инструкцией Вы сможете установить безопасные права доступа хостов так, что каждый хост сможет обращаться к данным, предназначенным только для него самого.
Давайте в качестве примера создадим виртуальный хост "site.com".
Шаг 0 – Создание файла конфигурации виртуального хоста
Скопируем стандартный файл конфигурации в качестве исходника:
cp /etc/apache2/sites-available/default /etc/apache2/sites-available/site.com
Шаг 1 — Права пользователей
Для каждого хоста будет создан отдельный пользователь. Домашние директории при этом будут храниться по пути /var/www/папка_пользователя.
Создаём пользователя site.com с созданием домашней директории в /var/www/. Флаги:
-m — создание папки автоматически;
-U — создание одноименной группы, в которую пользователь будет помещён;
-s — указание шелла, в нашем случае — шелл будет отсутствовать.
useradd site.com -b /var/www/ -m -U -s /bin/false
Задаём пароль пользователя:
passwd site.com
Устанавливаем права на папку пользователя:
chmod 754 /var/www/site.com
Создаём папку для веб-сайта:
mkdir -p -m 754 /var/www/site.com/public_html/
Создаём папку для хранения сессий/загружаемых файлов/логов
mkdir -p -m 777 /var/www/site.com/tmp
Разрешаем удалять папку только владельцу:
chmod +t /var/www/site.com/tmp
Задаём владельца всех вложенных папок
chown -R site.com:site.com /var/www/site.com/
Шаг 2 — Запуск Apache от разных пользователей
Из коробки Apache работает от одного пользователя для всех хостов, то есть злоумышленник, получив доступ к одному сайту может прочитать файлы соседних проектов. Для исправления этого недостатка нужно установить модифицированную версию Apache под названием apache2-mpm-itk. После установки в конфигах виртуальных хостов можно будет указать от какого пользователя и группы должен работать apache для конкретного сайта.
apt-get install apache2-mpm-itk
Пользователь и группа задается строкой в конфиге:
AssignUserId www-data site.com
Здесь в качестве группы мы указываем www-data для того, чтобы из веба нельзя было править файлы нашего проекта, кроме тех, на которых стоят права o+w. При этом нужно запретить консоль у пользователя www-data:
usermod -s /bin/false www-data
Шаг 3 — Отдельный tmp для каждого сайта
Заданием отдельной временной папки для каждого сайта мы предотвращаем инклуд сессий с соседнего сайта. Для этого используем директивы upload_tmp_dir и session.save_path:
php_admin_value upload_tmp_dir "/var/www/site.com/tmp"
php_admin_value session.save_path "/var/www/site.com/tmp"
Шаг 4 — Запрет PHP выходить выше пользовательской домашней директории
Запрет выхода выше директории задаётся директивой open_basedir:
php_admin_value open_basedir "/var/www/site.com/:."
Шаг 5 — Хранение логов в папке пользователя
Файлы для хранения логов ошибок и доступа задаются следующими директивами:
ErrorLog /var/www/site.com/error_log
CustomLog /var/www/site.com/access_log combined
В результате на выходе получаем следующий конфиг:
<VirtualHost *:80>
ServerName site.com
ServerAlias www.site.com
DocumentRoot /var/www/site.com/public_html
ErrorLog /var/www/site.com/error_log
CustomLog /var/www/site.com/access_log combined
AssignUserId site.com site.com
php_admin_value open_basedir "/var/www/site.com/:."
php_admin_value upload_tmp_dir "/var/www/site.com/tmp"
php_admin_value session.save_path "/var/www/site.com/tmp"
</VirtualHost>
Шаг 6 — Завершение настройки
После сохранения конфигурации нужно активировать виртуальный хост:
a2ensite site.com
А затем перечитать конфиги:
/etc/init.d/apache2 reload
Шаг 7 — Проверка работы
Создадим тестовую веб-страницу для виртуального хоста:
vi /var/www/site.com/public_html/index.html
И запишем в него следующий код:
<html>
<head>
<title>site.com</title>
</head>
<body>
<h1>site.com</h1>
</body>
</html>
После направления доменного имени на IP-адрес сервера при обращении к даному адресу в браузере будет открыта созданная нами веб-страничка. Виртуальный хост полностью настроен.
Комментарии