Для создания максимально защищенного 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.
-Создать 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.