Помещение SSH пользователей в изолированное окружение FreeBSD

Thursday, 17 May 2007

http://www.rostovlinux.ru/content/view/3598/56/

Вступление

Периодически возникает необходимость дать ограниченный доступ пользователям по протоколу ssh. Например это может быть пользователь хостинга, которому необходима возможность вносить исправления непосредственно на сервере или же загружать контент используя безопасные протоколы. К сожалению классический ftp передает логин и пароль пользователя в открытом виде, что не всегда устраивает.

1. Установка

Все происходящее проверялось на Debian Etch и Suse Ent. 9

Необходимо загрузить последнюю версию пакета openssh с chroot патчем с сайта http://chrootssh.sourceforge.net/download/

Я использовал пакет openssh-4.5p1-chroot.tar.bz2.

Дополнительно могут понадобится пакеты:

zlib1g-dev

libssl-dev

Это относится к Debian, в случае другого дистрибутива, пакеты могут называться иначе.

Я использовал переменную –prefix при сборке, для того, чтобы не затереть тот openssh, который поставляется с системой.

Новый пакет я размещаю в отдельной директории. Это упростит обслуживание в дальнейшем.

Соответственно команда конфигурации:

./configure --prefix=/usr/local/chrooted-openssh

Далее собираем и устанавливаем пакет:

# make && make install

2. Создание chroot окружения

Немного ручной работы, необходимо создать окружение chroot. Допустим пользовательский сайт находится в директории: /var/www/client-site.com

Создадим дерево директорий:

# pwd

/var/www/client-site.com

# mkdir -p dev bin usr/local

Создадим псевдоустройства:

# mknod ./dev/zero c 13 12

# mknod ./dev/null c 13 2

Заполним окружение chroot.

Файлы необходимые в директории /var/www/client-site.com/bin:

cp, ls, mkdir, mv, rm, rmdir, bash

Файлы необходимые в директории /var/www/client-site.com/usr/lib:

ld-linux.so.2

libc.so.6

libdl.so.2

libncurses.so.5

Это тот минимум, который необходим для запуска /bin/bash

Опять таки, это в случае использования Debian, в любом другом случае перед копирование какого либо исполняемого файла в

/var/www/client-site.com/bin необходимо проверить, от каких библиотек зависит его выполнение и скопировать их также.

Например:

# ldd /bin/sh

linux-gate.so.1 => (0xffffe000)

libncurses.so.5 => /lib/libncurses.so.5 (0xa7f3c000)

libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xa7f38000)

libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xa7e06000)

/lib/ld-linux.so.2 (0xa7f84000)

Для проверки работоспособности chroot можно выполнить команду:

# chroot /var/www/client-site.com/ /bin/sh

После этого текущим корневым каталогом станет /var/www/client-site.com/, это можно проверить с помощью команд ls и pwd (если конечно, скопированы необходимы их библиотеки). :)

В случае если запуск chroot выдает что-то вроде:

chroot: cannot run command `/bin/sh': No such file or directory

Необходимо проверить все ли библиотеки скопированы в chroot окружение.

Проверьте с помощью ldd.

3. Настройка chrooted ssh

Необходимо изменить порт который будет слушать новый демон. По умолчанию 22, но у нас же уже есть один ssh, который слушает 22 порт.

Я использую порт 8022. Добиться этого можно добавив в файл

/usr/local/chrooted-openssh/etc/sshd_config строку:

Port 8022

Следующий шаг добавление пользователя который будет использовать эту тюрьму. :)

Стандартными средствами необходимо добавить пользователя.

Следует учесть, что если пользователь использует не bash, а какой-либо другой shell, необходимо скопировать shell и все необходимы ему библиотеки в chroot окружение.

# adduser --home /var/www/client-site.com --shell /bin/bash --no-create-home --gecos Test_chrooted chrooted

Adding user `chrooted' ...

Adding new group `chrooted' (1002) ...

Adding new user `chrooted' (1002) with group `chrooted' ...

Not creating home directory `/var/www/client-site.com'.

Enter new UNIX password:

Retype new UNIX password:

passwd: password updated successfully

На данном этапе пользователь chrooted имеет обычный доступ по ssh (не chrooted). Демон openssh определяет необходимость запихнуть в chroot

пользователя по наличию у него в поле home точки. Точка указывает каталог от которого начинается chroot. Т.е. поддиректорими точки должны

быть bin/, usr/ и прочие.

Т.е. в нашем случае необходимо изменить значение home пользователя на что-то вроде /var/www/client-site.com/./

После этого можно пробовать зайти по ssh (используя порт 8022) под пользователем chrooted.

Пользователь должен быть заперт в домашней директории.

После этого у пользователя остается возможность зайти с своим логином/паролем на стандартный ssh который слушает 22 порт.

Возможных решений два: не использовать стандартный ssh и полностью перейти на chrooted ssh. Либо же продолжать использовать оба запретив

пользователю вход с помощью директив: DenyGroups или DenyUsers в файле конфигурации sshd_config.

P.S. Часто возникают вопросы по поводу функциональности sftp-сервера в chroot. К сожалению имеющаяся на данный момент версия не реализует этого функционала. Точнее возможно и реализует, но я не нашел способа.

Зато нашел большое количество желающих это сделать. :) Подробнее можете посмотреть в листе рассылки архив которой доступен на сайте http://chrootssh.sourceforge.net/

Обновлено: 12.03.2015