Безопасная настройка web-сервера (nginx+apache2-mpm-itk)

Опубликовано admin -

В данной статье я попытаюсь составить наиболее полное  описание безопасной настройки web-сервера (nginx+apache), под управлением ОС Debian. А также eaccelerator для более продуктивной работы сервера.

1. Создаем пользователей, файловая система.
Для начала я бы порекомендовал отделить под сайты отдельную директорию на сервере (вместо дефолтных, а-ля /home/user/www/). Создадим к примеру директорию sites, в корне. Выполним команды:

# cd /
# mkdir -m 755 sites



Тем самым мы создали директорию sites с правами доступа 755.
Далее создадим пользователей в системе. (для простоты мы будем настраивать сервер на 2-х пользователей.)


# addgroup user1
(Добавляем группу для первого юзера)
# useradd user1 -d /sites/user1 -g user1 -s /bin/false
(Добавляем первого юзера, устанавливаем ему домашнюю директорию, добавляем во вновь созданную группу, и убираем ему оболочку (/bin/bash))
# passwd user1
(Устанавливаем пароль)
# chmod 754 /sites/user1
(Правим права доступа к домашней директории)
# mkdir -p -m 754 /sites/user1/public_html/www
(создаем веб-директорию, устанавливаем права доступа)
# mkdir -p -m 777 /sites/user1/tmp
(создаем директорию для временных файлов, устанавливаем права доступа)
# chown -R user1:user1 /web/user1/
(Рекурсивно меняем владельца домашней директории и всех вложенных)


2. Устанавливаем и настраиваем apache2-mpm-itk
Стандартный apache2 работает от одного юзера, что естественно критично снижает уровень безопасности, потому как apache грубо говоря имеет доступ ко всем php файлам всех сайтов.
Таким образом хакер, взломавший один сайт на сервере и имеющий web-shell при стандартных условиях может прочитать файлы остальных сайтов.
Это нас естественно не устраивает, поэтому мы будем устанавливать модуль apache2-mpm-itk, что существенно повысит уровень безопасности нашего сервера.
Как гласит официальная документация:

# apache2-mpm-itk
(just mpm-itk for short) is an MPM (Multi-Processing Module) for the Apache web server. mpm-itk allows you to run each of your vhost under a separate uid and gid — in short, the scripts and configuration files for one vhost no longer have to be readable for all the other vhosts.

Поставим модуль из репозиториев:

# apt-get install apache2-mpm-itk

Установка стандартна, расписывать не буду. Подробнее остановлюсь на конфигурации.
Вот пример конфигурационного файла /etc/apache2/sites-available/user1

<VirtualHost *:80>
ServerName www.user1.ru
ServerAlias user1.ru  *.user1.ru
DocumentRoot /sites/user1/public_html/www/"
ErrorLog /sites/user1/error_log
CustomLog /sites/site1/access_log combined

# Важный момент, указываем, что апач будет работать от пользователя www-data и нашей группы site1
AssignUserIdwww-datasite1
open_basedir

для домашней директории пользователя, можно добавить несколько директорий при необходимости, директории разделяются двоеточием «:»
php_admin_value open_basedir "/ sites/user1/:."
# Включаем сейф-мод, я сделал это в каждом конфиге сайта для удобства отключения при необходимости.
php_admin_value safe_mode «on»
# Определяем нашу временную директорию как основную, вместо /tmp и устанавливаем её директорией для хранения сессий.
php_admin_value upload_tmp_dir "/ sites/user1/tmp"
php_admin_value session.save_path "/ sites/user1/tmp"
</VirtualHost>


Сохраняем конфиг, теперь активируем конфиг командой:
# a2ensite user1

Далее перечитываем конфиги
# /etc/init.d/apache2 reload

2.1(Пояснения)
AssignUserId www-data site1
Почему же мы указываем одного пользователя и разные группы для всех?
Ответ связан с предыдущим пунктом. Рассмотрим пример:
Действующих лиц трое: site1, site2 и www-data
Имеется два сайта с такими конфигами:

AssignUserIdwww-datasite1
AssignUserIdwww-datasite2

У сайта site1 есть файл

-rwxr-x---  1 site1 site1           397      Dec  1            23:15   index.php


Обратите внимание на юзера и группу владельца файла.
Таким образом, веб-сервер, работающий от единого пользователя и разных групп для каждого сайта обеспечивает безопасность между пользователями.
Поясню – права доступа выставлены так, что файл сможет прочитать только лишь владелец файла и участники группы, в это число входит site1 и веб-сервер запущенный от имени www-data, т.к. он работает от группы site1.
Т.е. site1 может прочитать файл, записать и выполнить, веб-сервер может только прочитать и выполнить, а site2 и веб-сервер запущенный от имени группы site2 уже не сможет прочесть важные файлы соседнего сайта, как то конфигурационный файл и т.п.

