железобетонный сервер _MIF_ (ROOT@SECURITYLAB.CO.IL) Спецвыпуск: Хакер, номер #068, стр. 068-052-5 [Scripting.] Рассмотрим самое уязвимое место хостинговой системы – выполняемые файлы, в частности, PHP скрипты. Открываем конфиг PHP: # vi /usr/local/etc/php.ini Меняем следующие параметры: ; Экранирование спецсимволов magic_quotes_gpc = On ; Выключаем опасные функции: disable_functions = system, exec, passthru Выключить эти функции очень важно. Хоть они и недоступны при включенном safe mode, пользователь может без труда провести успешную атаку, указав в файле .htaccess: php_flag safe_mode off [виртуальные хосты.] Теперь нам необходимо задать ограничения в конфиге каждого вхоста. Добавляем следующие параметры: <IfModule mod_php4.c> # Включаем Safe mode php_admin_flag safe_mode on php_admin_flag safe_mode_gid on # Папка, выше которой скрипт не может видеть php_admin_value open_basedir /home/domain.ru php_admin_value safe_mode_exec_dir /home/domain.ru # Temp дира юзера php_admin_value upload_tmp_dir /home/domain.ru/tmp # Не начинать PHP сессию автоматически php_admin_flag session.auto_start off # Где сохранять файлы сессий php_admin_value session.save_path /home/domain.ru/tmp </IfModule> Как известно, немалая часть взломов (SQL Injection, XSS атаки, инклюдинг) происходит по сути посредством хитрого HTTP запроса. Логично предположить, что эти самые запросы неплохо было бы фильтровать. Решение проблемы существует в виде модуля к Апачу, и называется оно mod_security. Ставим: # cd /usr/ports/www/mod_security/ # make install clean После установки – идем конфигурировать. Открываем любой конфиг виртуального хоста, например 001.admin.hosting.ru, над которым мы уже экспериментировали. Все значения надо вводить между тегами <Virtualhost *:80> и </Virtualhost>. # Включаем mod_security SecFilterEngine On # Проверяем запросы SecFilterScanPOST On # Проверяем ответы SecFilterScanOutput On # Проверяем, правильно ли закодирован URL SecFilterCheckURLEncoding On # Включаем этот параметр, если сайт в Unicode SecFilterCheckUnicodeEncoding Off # Задаем диапазон байтов SecFilterForceByteRange 1 255 # Сохраняем в лог только срабатывания механизма SecAuditEngine RelevantOnly # Где живет лог :) SecAuditLog logs/audit_log # Возвращаем ошибку 500 при срабатывании SecFilterDefaultAction "deny,log,status:500" # Перекрываем dots-bug SecFilter "\.\./" # Не забываем про XSS SecFilter "<(.|\n)+>" SecFilter "<[[:space:]]*script" # SQL injection, куда же без него :) SecFilter "delete[[:space:]]+from" SecFilter "insert[[:space:]]+into" SecFilter "select.+from" # Перекрываем возможность передачи переменных PHP SecFilterSelective ARG_b2inc "!^$" # Исключаем возможность раскрытия пути SecFilterSelective OUTPUT "Fatal error:" У этого модуля – на редкость удачная дефолтная конфигурация. К ней мало что можно добавить, так как большинство настроек – специфичны. Общий принцип составления правил мы рассмотрели, а остальное можно добавить по своему усмотрению. [Firewall.] Ну и, разумеется, ключевой момент защиты – файрвол. Открываем конфиг файрвола (/etc/rc.firewall) и приводим нужную секцию примерно в следующий вид: |