Щас крутая штука будет, фаер ин зе холл! Будем изолировать пользователя в 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$.
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. Ну ты понял.
Ладно, изучай, надеюсь, было читабельно. Увидимся завтра!








Комментарии
Виджет комментариев загружается с серверов Telegram и может использовать cookies. Разрешите внешние сервисы, чтобы открыть обсуждение.