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->pw_gid) == -l) bail (“setgid"); if ( setuid(pw->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.
Please enter a file name: /etc/passwd
You entered /etc/passwd
Contents of /etc/passwd:
this is the chrooted /etc/passwd
Запуск программ в замкнутой среде chroot
Для запуска любой программы, хранящейся в каталоге, замкнутом с помощью утилиты chroot, используется следующая команда chroot.
В этом примере с помощью chroot проведена замена суперпользователя для каталога /usr/local/convict и затем запущена нужная программа (/bin/convict). Поскольку сначала была выполнена команда chroot, то программа /bin/convict в действительности запускается в /usr/local/convict/bin/convict реальной файловой системы.
Создание каталога для замкнутой среды chroot
Одна из проблем при использовании утилиты chroot заключается в том, что все программы и библиотеки, необходимые для работы защищаемой программы, должны быть скопированы в chroot-каталог (то есть в замкнутую среду chroot). При запуске в замкнутой среде утилиты /bin/ls мы не можем получить доступ к реальному каталогу /bin. Поэтому необходимо в самой замкнутой среде создать этот каталог и скопировать в него программный код утилиты ls. Для утилиты ls также требуется несколько библиотек, что продемонстрировано с помощью команды ldd.
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.
Cell
Кароль Фенелли (Carole Fenelly) написала весьма полезную статью, которая содержит программный код, пригодный для использования при создании замкнутой среды chroot. С помощью сценариев командного интерпретатора и некоторых конфигурационных файлов относительно просто можно создать замкнутые пространства для безопасной работы любой программы.
Программа jailer брандмауэра Zorp
Компанией BalaBit IT Ltd был создан брандмауэр с функциями proxy-сервера под названием Zorp. В программный пакет этого брандмауэра входит программа jailer, которая может использоваться для упрощения работы с утилитой chroot.
Программа jailer использует файл config, в котором перечисляются пакеты (пакеты Debian, а не пакеты RPM), которые следует установить в замкнутой среде, дополнительно ко всем необходимым файлам. Эта программа определяет зависимости пакета и автоматически добавляет необходимые данные в замкнутую среду chroot.
#include <stdlib.h>
#include <fcntl.h>
#include<sys/types.h>
#include <unistd.h>
#include <pwd.h>
Благодарю, очень подробно и интересно. Жаль, что и с этой утилитой существуют проблемы — ну, копирование всех библиотек в в chroot-каталог, это занимает дополнительное время. Ну, зато овчинка стоит выделки!
Этот блог находят по фразам
* Ищу Вирусы под Линукс
вот народ пошел =) покушаются на опен сорс сволочи.
что-то как-то сложно все!
очень полезная статья
Ну да, прочел не понял… перечилат второй раз уже лучше.
По поводлу времени- да, долго.
Спасибо за статью! Обязательно воспользуюсь вашими советами.
Прочел — не понял. Прочел еще раз — ещ раз не понял. Прочитать что ли в третий раз? Нет, так программером не стать. Надо идти куда-нибудь учиться.