Создание смешного chroot для ssh для пользователей виртуального хостинга под debian

May 29, 2013 13:39

Что я хотел получить? Я хотел чтобы каждый отдельный пользователь отдельного сайта виртуального хостинга мог логиниться по ssh на свервер, но так, чтобы попадать в свою индивидуальную chroot среду, чтобы не попортить шкурку основному серверу. Если вам нужно то же самое, то сразу хочу заметить, что с поставленной задачей я не справился справился только частично. То есть у меня всё получилось, но сделать при помощи этой поделки что-то полезное у меня не получается, разве что vi или tail -f. Из того, чем я могу пользоваться сейчас tail, grep, vi в пределах файлов сайта, логов и временного каталога. mc и crontab не хотят работать, потому что какие-то свои совсем мудрёные заморочки с определением личности пользователя (почему - объяснию позже).

Как выглядит chroot в теории? Мы создаём внутри какого-то каталога файловую структуру линуксовой системы, монтируем туда из базовой системы папки /proc, /sys и /dev. И после этого говорим, что какой-то процесс и все его дети будут работать в этой "системе". Так вот, основная загвоздка в том, что если я воссоздавая файловую структуру (каталоги /bin, /etc, /sbin, /usr и прочие /var) сделаю полные копии того, что есть в базовой системе, то это будет во-первых, занимать много места, а во-вторых, это будет совсем другая сущность системы. То есть в ней нельзя будет изменить crontab "головной" системы. Поэтому я буду убивать двух других зайцев: делать "затычку" для ssh, что бы пользователь зашел по ssh, но не увидел всей системы (это лучше считать шуткой), и во-вторых, возможность доступа пользователя не только к своему каталогу на файловом уровне (через ftp), но и через консоль, например, для grep, который позволяет найти что-то полезное в логе не выкачивая его целиком. :-)

Создание полноценных chroot мне не подходит, но вполне подходит метод из этой статьи.

1) Для того, чтобы не плодить сущности, я скомпилировал из двух скриптик для создания виртуальной среды в моём понимании:#!/bin/bash

# каталог, в котором будет создаваться среда. Я буду запускать скрипт с параметром /home/example
CHROOT=$1

mkdir $CHROOT

# какие команды мы хотим предоставить пользователям?
CMDS="ls cat echo rm bash vi grep"

#находим исполняемые файлы от этих команд
CMDS=`which $CMDS`

# копирование команд из этого списка
for cmd in $CMDS; do
cp --parents $cmd $CHROOT
done

# копирование библиотек, для программ из этого списка
for i in $( ldd $CMDS | grep -v dynamic | cut -d " " -f 3 | sed 's/://' | sort | uniq )
do
cp --parents $i $CHROOT
done

# ARCH amd64
if [ -f /lib64/ld-linux-x86-64.so.2 ]; then
cp --parents /lib64/ld-linux-x86-64.so.2 /$CHROOT
fi

# ARCH i386
if [ -f /lib/ld-linux.so.2 ]; then
cp --parents /lib/ld-linux.so.2 /$CHROOT
fi

echo "Среда окружения создана, для входа в неё: chroot $CHROOT"

2) Создаём группу sudo groupadd chrootssh и добавляем в неё пользователя sudo adduser example chrootssh

3) Добавляем в файл /etc/ssh/sshd_config следующие строки:Match group chrootssh
ChrootDirectory %h
и перезапускаем sshd: sudo service ssh restart
4) Можно логиниться извне по ssh.

sshd, debian, virtual hosting, chroot, ssh

Previous post Next post
Up