• Категории
  • Подписка
  • Разместить статью
20/10/10 7 2699 Дополнительная безопасность
-

chroot: повышаем безопасность, изменяя корневой каталог

Существуют еще средства безопасности, используемые в Linux и других UNIX-подобных системах, одним из таких является возможность изменения корневого каталога, который доступен для конкретного процесса. Это позволяет ограничить зону действия программ, особенно по­тенциально уязвимых служб, которые могут быть взломаны хакерами.

Если хакер обнаружит уязвимое место в сетевой службе (например, в программе sendmail или пакете BIND), он сможет подключиться к компьютеру и получить доступ ко всей файло­вой системе этого компьютера. Если программа не запущена с правами root, он постарается уже локально найти другое уязвимое место и расширить свои привилегии для получения неограни­ченных прав. Поскольку локальных уязвимых мест всегда больше, чем уязвимых мест, доступных по сети, то у хакера будут хорошие шансы на успех. И даже если хакеру не удастся получить нуж­ные привилегии, он может нанести серьезный ущерб, например, удалив важные файлы.

Защита служб с помощью chroot

Создание замкнутого пространства с помощью утилиты chroot является эффективным средством для более безопасного запуска программ. При этом зона действия этих программ ог­раничивается частью общего дерева каталогов. Предположим, что нам нужно создать замкнутое пространство для работы условной программы convict. Ограничим зону ее действия частью дерева каталогов /usr/local/convict. Создание замкнутого пространства заключается в том, что программа convict сможет «видеть» только этот каталог и файлы в подкаталогах это­го каталога. Если программа открывает файл /jury/verdict.txt, то запрошенный файл на самом деле сохраняется как /usr/local/convict/jury/verdict.txt. Таким образом, и при доступе к файлу/etc/localtime на самом деле осуществляется доступ к файлу из замк­нутого пространства программы convict — /usr/local/convict/etc/localtime.

В качестве примера программы для создания замкнутого пространства chroot рассмотрим простую программу на языке С, которая вызывает функцию chroot(). Аргументом для этой функции служит путь к каталогу, которым должна ограничиваться зона действия указанной программы.

#include < stdio.h>
#include < stdlib.h> 
#include < fcntl.h> 
#include < sys/types.h>
#include < unistd.h>
#include < pwd.h>
 
