Щас крутая штука будет, фаер ин зе холл! Будем изолировать пользователя в Linux и позволим ему запускать только разрешённые утилиты и команды. Короче говоря, закейджим.

Для этого понадобится chroot, заходим под рутом и готовим подопытную папку env:

cd / && mkdir env
mkdir /env/{bin,lib,lib64}

Chroot создаёт новую среду оболочки, что означает, что любые изменения, внесённые в эту среду, будут влиять только на файлы и каталоги в среде Chroot, а не на центральную нервную систему.

Папку создали, ок, теперь давай закинем в неё сам интерпретатор Bash. После того как пользователь зайдёт на сервер по SSH, запустится Bash в изолированной среде.

Чтобы определить, какие библиотеки использует утилита, воспользуемся утилитой ldd.

ldd /bin/bash

Команда ldd осуществляет вывод списка разделяемых библиотек, используемых исполняемыми файлами или разделяемыми библиотеками.

На экран вывелись библиотеки, которые использует Bash:

libtinfo.so.6 => /lib/libtinfo.so.6
libc.so.6 => /lib/libc.so.6
/lib64/ld-linux.so.2

Их нужно закинуть в папку env, вот так:

cp /usr/bin/bash /env/bin
cp /lib/libtinfo.so.6 /env/lib
cp /lib/libc.so.6 /env/lib
cp /lib64/ld-linux.so.2 /env/lib64

Всё. Базовая изоляция готова. Для того чтобы после авторизации на сервере пользователь попал в изолированную папку, делаем так.

Добавляем в конфиг /etc/ssh/sshd_config:

Match User user
ChrootDirectory /env

В первой строке в конце указывается имя пользователя, которого будем изолировать. У меня в системе есть пользователь user, я его и указываю.

Далее дёргаем systemctl restart sshd и пробуем залогиниться на сервер под пользователем:

ssh user@bashdayz.ru

Если всё сделал правильно, то поздравляю: ты изолировал пользователя в системе и должен увидеть командную строку и что-то вроде -bash-5.1$.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Самый сок в том, что никакие команды сейчас не работают, что бы ты ни вводил. Ты можешь лишь посмотреть версию bash --version или другие её ключи.

Для того чтобы добавить в эту клетку другие утилиты, повторяешь трюк с ldd, копируешь бинарник и библиотеки.

Таким образом, ты можешь делать кастрированный доступ по SSH, например для своих студентов либо для каких-то публичных квестов.

Добавляем ls в клетку

ldd /usr/bin/ls

cp /usr/bin/ls /env/bin
cp /lib/libselinux.so.1 /env/lib/
cp /lib/libc.so.6 /env/lib/
cp /lib64/ld-linux.so.2 /env/lib64
cp /lib/libpcre2-8.so.0 /env/lib/libpcre2-8.so.0

Смотрим зависимости через ldd и копируем их в нашу изолированную папку env. Теперь возвращаемся в терминал к пользователю user и пробуем запустить ls. Опа! Работает! Прекрасно! Попробуй теперь посмотреть файловую систему с помощью ls и убедись в наличии клетки.

Тема с chroot очень клёвая: помимо того, что мы с тобой сейчас провернули, в chroot можно устанавливать полноценные дистрибутивы Linux — возможно, у тебя был сексуальный опыт с Gentoo. Либо примонтировать proc/sys/dev/run с хостовой машины и сделать работу в chroot идеальной. Но это не совсем безопасно, тут уже тебе выбирать: удобство или паранойю.

А можно сделать 10 папок и 10 пользователей и в каждую папку воткнуть свой дистрибутив. Логинишься под user1 и попадаешь в Kali, логинишься под user2 и попадаешь в CentOS. Ну ты понял.

Ладно, изучай, надеюсь, было читабельно. Увидимся завтра!