1. Теория
1.0. Постановка задачиНам требуется построить максимально безопасный web-сервер на основе минимального дистрибьютива Ubuntu, а именно:
1. Создать
chroot "песочницу" с помощью
debootstrap 2. Установить в песочнице apache2, php5, mysql
3. Установить и настроить mod-security2, а также отредактировать необходимые директивы конфигурационных файлов apache и php.
1.1. Теоретическая подготовка
Цитата:
chroot — операция изменения корневого каталога в
Unix-подобных операционных системах. Программа, запущенная с изменённым
корневым каталогом, будет иметь доступ только к файлам, содержащимся в
данном каталоге. (c)Wikipedia |
Т.е. проще говоря - это каталог-песочница, в который мы установим
web-сервер и даже при проникновении в систему злоумышленник имея
web-шелл будет иметь доступ к директориям и файлам внутри этого
каталога, а к корню системы доступа не будет.
Цитата:
debootstrap is a tool which will install a Debian base system
into a subdirectory of another, already installed system. It doesn't
require an installation CD, just access to a Debian repository.
|
Вольный перевод -
Цитата:
Это инструмент, который устанавливает базовый дистрибьютив Debian в
другой каталог уже существующей системы. Не требует наличия
инсталяционного CD, файлы берутся из репозитория.
|
Именно с помощью
debootstrap мы создадим chroot песочницу с эмуляцией полноценной системы.
Цитата:
mod-security2 - это модуль для веб-сервера Apache2, который
позволяет управлять запросами к веб-серверу, в соответствии с
определенными правилами. (Многие уже знакомы с этим модулем, похожие
возможности есть на многих хостингах, например sweb, который отвергает
потенциально опасные запросы)
|
2. Создание chroot песочницы. Настройка системы.
Заметки:
- Данная статья писалась пошагово, после выполнения соответствующих действий на сервере. В качестве ОС использовалась Ubuntu 10.04 (Linux 2.6.18-238.5.1.el5.028stab085.3ent #1 SMP Mon Mar 21 21:16:32 MSK 2011 i686 GNU/Linux).
- В статье будут использоваться команды для основного терминала и для терминала chroot песочницы.
Команды основного терминала будет иметь подсветку:
$uname -a
А команды терминала chroot:
$uname -a 2.0 Подготовка репозиториев.Добавляем новый репозиторий в
sources.list, и обновляем пакеты.
(вместо данного репозитория может выбрано другое зеркало, данное было
выбрано случайно, в виду наличия пакета libapache2-mod-security (: )
Цитата:
$echo 'deb http://ubuntu.mirror.cambrium.nl/ubuntu/ lucid main universe' >> /etc/apt/sources.list $apt-get update $apt-get upgrade |
2.1 Установка debootstrap и создание вложенной ОС - chroot песочницы.
Цитата:
$apt-get install debootstrap |
если установка прошла успешно - запустим утилиту
Цитата:
$debootstrap --variant=buildd --arch i386 lucid /home/chroot http://archive.ubuntu.com/ubuntu/ |
В аргументах к утилите мы указали:
- архитектуру будущей системы,
- дистрибьютив,
- непосредственно директорию, которая будет нам служить chroot песочницей
- репозиторий из которого утилита должна скачать дистрибьютив.
2.2 Настройка chrootДля начала нужно настроить резолвер и список репозиториев для chroot. Выполним команды
Цитата:
$cp /etc/resolv.conf /home/chroot/etc/resolv.conf $cp /etc/apt/sources.list /home/chroot/etc/apt/sources.list |
Пробрасываем в chroot окружение системные файловые системы
и записываем туда следующее:
Цитата:
/proc /home/chroot/proc none rbind 0 0 /dev /home/chroot/dev none rbind 0 0 /sys /home/chroot/sys none rbind 0 0
|
Сохраняем, закрываем файл. Монтируем командой:
На этом работа в основной ОС закончена. Выполним последнюю команду в основном терминале, чтобы перейти в ОС chroot-песочницы.
2.3 Настройка ОС внутри chrootвыполняем уже знакомые команды:
Цитата:
$echo 'deb http://ubuntu.mirror.cambrium.nl/ubuntu/ lucid main universe' >> /etc/apt/sources.list $apt-get update $apt-get upgrade |
2.4 Установка apache2 и php внутри chrootУстановка ничем не отличается от обыденной установки, поэтому подробно
останавливаться на этом не буду, каждый выберет сам для себя необходимые
модули. (модуль
libapache2-mod-security2 обязателен к установке)
Цитата:
$apt-get install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert libapache2-mod-security2 |
Цитата:
$apt-get install libapache2-mod-php5
libapache2-mod-ruby php5 php5-common php5-curl php5-dev php5-gd php5-idn
php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-mhash
php5-ming php5-mysql php5-pspell php5-recode php5-snmp php5-sqlite
php5-tidy php5-xmlrpc php5-xsl |
2.5 Установка mysqlЯ не зря вынес установку мускула в отдельный пункт.
Все дело в том, что мускул отказывается корректно работать в песочнице.
После прочтения манов я был огорчен той муторностью настройки нормальной
работы (копирование файлов, создание ссылок из основной ОС в песочницу и
т.п.), что решил сделать проще.
Устанавливаем mysql в
основную ОС
Цитата:
$apt-get install mysql-server mysql-client |
Затем редактируем конфиг:
и заменяем строчку
на
После этих действий mysql будет доступен внутри песочницы, однако в качестве хоста mysql нужно указывать не
localhost, а
127.0.0.1 ВНИМАНИЕ!!!Данный способ установки mysql значительно легче, однако может скомпрометировать систему.
Дело в том, что при наличии привелегии
file_priv злоумышленник может получить доступ к файловой системе
вне песочницы, даже если скрипт запускается внутри нее.
Т.е. для использования в песочнице mysql необходимо создавать пользователей
без привелегии
file_priv.
3. Заключительный этап. Конфигурация apache2, php, libapache2-mod-security2
3.0 Создание пользователя apache и пользовательского каталога
Цитата:
$cd /; mkdir -m 755 web $useradd rdot -b /web -m -U -s /bin/false $chmod 754 /web/rdot $mkdir -p -m 754 /web/rdot/public_html/www $mkdir -p -m 777 /web/rdot/tmp $chmod +t /web/rdot/tmp $chown -R rdot:rdot /web/rdot/ |
Итак, мы создали пользователя, отключили ему шелл, создали
домашнюю директорию, создали веб директорию, создали персональную
временную директорию и рекурсивно сменили хозяина директорий.
3.1 Редактирование дефолтного виртуального хоста под нашего юзера
Цитата:
$nano /etc/apache2/sites-enabled/000-default |
Содержимое:
Цитата:
<VirtualHost *:80> DocumentRoot "/web/rdot/public_html/www/" ServerName "rdot" ErrorLog /web/rdot/error_log CustomLog /web/rdot/access_log combined </VirtualHost>
|
3.2 Редактирование конфигурационного файла apache2
Цитата:
$nano /etc/apache2/apache2.conf |
Меняем дефолтного пользователя и группу, от которого будет работать apache
Добавляем несколько директив в конец файла:
Цитата:
# Отключаем подпись внизу служебных страниц apache (страница 404 ошибки и т.п.) ServerSignature Off # Ответ сервера в заголовке (значение Prod выведет только название софта - Apache) ServerTokens Prod #отключаем запуск CGI-скриптов, запрещаем следовать по символьным ссылкам, запрещаем просмотр каталогов, запрещаем SSI Options -ExecCGI -FollowSymLinks -Indexes -Includes
|
3.3 Редактирование конфигурационного файла php.ini
Цитата:
$nano /etc/php5/apache2/php.ini |
Изменяем значение следующих директив:
Цитата:
expose_php = Off magic_quotes_gpc = On register_globals = Off disable_functions =
popen,exec,system,passthru,proc_open,shell_exec,in
i_restore,dl,symlink,chgrp,ini_set,putenv,extensio n_loaded,getmyuid,
posix_setuid,posix_setsid,posix_setpgid,posix_kill
,apache_child_terminate,chmod,chdir,phpinfo safe_mode = On safe_mode_gid = On open_basedir = "/web/rdot/"
|
3.4 Настраиваем mod-security2для начала создадим необходимые каталоги и файлы:
Цитата:
$mkdir /etc/apache2/conf.d/modsec $mkdir /var/log/apache2/modsec $touch /etc/apache2/conf.d/modsec/modsecurity_crs_10_config.conf $touch /etc/apache2/conf.d/modsec/modsecurity_crs_15_customrules.conf |
Далее отредактируем созданные файлы:
modsecurity_crs_10_config.conf - файл с основными настройками модуля
modsecurity_crs_15_customrules.conf - файл с правилами для модуля
Цитата:
$nano /etc/apache2/conf.d/modsec/modsecurity_crs_10_config.conf |
Содержимое:
Цитата:
# Включить движок фильтра SecRuleEngine On # Вести лог только для подозрительных запросов SecAuditEngine RelevantOnly # Имя файла лога SecAuditLog /var/log/apache2/modsec/audit_log # Вывод отладочной информации SecDebugLog /var/log/apache2/modsec/debug_log SecDebugLogLevel 1 # Для подозрительных запросов по умолчанию писать в лог # и возвращать HTTP ответ с кодом 403 SecDefaultAction log,auditlog,deny,status:403,phase:2
|
Цитата:
$nano /etc/apache2/conf.d/modsec/modsecurity_crs_15_customrules.conf |
Содержимое:
Цитата:
# Защита от LFI\read file SecRule ARGS "\.\./" SecRule ARGS "/etc.+passwd" "t:lowercase" SecRule ARGS "/proc/.+" "t:lowercase" # Защита от SQL-injections SecRule ARGS "delete.+from" "t:lowercase" SecRule ARGS "insert.+into" "t:lowercase" SecRule ARGS "select.+from" "t:lowercase" SecRule ARGS "union.+select" "t:lowercase" SecRule ARGS "group_concat" "t:lowercase" SecRule ARGS "information_schema" "t:lowercase" SecRule ARGS "benchmark" "t:lowercase" # Изменяем ответ сервера, софт теперь у нас не apache  SecServerSignature "IIS"
|
Вышеуказанные правила для модуля рабочие, хотя и требуют доработки, приведены для примера.
За более подробной инструкцией по настройке модуля следует обратиться к официальной документации.
4. Выводы
В
данной статье мы рассмотрели создание chroot-окружения внутри системы,
установку веб-сервера в песочницу, и увеличили безопасность web-сервера.
5. Полезные ссылки
http://www.modsecurity.org/
http://ru.wikipedia.org/wiki/Chroot
http://wiki.debian.org/Debootstrap
http://agapoff.name/mod_security-dlya-apache.html
http://www.securitylab.ru/analytics/243752.php
P.S. Все шаги выполнялись одновременно на рабочем сервере, после
множественных экспериментов и продолжительного и мучительного
тестирования все получилось.
P.P.S. На сервер с данной конфигурацией в качестве теста был установлен Wordpress, полет нормальный! ;)
(c)Twost
27.07.2011 г.
В дальнейшем прошу согласовывать перепечатку материалов статьи с автором.
С уважением, Twost.