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 г.