解释:

解释:

我将在这个项目中使用 Ubuntu Linux。

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

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

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

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

答案1

码头工人你可以很容易地做到这一点。

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登录时,他们都会被放置在一个隔离的容器中,他们看不到容器之外的任何内容,甚至看不到其他用户的容器。
当他们注销时,容器将被自动删除。

注意:用户可以通过指定命令来避免这种情况。例如:ssh foo.example.com /bin/bash。如果担心安全性,您可以使用ForceCommand中的选项/etc/sshd_config


解释:

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

这将是一个假 shell,用户在登录时被迫运行。该脚本会将它们启动到 Docker 容器中,一旦注销,该容器就会自动清理。
 

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

我希望这是显而易见的:-)
 

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

这在您的系统上可能不是必需的,但在我的系统上,除非 shell 存在于/etc/shells.
 

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

我们创建一个新用户,将其 shell 设置为我们将创建的脚本。该脚本将强制它们启动到沙箱容器中。它们是该组的成员docker,以便用户可以启动新容器。
将用户放入 docker 组的另一种方法是授予他们对单个命令的 sudo 权限。
 

passwd testuser

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

答案2

您可以使用火狱受限外壳。它基本上将挂载、PID、IPC 和网络命名空间附加到通过 SSH 或 telnet 打开的常规 bash 会话。注销时虚拟环境会自动销毁。这是一个小指南:

如何使用 Linux 命名空间限制登录 Shell

相关内容