Установка nginx
Устанавливаем nginx из репозиториев (в репозиториях зачастую устаревшие версии, при желании можно установить из исходников.)

# apt-get update
# apt-get install nginx



Далее нам нужно поменять порт для apache2, для этого в файле /etc/apache2/ports.conf вносим изменения:

NameVirtualHost *:8080
Listen 8080


Т.е. заставляем apache работать на порту 8080
Далее нам нужно прописать изменения в конфигурационные файлы наших проектов. Вот пример конфигурации файла /etc/apache2/sites-available/site

<VirtualHost *:8080>
ServerName www. site.ru
ServerAlias site.ru *. site.ru
DocumentRoot "/sites/ site /public_html/www/"
ErrorLog /sites/site/error_log
CustomLog /sites/site/access_log combined
AssignUserId www-data site
php_admin_value open_basedir "/sites/site /:."
php_admin_value upload_tmp_dir "/sites/site /tmp"
php_admin_value session.save_path "/sites/site /tmp"




И так каждый файл всех ваших проектов.
Далее нужно изменить конфигурацию nginx.
Пример конфигурации:

server {
listen 000.000.000.000:80;
# вместо 000.000.000.000 ip адрес вашего сервера
server_name site.ru;
location / {
proxy_pass 127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)$ {
root /sites/site/public_html/www;
access_log /sites/site/access_log;
}
}



Данную конструкцию повторить для каждого проекта отдельно.
Таким образом мы настроили nginx фронтэндом, который будет обрабатывать статику (jpg,jpeg,gif и т.д.).
Теперь перезагружаем apache и nginx.

# /etc/init.d/apache2 restart
# /etc/init.d/nginx restart


ВАЖНО!

При установке nginx поверх apache2-mpm-itk я столкнулся с проблемой – т.к. апач работал от разных юзеров (точнее от разных групп) для каждого сайта, а nginx от одного юзера, то файлы статики были недоступны для nginx, не хватало прав, вследствии чего ошибка 403.
Решение:
Т.к. официального функционала у nginx с работой от разных юзеров еще нет, то пришлось добавить юзера www-data, от которого он работает в группы юзеров наших проектов.

# usermod -a -G site1,site2,site3 www-data



Установка eAccelerator

Установка проста, описывать особо нечего.

cd /tmp
wget httр://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
tar xvfj eaccelerator-0.9.5.3.tar.bz2
cd eaccelerator-0.9.5.3
phpize
./configure
make
make install


Далее правим конфиг акселератора /etc/php5/conf.d/eaccelerator.ini
Вот пример конфигурации:

extension=«eaccelerator.so»
eaccelerator.shm_size=«32»
eaccelerator.cache_dir="/var/cache/eaccelerator"
eaccelerator.enable=«1»
eaccelerator.optimizer=«1»
eaccelerator.check_mtime=«1»
eaccelerator.debug=«0»
eaccelerator.filter=""
eaccelerator.shm_max=«0»
eaccelerator.shm_ttl=«0»
eaccelerator.shm_prune_period=«0»
eaccelerator.shm_only=«0»
eaccelerator.compress=«1»
eaccelerator.compress_level=«9»



Далее создадим директорию для кэша:

# mkdir -p /var/cache/eaccelerator
# chmod 0777 /var/cache/eaccelerator


перезагружаем апач
# /etc/init.d/apache2 restart

ВАЖНО!

При установке eaccelerator также возникла проблема – вылетали ошибки:

PHP Warning: Unknown: open_basedir restriction in effect. File() is not within the allowed path(s): (blablabla) in Unknown on line 0


Как оказалось eaccelerator некорректно работает с open_basedir.
Решение:
При установке конфигурировать исходник с параметром --without-eaccelerator-use-inode

# phpize
# ./configure --without-eaccelerator-use-inode
# make
# make install



Все вышеописанные действия проводились в боевых условиях на сервере с ОС Debian.
На этом все, спасибо за внимание.
apache, apache2-mpm-itk, chmod, безопасность, настройка сервера, сервер

(c)https://habrahabr.ru/sandbox/21382/

Теги

Добавить комментарий

Ограниченный HTML

  • Допустимые HTML-теги: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
CAPTCHA
7 + 3 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.