Создаем безопасный web-сервер

Для создания максимально защищенного web-сервера нам нужно:
-Создать chroot «песочницу» с помощью debootstrap
-становить в песочнице apache2, php5, mysql
-становить и настроить mod-security2, а также отредактировать необходимые директивы конфигурационных файлов apache и php.
За основу берем дистрибьютив Ubuntu

Создаем сhroot песочницу.Первое что делаем, ето добавляем новый репозиторий в sources.list, и обновляем пакеты. (вместо данного репозитория может выбрано другое зеркало, данное было выбрано случайно, в виду наличия пакета libapache2-mod-security (: )
$echo 'deb ubuntu.mirror.cambrium.nl/ubuntu lucid main universe' >> /etc/apt/sources.list
$apt-get update
$apt-get upgrade


Теперь переходим к установке debootstrap и создание вложенной ОС — chroot песочницы:
$apt-get install debootstrap
если установка прошла успешно — запустим утилиту:
$debootstrap --variant=buildd --arch i386 lucid /home/chroot archive.ubuntu.com/ubuntu

В аргументах к утилите мы указали:
— архитектуру будущей системы,
— дистрибьютив,
— непосредственно директорию, которая будет нам служить chroot песочницей
— репозиторий из которого утилита должна скачать дистрибьютив.

Настроим chroot.Для начала нужно настроить резолвер и список репозиториев для chroot. Выполним команды:
$cp /etc/resolv.conf /home/chroot/etc/resolv.conf
$cp /etc/apt/sources.list /home/chroot/etc/apt/sources.list

Пробрасываем в chroot окружение системные файловые системы:
$nano /etc/fstab
и записываем туда следующее:
/proc /home/chroot/proc none rbind 0 0
/dev /home/chroot/dev none rbind 0 0
/sys /home/chroot/sys none rbind 0 0

Сохраняем, закрываем файл. Монтируем командой:
mount -a
На этом работа в основной ОС закончена. Выполним последнюю команду в основном терминале, чтобы перейти в ОС chroot-песочницы:
chroot /home/chroot

Настроим ОС внутри chroot.выполняем уже знакомые команды:
$echo 'deb ubuntu.mirror.cambrium.nl/ubuntu lucid main universe' >> /etc/apt/sources.list
$apt-get update
$apt-get upgrade


Переходим к установке 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


Установим mysql.Все дело в том, что мускул отказывается корректно работать в песочнице.Можна сделать проще.Устанавливаем mysql в основную ОС:
$apt-get install mysql-server mysql-client
Затем редактируем конфиг:
$nano /etc/mysql/my.cnf
и заменяем строчку:
bind-address = 127.0.0.1
на
bind-address = 0.0.0.0
После этих действий mysql будет доступен внутри песочницы, однако в качестве хоста mysql нужно указывать не localhost, а 127.0.0.1

Данный способ установки mysql значительно легче, однако может скомпрометировать систему.
Дело в том, что при наличии привелегии file_priv злоумышленник может получить доступ к файловой системе вне песочницы, даже если скрипт запускается внутри нее.
Т.е. для использования в песочнице mysql необходимо создавать пользователей без привелегии file_priv.

Заключительный этап. Конфигурация apache2, php, libapache2-mod-security2.Создаем пользователя apache и пользовательского каталога:
$cd /; mkdir -m 755 web
$useradd dot -b /web -m -U -s /bin/false
$chmod 754 /web/dot
$mkdir -p -m 754 /web/dot/public_html/www
$mkdir -p -m 777 /web/dot/tmp
$chmod +t /web/dot/tmp
$chown -R dot:dot /web/dot/

Итак, мы создали пользователя, отключили ему шелл, создали домашнюю директорию, создали веб директорию, создали персональную временную директорию и рекурсивно сменили хозяина директорий.

Редактируем дефолтного виртуального хоста под нашего юзера:
$nano /etc/apache2/sites-enabled/000-default
Содержимое:
<VirtualHost *:80>
DocumentRoot "/web/dot/public_html/www/"
ServerName «dot»
ErrorLog /web/dot/error_log
CustomLog /web/dot/access_log combined


Редактируем конфигурационный файл apache2:
$nano /etc/apache2/apache2.conf
Меняем дефолтного пользователя и группу, от которого будет работать apache:
User www-data
Group dot

Добавляем несколько директив в конец файла:
# Отключаем подпись внизу служебных страниц apache (страница 404 ошибки и т.п.)
ServerSignature Off
# Ответ сервера в заголовке (значение Prod выведет только название софта — Apache)
ServerTokens Prod
#отключаем запуск CGI-скриптов, запрещаем следовать по символьным ссылкам, запрещаем просмотр каталогов, запрещаем SSI
Options -ExecCGI -FollowSymLinks -Indexes -Includes


Редактируем конфигурационный файл 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/dot/"


Настраиваем 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»


Вышеуказанные правила для модуля рабочие, хотя и требуют доработки, приведены для примера.
Данная статья писалась пошагово, после выполнения соответствующих действий на сервере. В качестве ОС использовалась Ubuntu 10.04.
Tags:
Безопасность,web-сервер

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.