пятница, 13 апреля 2012 г.

Защищаем веб-сервер apache2

В какой-то момент назрела необходимость повысить защищенность небольшого веб-сервера LAMP, обслуживающего несколько малонагруженных ресурсов. Рассмотрим несколько полезных аспектов для решения данной задачи.


Итак, имеем:

  1. Виртуальные хосты располагаются в директории /virtualhosts
  2. В каждой папке виртуального хоста созданы директории:
  3. public_html
    logs
    tmp
  4. Установлен модуль mod_security2 (http://www.modsecurity.org/)
Запрещаем apache2 сообщать внешнему миру свою версию и версию ОС:

ServerSignature Off
ServerTokens Prod

До применения настроек видим примерно следующую картину:


# HEAD localhost | grep Server
Server: Apache/2.2.20 (Ubuntu)
после:

# HEAD localhost | grep Server
Server: Apache
Отключим глобально .htaccess и все опции:
AllowOverride None
Options None
Запретим apache работать с файлами вне разрешенных каталогов:
<Directory />
    Order Deny,Allow
    Deny from all
    Options None
    AllowOverride None
</Directory>

Выключаем лишние модули, включенные при установке. Посмотреть можно в текущей директории с конфигурацией apache:
grep -i -r LoadModule *
Для уменьшения влияния небольших DoS атак снизим значение Timeout до 45-60 секунд:
Timeout 45
Значение по умолчанию 300 секунд. Как правило, это слишком много.
Можно также отключить глобально php и включить только для виртуальных хостов, где это требуется. Для этого убираем глобально и включаем в рамках виртуального хоста следующие опции:

AddType application/x-httpd-php .php .phtml .php3
AddType application/x-httpd-php-source .phps

Сделаем запуск виртуальных хостов от различных пользователей. Для этого нам потребуется mpm_itk_module. В Ubuntu для этого ставил пакет: apache2-mpm-itk.
Рассмотрим на примере некоторого myhost.ru, работающего от системного пользователя myhost.ru.

<VirtualHost *>
    DocumentRoot /virtualhosts/myhost.ru/public_html/
    ServerName myhost.ru
    ServerAlias www.myhost.ru

    <Directory "/virtualhosts/myhost.ru/public_html">
        php_admin_value open_basedir /virtualhosts/myhost.ru/public_html:/virtualhosts/myhost.ru/tmp
        php_admin_value doc_root /virtualhosts/myhost.ru/public_html
        php_admin_value session.save_path "/virtualhosts/myhost.ru/tmp"
        php_admin_value upload_tmp_dir "/virtualhosts/myhost.ru/tmp"
        php_admin_flag safe_mode on
                         
        Order allow,deny
        Allow from All
    </Directory>
                                                               
    ErrorLog /virtualhosts/myhost.ru/logs/myhost.ru_error.log
    CustomLog /virtualhosts/myhost.ru/logs/myhost.ru.log combined
    <IfModule mpm_itk_module>
        AssignUserId myhost.ru myhost.ru
    </IfModule>
</VirtualHost>
В конфигурации virtualhost мы разрешили доступ к каталогу с файлами сайта и ограничили доступные для php каталоги. Некоторые сайты не дружат с safe_mode on - для них можно отключить и поставить off.
Далее выставим права для директорий:
cd /virtualhosts/myhost.ru
chown root:root logs
chmod 755 logs
chown -R myhost.ru:myhost.ru ./public_html/
chown -R myhost.ru:myhost.ru ./tmp/
find ./public_html/ -type f  -exec chmod 660 "{}" \;
find ./public_html/ -type d  -exec chmod 770 "{}" \;
find ./tmp/ -type f  -exec chmod 660 "{}" \;
find ./tmp/ -type d  -exec chmod 770 "{}" \;
Для дополнительной защиты можно также использовать amon. Код и инструкция тут: http://www.lucaercoli.it/amon.html

Комментариев нет: