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

понедельник, 1 июня 2009 г.

ssh-доступ в chroot для FreeBSD.

Есть у меня тут один web-сервер. Крутится на FreeBSD. И понадобилось организовать ssh-достп для программистов, чтобы они могли работать с разрабатываемыми сайтами напрямую. Но при этом было жёсткое условие - кроме своей рабочей директории программисты не должны видеть ничего, находящегося в системе.
Гугл штука хорошая, много рассказал, но там были всякие решения типа установки патченных версий sshd на другом порту или ограниченного доступа по sftp. Ограниченного доступа слишком мало, а патчить и плодить на сервере нестандартные вещи я не люблю.
В конце концов было выработано такое решение.
1. Создаём дерево chroot.
# mkdir /usr/chroot/
# mkdir /usr/chroot/bin
# mkdir /usr/chroot/dev
# mkdir /usr/chroot/etc
# mkdir /usr/chroot/home
# mkdir /usr/chroot/lib
# mkdir /usr/chroot/libexec
# mkdir /usr/chroot/sbin
# mkdir /usr/chroot/tmp
# mkdir /usr/chroot/usr
# mkdir /usr/chroot/var
# mkdir /usr/chroot/var/run
2. Копируем нужные команды и библиотеки.
У меня для /usr/chroot/bin - это: bash cat cp id ls mc mkdir mv rm scp sh svn
И для /usr/chroot/sbin - ldconfig
Список команд полностью зависит от ваших потребностей.
Теперь надо положить туда все библиотеки, необходимые для работы этих команд. Сразу же небольшое уточнение. Так как список команд и библиотек относительно небольшой, я не стал заморачиваться с фряшной системой расположения их по дереву(/usr/local/bin), а сложил всё в корне.
Для того, чтобы определить, какие библиотеки нам нужны, воспользуемся утилитой ldd. Для удобства, я это делал так:
# ldd /usr/local/bin/bash | grep -v \/usr\/local\/bin\/bash | cut -f 2 -d \> | cut -f 1 -d \(
/lib/libncurses.so.7
/usr/local/lib/libintl.so.8
/usr/local/lib/libiconv.so.3
/lib/libc.so.7
Это список необходимого для bash. Для остального по аналогии. Все эти библиотеки копируем в /usr/chroot/lib
Кроме этого, надо добавить симлинки типа libintl.so -> libintl.so.8
# ln -s libintl.so.8 linintl.so
И скопировать дополнительные *.a и *.la файлы. Подробнее надо смотреть для каждой отдельной библиотеки. В итоге мы должны получить что-то такое:
# ls /usr/chroot/lib/ | grep intl
libintl.a
libintl.la
libintl.so
libintl.so.8
Разумеется, так надо сделать для каждой необходимой библиотеки.
Ну и разумеется нужно скопировать основную фряшную утилиту, отвечающую за подгрузку библиотек:
# cp /libexec/ld-elf.so.1 /usr/chroot/libexec/ld-elf.so.1
3. Дополнительный компоненты для работы утилит.
Одних библиотек мало. У примеру, тому же mc надо ещё кучу всего. Тут, к сожалению, невозможно как-то заранее предсказать, что именно понадобится. В каждом отдельном случае надо читать документацию на программу и гуглить, если выдаёт ошибки. Для mc надо дополнительно скопировать полностью директории /usr/share/misc/ и /usr/local/share/mc/ в соответствующие места в chroot'е.
Так же для него понадобятся файлы termcap и shells в /usr/chroot/etc
В /usr/chroot/tmp надо будет создать директорию mc-root
4. Теперь подгатавливаем пользователя.
# adduser
Создаём обычного пользователя, только в качестве shell'a указываем ему путь к вот такому скрипту:
#!/usr/local/bin/bash
#
/usr/local/bin/sudo /usr/sbin/chroot /usr/chroot /bin/bash
Скрипту даём права на исполнение. Если не установлен пакет sudo, ставим и в /usr/local/etc/sudoers(можно воспользоваться командой visudo, если vim не страшен) добавляем строку имя_нашего_пользователя ALL=(ALL) NOPASSWD: /usr/sbin/chroot. Если править этот файл руками, надо не забыть после правки убрать права на запись, потому как sudo будет ругаться.
Командой passwd задаём для него пароль.
5. Монтируем устройства.
# mount -t devfs devfs /usr/chroot/dev
Готово.
Теперь логнинясь по ssh этим пользователем, человек попадает в chroot, из которого выхода нет.
Но этот голый chroot мне не нужен. Мне нужен доступ к определённым проектам. Я сделал так:
Отмонтировал devfs. Далее:
# cd /usr/chroot
# tar -cjvf /usr/backups/chroot.tar.bz2 ./
# cd /path/to/www_project
# tar -xjvf /usr/backups/chroot.tar.bz2
# mount -t devfs devfs /path/to/www_project/dev
И последнимс штрихом создание нового файла chroot.sh для конкретного пользователя с новым путём вместо /usr/chroot.
Теперь программер имеет доступ по ssh к сайту и не больше.
Решение пока сырое. Работаю над автоматизацией создания всего этого, плюс над созданием общего для всех chroot.sh, берущего конечную директорию из конфига(собственно, сделать это просто, но руки не доходят - много работы).

Комментариев нет:

Отправить комментарий