Рис. 4.1. Схема работы chroot-окружения
На рис. 4.1 в рамку обведены папки, которые видны службе. Именно в этом пространстве будет работать сервис, считая, что это и есть реальная файловая система сервера.
Если хакер проникнет в систему через защищенную службу и захочет просмотреть директорию /etc, то он увидит каталог /home/chroot/etc, но никак не системный /etc. Чтобы взломщик ничего не заподозрил, в папке /home/chroot/etc можно расположить все необходимые файлы, но содержащие некорректную информацию. Злоумышленник, запросив файл /etc/passwd через уязвимый сервис, получит доступ к /home/chroot/etc/passwd, потому что служба видит его системным.
Так, например, файл /home/chroot/etc/passwd может содержать ложную информацию. На работу системы в целом это не повлияет, потому что ОС будет брать пароли из файла /etc/passwd, а службе реальные коды доступа в систему не нужны, поэтому в файл /home/chroot/etc/passwd можно засунуть все, что угодно.
4.7.2. Установка jail
Встроенная в Linux-систему программа chroot для создания "Виртуальное пространство" виртуальных пространств на сервере сложна и не очень удобна для применения. Нужно выполнить слишком много операций. Именно поэтому администраторы больше любят использовать программу jail, которую можно найти в Интернете по адресу http://www.jmcresearch.com/projeсts/jail/. Скачайте ее и поместите архив в свой каталог. Для того чтобы разархивировать его, нужно выполнить следующую команду:
tar xzvf jail.tar.gz
В текущей директории появится новый каталог jail с исходным кодом программы. Да, именно с исходным, потому что она открыта и поставляется в таком виде.
Теперь нужно перейти в каталог jail/src (cd jail/src) и отредактировать файл Makefile (например, редактором МС). В самом начале файла идет множество комментариев, и их мы опустим. После этого вы сможете увидеть следующие параметры:
ARCH=__LINUX__
#ARCH=__FREEBSD__
#ARCH=__IRIX__
#ARCH=__SOLARIS__
DEBUG = 0
INSTALL_DIR = /tmp/jail
PERL = /usr/bin/perl
ROOTUSER = root
ROOTGROUP = root
Вначале задается тип ОС, по умолчанию установлен LINUX. А следующие три строки для FreeBSD, Irix и Solaris закомментированы. Оставим все, как есть. Что нужно изменить, так это директорию для установки (параметр INSTALL_DIR). В последней версии (на момент написания книги) по умолчанию используется каталог /tmp/jail. Не знаю, зачем это сделали, ведь этот каталог предназначен для временных файлов и должен быть доступен для чтения абсолютно всем. Раньше по умолчанию был /usr/local, и именно его я советую здесь указать. Больше ничего менять не надо.
Для выполнения следующих директив вам понадобятся права root, поэтому войдите в систему как администратор или получите нужные права, запустив команду su root.
Перед компиляцией и установкой убедитесь, что у файла preinstall.sh есть права на выполнение. Если нет, то воспользуйтесь следующей командой:
chmod 755 preinstall.sh
Теперь все готово к установке. Находясь в директории jail/src, выполните команды:
make
make install
Если все прошло успешно, то в каталоге /usr/local/bin должны появиться программы: addjailsw, addjailuser, jail и mkjailenv.
4.7.3. Работа с программой jail
Для начала создадим каталог /home/chroot, который станет корневым для программы, на которой мы будем испытывать систему. Для этого выполним команду:
mkdir /home/chroot
Теперь нужно подготовить окружение для нормальной работы будущего сервиса. Для этого выполняем команду:
/usr/local/bin/mkjailenv /home/chroot
Посмотрите, что произошло с каталогом /home/chroot. Здесь появились две директории dev и etc. Как мы знаем, в директории dev должны быть описания устройств. В данном случае программа не стала делать полную копию системного каталога /dev, а ограничилась созданием трех основных устройств null, urandom и zero.
В директории etc можно также увидеть три файла: group, passwd и shadow. Это неполные копии системных файлов. Например, если взглянуть на файл passwd, то он будет содержать только следующие строки:
root:x:0:0:Flenov,Admin:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
Больше ничего не будет, и нет пользователя robert, которого мы создавали раньше (см. разд. 4.3). В файле shadow находятся теневые пароли. Проверьте права на этот файл, чтобы они были не более 600 (rw-------).
Тут есть один недостаток в безопасности — в файле /home/chroot/etc/shadow находится реальный зашифрованный пароль из /etc/shadow. Лучше удалите его, иначе злоумышленник, узнав пароль на сервис, сможет проникнуть на сервер через другую дверь, которая не защищена виртуальным каталогом.
Продолжаем настройку виртуальной корневой директории. Теперь нам нужно выполнить следующую команду:
/usr/local/bin/addjailsw /home/chroot
Во время отработки этой команды побежит множество информационных строчек о выполняемых действиях, которые заключаются в том, что в каталог /home/chroot копируются основные директории и программы. Например, в папку /home/chroot/bin будут скопированы такие программы, как cat, cp, ls, rm и т.д., и сервис будет использовать именно их, а не те, что расположены в основном каталоге /bin.
Программа копирует то, что считает нужным, но далеко не все из этого потребуется будущему сервису, который будет работать в виртуальной корневой директории. Лишнее следует удалить, но лучше это делать после того, как убедитесь, что все работает.
Необходимые программы есть и окружение готово. Теперь сюда можно установить сервис:
/usr/local/bin/addjailsw /home/chroot -Р httpd
В данном примере в новое окружение устанавливается программа httpd и все необходимые ей библиотеки. Программа jail сама определит, что нужно.
Теперь в новое окружение можно добавлять пользователя. Это выполняется командой:
/usr/local/bin/addjailuser chroot home sh name
Здесь chroot — это виртуальная корневая директория, в нашем случае должно быть /home/chroot. Параметр home — это домашний каталог пользователя относительно виртуальной директории. Аргументы sh — командный интерпретатор и name — имя пользователя, которого мы хотим добавить (уже должен существовать в основном окружении ОС).
Посмотрим, как можно добавить пользователя robert (он у нас уже есть) в виртуальную систему:
/usr/local/bin/addjailuser /home/chroot
/home/robert /bin/bash Robert
У меня команда не уместилась в одну строку, поэтому я сделал перенос с помощью символа (обозначает, что директива не закончилась и есть продолжение в следующей строке).
Если параметры указаны верно, то вы должны увидеть уведомление "Done", иначе будет выведено сообщение об ошибке.
Для запуска сервера httpd (в Linux это сервер Apache) в виртуальном окружении должен быть пользователь apache. В реальной оболочке он есть. Давайте посмотрим его параметры и создадим такого же:
/usr/local/bin/addjailuser /home/chroot
/var/www /bin/false apache
Как теперь попасть в новое окружение? Выполните команду:
chroot /home/chroot
И вы окажитесь в новом окружении. Только учтите, что большинство команд здесь не работает. Так, например, мы не установили программу МС, поэтому вы не сможете ею воспользоваться.
Чтобы убедиться, что вы находитесь в виртуальном окружении, выполните команду:
ls -al /etc
Вы увидите всего несколько файлов, которые составляют малую часть того, что доступно в реальном каталоге /etc. Можете просмотреть файл /etc/passwd, и в нем будут только пользователи виртуального окружения. Если хакер взломает его, то он получит исключительно эти данные и сможет уничтожить лишь содержимое каталога /home/chroot. Вся остальная файловая система останется целой и невредимой.
Для запуска httpd нужно выполнить в виртуальном окружении команду:
/usr/sbin/httpd
4.8. Получение прав root
Теперь у нас есть достаточно информации о доступе, и мы можем рассмотреть типичный метод взломщика для получения прав root и способы маскировки в системе.
Допустим, что злоумышленник приобрел возможность выполнять какие-либо системные команды от имени (с правами) root. Сидеть под этой учетной записью будет слишком опасно и вызывающе. К тому же изменять пароль root нельзя.
Как же тогда входить под другим именем и в то же время использовать максимальные права? Давайте вспомним, как Linux работает с правами. В файле /etc/passwd хранятся записи пользователей в следующем виде:
robert:x:501:501::/home/robert:/bin/bash
Третий и четвертый параметры — это идентификаторы пользователя и группы соответственно. Когда на объекты выделяются права, то система сохраняет только идентификаторы. Что это значит? Допустим, что у вас есть пользователь robert с идентификатором 501. Вы создали еще одного пользователя Dan и дали ему такой же идентификатор. Теперь обе учетные записи с одинаковыми ID будут разделять владение одними и теми же объектами.