копирование и изоляция пользовательских сред на лету

8

Я буду использовать Ubuntu Linux для этого проекта.

Для обучения конкретной заявки на конференции мне нужно:

  1. Чтобы каждый студент мог иметь ssh для входа в одну учетную запись на сервере
  2. При каждом входе в систему автоматически помещать пользователя в отдельные изолированные среды
  3. Каждая изолированная среда включает в себя приложение, примеры файлов конфигурации и стандартный набор инструментов Unix (например, grep, awk, sort, uniq и т. Д.). Однако доступ ко всей файловой системе linux также хорош, если пользователь может только повредить свою собственную. изолированная среда, а не окружающая среда.
  4. Виртуальные среды должны быть уничтожены, когда пользовательский сеанс SSH заканчивается

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

Кто-нибудь знает, как я могу достичь этих целей? Какая технология, например, LXC, Chroot и т. Д. Лучше всего подходит для этого? Я возился с идеей использования .bash_profile и .bash_logout для управления созданием и уничтожением этих сред, но не уверен, какая технология способна создавать необходимые мне среды.

jonschipp
источник

Ответы:

8

С Docker вы можете сделать это очень легко.

docker pull ubuntu

docker run -t -i ubuntu /bin/bash
# make your changes and then log out
docker commit $(docker ps -a -q | head -n 1) sandbox

cat > /usr/local/bin/sandbox <<EOF
#!/bin/sh
exec docker run -t -i --rm=true sandbox /bin/bash
EOF
chmod a+x /usr/local/bin/sandbox

echo /usr/local/bin/sandbox >> /etc/shells

useradd testuser -g docker -s /usr/local/bin/sandbox
passwd testuser

Всякий раз, когда testuserвход в систему, они будут помещены в изолированный контейнер, где они не видят ничего вне его, даже контейнеров других пользователей.
Контейнер будет автоматически удален при выходе из системы.


Объяснение:

docker pull ubuntu

Здесь мы получаем базовое изображение, с которым мы будем работать. Docker предоставляет стандартные образы, и Ubuntu является одним из них.
 

docker run -t -i ubuntu /bin/bash
# make your changes and then log out

Здесь мы запускаем оболочку из образа Ubuntu. Любые сделанные вами изменения будут сохранены для ваших пользователей.
Вы также можете использовать Dockerfile для создания образа, но, на мой взгляд, это проще.
 

docker commit $(docker ps -a -q |  head -n 1) sandbox

Здесь мы конвертируем последний контейнер, который был запущен, в новый образ с именем sandbox.
 

cat > /usr/local/bin/sandbox <<EOF
#!/bin/sh
exec docker run -t -i --rm=true sandbox /bin/bash
EOF

Это будет поддельная оболочка, которую пользователь вынужден запускать при входе в систему. Скрипт запустит их в Docker-контейнер, который будет автоматически очищен, как только они выйдут из системы.
 

chmod a+x /usr/local/bin/sandbox

Надеюсь это очевидно :-)
 

echo /usr/local/bin/sandbox >> /etc/shells

Это может не требоваться в вашей системе, но в моем случае оболочка не может быть оболочкой входа в систему, если она не существует в /etc/shells.
 

useradd testuser -g docker -s /usr/local/bin/sandbox

Мы создаем нового пользователя, для которого в его оболочке установлен скрипт. Скрипт заставит их запускаться в контейнер песочницы. Они являются членами dockerгруппы, так что пользователь может запустить новый контейнер.
Альтернативой помещению пользователя в группу docker может быть предоставление ему разрешений sudo для одной команды.
 

passwd testuser

Надеюсь, это тоже очевидно.
 

Патрик
источник
2

Вы можете использовать ограниченную оболочку Firejail . Он в основном присоединяет пространства монтирования, PID, IPC и сети к обычному сеансу bash, открытому через SSH или telnet. Виртуальная среда автоматически уничтожается при выходе из системы. Это небольшое руководство:

Как ограничить оболочку входа в систему с помощью пространств имен Linux

netblue
источник