Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #68, ИЮЛЬ 2006 г.

железобетонный сервер

_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) и приводим нужную секцию примерно в следующий вид:

Назад на стр. 068-052-4  Содержание  Вперед на стр. 068-052-6