Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #93, СЕНТЯБРЬ 2006 г.

Под защитой песочного демона

Евгений Зобнин ака j1m

Хакер, номер #093, стр. 093-118-4


2 В каталог /bin корневой машины ложится файл ssh-shell, примерно такого содержания:

# vi /bin/ssh-shell

!#/bin/sh

/usr/bin/sudo /usr/bin/chroot /usr/chroot/ssh /bin/su - $USER "$@"

3 В файл /etc/sudoers корневой машины добавляется запись следующего вида:

# visudo

user ALL=NOPASSWD: /usr/bin/chroot, /bin/su - user

4 Также в корневую машину добавляется юзер с домашним каталогом /usr/chroot/ssh/home/user и группой sshuser, причем в качестве шелла ему назначается /bin/ssh-shell.

5 В файл /etc/passwd chroot-окружения добавляются пользователи root и user, а в файл /etc/group группа root и sshusers.

В результате вырисовывается очень интересная картина. После регистрации пользователь, у которого в качестве шелла указан /bin/ssh-shell, сам того не подозревая, выполняет прописанные в этом файле команды и попадает в chroot-окружение, а все остальные могут ходить по корню. Такой вот пример костыльно-велосипедного подхода, демонстрация "пути линуксойда" во всей красе. Лучше уж патчить OpenSSH. Хотя нет, погодите, ведь главная задача ssh, помимо шифрования трафика, авторизация пользователей. А эта процедура в последние годы неразрывно связана с технологией PAM. Может быть мы сможем использовать ее возможности в наших целях?

PAM-модуль с нужной нам функциональностью действительно существует и входит в поставку многих дистрибутивов. Называется он pam_chroot, а принцип его работы прост, как сапог - он делает chroot для всех пользователей, прописанных в конфиге. Кроме того, способ, основанный на использовании этого модуля, является наименее трудозатратным из всех ранее изложенных. Смотри сам:

1 Создаем "песочницу", используя скрипт ~/bin/mkchroot.

2 Создаем группу sshusers и заводим пользователей.

3 Выполняем две команды (вторая должна быть продублирована для каждого юзера):

# echo "session required pam_chroot.so" >> /etc/pam.d/ssh

# echo "user /usr/chroot/ssh" >> /etc/security/chroot.conf

4 Перезапускаем sshd.

Правда есть один маленький нюанс. Системный вызов chroot может исполнять только root, поэтому sshd до самого логина пользователя должен работать с соответствующими правами. По умолчанию sshd время от времени понижает свои привилегии до пользователя sshd, но это можно исправить, добавив в конфиг строку "UsePrivilegeSeparation no".

[огнеупорный ssh]

Поместить ssh в chroot-окружение и обеспечить его бесперебойную работу - еще половина дела. Необходимо также правильно настроить брандмауэр и защитить все остальные сервисы от проникновения из вне. Ниже приведен фрагмент конфига iptables (eth1 - это внешний сетевой интерфейс).

Настраиваем брандмауэр

IT='/usr/sbin/iptables'

# очищаем правила

$IT -F

$IT -P INPUT DROP

$IT -P FORWARD DROP

$IT -P OUTPUT DROP

# пропускаем все пакеты наружу

$IT -A OUTPUT -j ACCEPT

# принимаем все пакеты с интерфейса обратной петли

$IT -A INPUT -i lo -d 127.0.0.1 -p ALL -j ACCEPT

# принимаем трафик установленных соединений

$IT -A INPUT -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

Назад на стр. 093-118-3  Содержание  Вперед на стр. 093-118-5