#define CONVICT "bri"
#define CHROOT_DIR  "/usr/local/convict”
#define bail(x) (perror(x); exit(1); )
int main()    {
     char  filename[4096], buf[BUFSIZ];
     int   fd,   count;
struct passwd *pw = getpwnam(CONVlCT);
if ( ! pw ) bail ("getpwnam");
if ( chdir(CHROOT_DIR)  == -1) bail ("chdir");
if ( enroot(CHROOT_DIR) == -1 bail ("chroot");
if ( setgid(pw-&gt;pw_gid) == -l) bail (“setgid");
if ( setuid(pw-&gt;pw_uid) == -1) bail (“setuid");
 
printf("Please enter a file name: ");
scanf("%4095s", filename);
printf("You entered %s\n", filename);
if ( (fd=open(filename, O_RDONLY)) > 0) {
    printf("Contents of %s:\n", filename);
    while ( (count=read(fd, buf, BUFSIZ)) > 0 ) {
             write (l, buf, count) ;
    }
} else {
printf("Failed to open  %s\n",   filename);
            }

В каталоге программы convict есть каталог под именем etc, и в этом каталоге содержится файл passwd, содержимое которого показано ниже.

this   is  the chrooted /etc/passwd

Очевидно, что содержимое этого файла отличается от содержимого знакомого файла /etc/passwd. Для программы, работающей в замкнутом пространстве chroot, при вызове файла /etc/passwd на самом деле будет открыт файл /usr/local/convict/etc/passwd.

root# ./convict

Please enter a file name: /etc/passwd

You entered /etc/passwd

Contents of /etc/passwd:

this is the chrooted /etc/passwd

Запуск программ в замкнутой среде chroot

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

root# chroot /usr/local/convict/bin/convict

В этом примере с помощью chroot проведена замена суперпользователя для каталога /usr/local/convict и затем запущена нужная программа (/bin/convict). Поскольку сначала была выполнена команда chroot, то программа /bin/convict в действительности запускается в /usr/local/convict/bin/convict реальной файловой системы.

Создание каталога для замкнутой среды chroot

Одна из проблем при использовании утилиты chroot заключается в том, что все програм­мы и библиотеки, необходимые для работы защищаемой программы, должны быть скопиро­ваны в chroot-каталог (то есть в замкнутую среду chroot). При запуске в замкнутой среде утилиты /bin/ls мы не можем получить доступ к реальному каталогу /bin. Поэтому необхо­димо в самой замкнутой среде создать этот каталог и скопировать в него программный код ути­литы ls. Для утилиты ls также требуется несколько библиотек, что продемонстрировано с по­мощью команды ldd.

Jdoe$ ldd /bin/l*

libtermcap.SO.2 => /lib/libtermcap.so.2 (0x40033000)

libc.so.6 => /lib/i686/libc.so.6 (0x40037000)

/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

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

Jail

С набором программ на языках С и Perl, объединенных в пакет под названием Jail Chroot Project. Программа addjailsw автоматически устанавливает необходимые каталоги и файлы. Из ка­талога /bin эта программа копирует в замкнутую среду значительное количество программ для отладки (например, cp и more). Затем, она запускает программу, которую необходимо защи­тить с помощью замкнутой среды chroot совместно с утилитой strace (для просмотра сис­темных вызовов, осуществляемых этой программой), и копирует все необходимые файлы в замкнутую среду. Пакет Jail также включает в себя программы, которые используются для соз­дания новых пользователей в замкнутой среде chroot, а также программы для установки дру­гих часто используемых файлов из каталога /dev, например /dev/null.

Программа Jail Chroot Project копирует слишком много файлов в замкнутую среду chroot, поэтому необходима отладка и удаление лишней информа­ции. В частности, это касается файлов из каталогов /bin и /usr/bin и реальных записей в файле /etc/passwd.

Cell

Кароль Фенелли (Carole Fenelly) написала весьма полезную статью, которая содержит программный код, пригод­ный для использования при создании замкнутой среды chroot. С помощью сценариев ко­мандного интерпретатора и некоторых конфигурационных файлов относительно просто можно создать замкнутые пространства для безопасной работы любой программы.

Программа jailer брандмауэра Zorp

Компанией BalaBit IT Ltd был создан брандмауэр с функциями proxy-сервера под названием Zorp. В программный пакет этого брандмауэра вхо­дит программа jailer, которая может использоваться для упрощения работы с утилитой chroot.

Программа jailer использует файл config, в котором перечисляются пакеты (пакеты Debian, а не пакеты RPM), которые следует установить в замкнутой среде, дополнительно ко всем необходимым файлам. Эта программа определяет зависимости пакета и автоматически добавляет необходимые данные в замкнутую среду chroot.

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include<sys/types.h>
#include <unistd.h>
#include <pwd.h>

7 комментариев на «“chroot: повышаем безопасность, изменяя корневой каталог”»

  1. zolo:

    Благодарю, очень подробно и интересно. Жаль, что и с этой утилитой существуют проблемы — ну, копирование всех библиотек в в chroot-каталог, это занимает дополнительное время. Ну, зато овчинка стоит выделки!

  2. Этот блог находят по фразам

    * Ищу Вирусы под Линукс

    вот народ пошел =) покушаются на опен сорс сволочи.

  3. Инна:

    что-то как-то сложно все!

  4. очень полезная статья

  5. Григорий:

    Ну да, прочел не понял… перечилат второй раз уже лучше.
    По поводлу времени- да, долго.

  6. BloodBlade3000:

    Спасибо за статью! Обязательно воспользуюсь вашими советами.

  7. Прочел — не понял. Прочел еще раз — ещ раз не понял. Прочитать что ли в третий раз? Нет, так программером не стать. Надо идти куда-нибудь учиться.

Добавить комментарий

Яндекс.Метрика