Search
Write a publication
Pull to refresh

Безопасный web-сервер

Для создания web-сервера с хорошей безопасностью нам понадобится:
-Создать chroot «песочницу» с помощью debootstrap
-Установить в песочнице apache2, php5, mysql
-Установить и настроить mod-security2, а также отредактировать необходимые директивы конфигурационных файлов apache и php.
За основу берем дистрибьютив Ubuntu 11.04
Создаем с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 11.04.
Tags:
Hubs:
You can’t comment this publication 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.