动态复制和隔离用户环境


8

我将为此项目使用Ubuntu Linux。

为了在会议上培训特定的应用程序,我需要:

  1. 为了使每个学生都能在服务器上使用相同的用户帐户
  2. 每次登录时,都会自动将用户置于单独的隔离环境中
  3. 每个隔离的环境都包括应用程序,示例配置文件和标准的UNIX工具集(例如grep,awk,sort,uniq等)。但是,只要用户只能损坏自己的Linux文件系统,也可以访问整个linux文件系统孤立的环境,而不是其他环境。
  4. 用户SSH会话结束时应销毁虚拟环境

对于#1,我们希望使用单个用户帐户,因此我们不必为每个学生创建一个帐户并分发用户名和密码。

有谁知道我如何实现这些目标?哪种技术(例如LXC,Chroot等)最适合?我一直在考虑使用.bash_profile和.bash_logout处理这些环境的创建和销毁的想法,但是不确定哪种技术能够创建我需要的环境。

Answers:


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映像启动shell。您所做的任何更改都将保留给您的用户。
您也可以使用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

我希望这也是显而易见的。
 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.