RDot

RDot (https://rdot.org/forum/index.php)
-   Статьи/Articles (https://rdot.org/forum/forumdisplay.php?f=10)
-   -   [Manual] Безопасный web-сервер. (chroot,mod-security2,etc) (https://rdot.org/forum/showthread.php?t=1616)

Twost 27.07.2011 20:21

[Manual] Безопасный web-сервер. (chroot,mod-security2,etc)
 
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 окружение системные файловые системы
Цитата:

$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
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
Затем редактируем конфиг:
Цитата:

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


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
Цитата:

User www-data
Group rdot
Добавляем несколько директив в конец файла:
Цитата:

# Отключаем подпись внизу служебных страниц 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 г.

Vollkorn 27.07.2011 21:23

Хорошая статья, но на ЛОРе и опеннете много раз обсуждались недостатки чрута, а mod-security -- это фильтр от скрипткиддисов)

Но всё равно статья хорошая. +1

oRb 28.07.2011 11:45

Некоторые замечания:
1. Twost, ты добавил репозиторий в сурс-лист, который скопировал в chroot-окружение. И снова добавляешь его в sources.list.
2.
Цитата:

/dev /home/chroot/dev none rbind 0 0
считаю это не правильным, так как при получении рутовых привилегий можно будет смонтировать корневую фс в chroot-окружение.
3. Лучше не ставить кучу пакетов с расширениями для php5 без необходимости.
4. При такой конфигурации Apache уязвим для атаки DNS rebinding.
5. Наверно, стоит добавить в конфигурацию веб-сервера AllowOverride None, иначе через .htaccess можно будет обойти многие запреты. Судя по документации AllowOverride по дефолту равен All.
6. В lucid используется php версии 5.3.2. Это значит, что включенные magic_quotes_gpc и safe_mode будут вызывать E_DEPRECATED ошибки. Да и вообще эти настройки зависят от веб-приложения, работающего на этом сервере.


ps: не забываем, что при смене пути лог-файлов, logrotate сам не настроится.

Twost 28.07.2011 11:58

Некоторые замечания:
1. Опечатался)
2. Прочту документацию, позже возможно исправления внесу (кому есть что сказать - велком)
3. показано для примера
4. ---
5. Про данную директиву собирался написать, но что-то вылетело из головы) В прошлой заметке о SSI я писал об этом вкратце
6. показано для примера, о DEPRECATED знаю
ps: не забываем, что при смене пути лог-файлов, logrotate сам не настроится.


по поводу пунктов 1,3,6 я не растроился)
пункт 5 просто упустил из виду

А вот с пунктами 2 и 4 поинтереснее, почитаю маны, разберемся)

Спасибо Орбу! ;)


З.Ы. Кому есть что сказать по теме - прошу критиковать и комментировать.

mr.The 28.05.2013 14:25

Ап.

1) Как ведёт себя nginx(в связке с apache) в chroot окружении?
2) Что насчёт актуальности этого? Всё-таки два года уже прошло с момента написания статьи.
3) Может выкинуть apache и поднять nginx + php-fpm?

Twost 28.05.2013 16:49

Цитата:

Сообщение от mr.The (Сообщение 31948)
Ап.

1) Как ведёт себя nginx(в связке с apache) в chroot окружении?
2) Что насчёт актуальности этого? Всё-таки два года уже прошло с момента написания статьи.
3) Может выкинуть apache и поднять nginx + php-fpm?

Скажу так - это я уже не использую)

Использую как раз nginx + php-fpm.

Еще скажу честно - на момент написания этой заметки я многого не знал, поэтому статья не совсем актуальная, много недочетов. Исправлять не буду, пусть остается так.

mr.The 28.05.2013 17:53

Цитата:

Сообщение от Twost (Сообщение 31950)
Скажу так - это я уже не использую)

Использую как раз nginx + php-fpm.

Еще скажу честно - на момент написания этой заметки я многого не знал, поэтому статья не совсем актуальная, много недочетов. Исправлять не буду, пусть остается так.

Можешь рассказать, буквально в двух словах, про настройку безопасного "nginx + php-fpm"?

UPDATE:
Насколько я понял, для php-fpm можно в конфиге указать запуск от chroot и потом всё настроить по аналогии со статьёй.
В таком случае, nginx будет крутиться отдельно в основной системе, а не в песочнице?

hzkto 30.05.2013 20:21

Chroot как средство защиты не очень разумно зачастую, тут уже говорили об этом, ага.
А вот мандатный контроль доступа, в убунте по дефолту его обеспечивает AppArmor - крутотень.
Ну или можно совместить.

Для nginx есть приятный waf - https://code.google.com/p/naxsi/.

Molofya 18.01.2016 14:46

Цитата:

Сообщение от Twost (Сообщение 31950)
Еще скажу честно - на момент написания этой заметки я многого не знал, поэтому статья не совсем актуальная, много недочетов. Исправлять не буду, пусть остается так.

И тем не менее, это одна из лучших статей в рунете по максимально безопасной настройке сервера, по крайней мере именно в такой, развернутой и разжеванной форме.
Если бы у вас получилось найти время и обновить некоторые нюансы, сделав как раз упор на настройку nginx + php с максимальным изолированием, и так далее, чтобы даже в случае рута не смогли пробраться на основную машину, было бы очень продуктивно для начинающих админов.

У меня пока один вопрос с точки зрения безопасности, чем chroot лучше полноценной nix виртуалки? XEN,OpenVZ и так далее...
То есть что наиболее безопасно использовать, чтобы в случае взлома сайта и... тьфу тьфу получение ROOT прав в рамках виртуалки или chroot невозможно было бы пробраться на реальную linux машину


Часовой пояс GMT +3, время: 05:46.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot