Создание chroot окружения в Fedora с помощью yum
23.10.2009
Большинство современных linux-дистрибутивов поставляется с различными технологиями, направленными на повышение безопасности. Среди них есть например: SELinux, AppArmor, ExecShield, Iptables. Отключение неиспользуемых сервисов также делает систему более безопасной. Тем не менее, хакеры все-же могут найти способы обойти вышеописанные методы защиты.

Чтобы свести к минимуму вероятность того, что взлом какой-то одной технологии или программы приведет к полному взлому всей системы, приложения могут быть запущены в так называемом chroot окружении. Это изолированное окружение, которое не имеет доступа к основной системе и содержит минимальный набор исполняемых файлов и библиотек, которые необходимы для работы приложения.

Существует 2 варианта chroot-окружения:
  1. Полное изолированное окружение для приложения, окружение содержит в себе все пакеты, от которых зависит приложение.
  2. Частичная изоляция приложения, окружение включает в себя только базовый набор библиотек, необходимых для работы приложения.

В этой статье будет показано как создать полную изоляцию приложения с помощью yum.

Создание chroot окружения с помощью yum


При полной изоляции приложения необходимо установить пакет приложения и все его зависимости. Это довольно легко сделать в таких системах как Fedora, CentOS и Redhat linux, так как утилиты rpm и yum позволяют устанавливать пакеты, используя альтернативный корневой каталог. Этот каталог будет использоваться в качестве корневой файловой системы и взломав приложение, хакеры смогут получить доступ только к файлам данного каталога.


Чтобы создать полную изоляцию, например сервера Apache (httpd), сначала мы должны создать базу данных RPM пакетов в нашем новом каталоге (в этой статье мы будем использовать каталог /chroot/webapp1):

$ mkdir -p /chroot/webapp1/var/lib/rpm
$ rpm --root /chroot/webapp1 --initdb

Первая команда создаст директории для базы данных RPM пакетов, вторая — проинициализирует базу данных. После этого мы можем загрузить релиз-пакет и установить его, используя команды:

$ yumdownloader --destdir=/var/tmp fedora-release $ cd /var/tmp $ rpm --root /chroot/webapp1 -ivh --nodeps fedora-release*rpm

Если вы используете не Fedora, а CentOS или RHEL, вы должны использовать релиз-пакеты этих систем. Если установка прошла нормально, мы можем установить httpd, использую флаг "- installroot" для установки его в нашу директорию:

$ yum --installroot=/chroot/webapp1 -y install httpd
После установки ваша chroot-директория должна иметь структуру, аналогичную корневой файловой системе:

$ cd /chroot/webapp1
$ ls -la
total 84
drwxr-xr-x  21 root root 4096 2009-08-08 09:44 .
drwxrwxrwt.  3 root root 4096 2009-08-08 09:40 ..
drwxr-xr-x   2 root root 4096 2009-08-08 09:45 bin
drwxr-xr-x   3 root root 4096 2009-08-08 09:45 boot
drwxr-xr-x   2 root root 4096 2009-08-08 09:44 dev
drwxr-xr-x  46 root root 4096 2009-08-08 09:45 etc
drwxr-xr-x   2 root root 4096 2009-03-04 08:13 home
drwxr-xr-x   7 root root 4096 2009-08-08 09:45 lib
drwxr-xr-x   5 root root 4096 2009-08-08 09:45 lib64
drwxr-xr-x   2 root root 4096 2009-03-04 08:13 media
drwxr-xr-x   2 root root 4096 2009-03-04 08:13 mnt
drwxr-xr-x   2 root root 4096 2009-03-04 08:13 opt
dr-xr-xr-x   2 root root 4096 2009-03-04 08:13 proc
drwxr-x---   2 root root 4096 2009-03-04 08:13 root
drwxr-xr-x   2 root root 4096 2009-08-08 09:45 sbin
drwxr-xr-x   2 root root 4096 2009-03-04 08:13 selinux
drwxr-xr-x   2 root root 4096 2009-03-04 08:13 srv
drwxr-xr-x   2 root root 4096 2009-03-04 08:13 sys
drwxrwxrwt   2 root root 4096 2009-08-08 09:45 tmp
drwxr-xr-x  14 root root 4096 2009-08-08 09:45 usr
drwxr-xr-x  18 root root 4096 2009-08-08 09:45 var

Chroot-окружение будет содержать все необходимое для запуска приложений, но перед этим нужно еще кое-что настроить. Для запуска приложений в chroot-окружении вы можете запустить команду chroot, передав ей скрипт инициализации или просто сам исполняемый файл:

$ chroot /chroot/webapp1 /usr/sbin/apachectl start
$ ps auxww | grep [h]ttpd
root      2365  0.2  0.0 171536  3732 ?        Ss   09:51   0:00 /usr/sbin/httpd -k start
apache    2366  0.0  0.0 171536  2464 ?        S    09:51   0:00 /usr/sbin/httpd -k start
apache    2367  0.0  0.0 171536  2464 ?        S    09:51   0:00 /usr/sbin/httpd -k start
apache    2368  0.0  0.0 171536  2464 ?        S    09:51   0:00 /usr/sbin/httpd -k start
apache    2369  0.0  0.0 171536  2464 ?        S    09:51   0:00 /usr/sbin/httpd -k start
apache    2370  0.0  0.0 171536  2464 ?        S    09:51   0:00 /usr/sbin/httpd -k start
apache    2371  0.0  0.0 171536  2464 ?        S    09:51   0:00 /usr/sbin/httpd -k start
apache    2372  0.0  0.0 171536  2464 ?        S    09:51   0:00 /usr/sbin/httpd -k start
apache    2373  0.0  0.0 171536  2464 ?        S    09:51   0:00 /usr/sbin/httpd -k start


Чтобы удостовериться что приложение использует chroot окружение, которое мы настроили, можно запустить утилиту pwdx, передав ей PID запущенного httpd процесса:

$ pwdx 2365 2365: /chroot/webapp1

Если приложение успешно стартовало, вы сможете подключиться к нему для проверки его работы. Chroot-окружение, которое мы создали, требует периодического обновления как для повышения его безопасности, так и для минимизации количества пакетов, установленных в нем.

Заключение

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