我将在这个项目中使用 Ubuntu Linux。
为了在会议上培训特定应用程序,我需要:
- 让每个学生都能够 ssh 进入相同的服务器上的用户帐户
- 每次登录时自动将用户置于单独的隔离环境中
- 每个隔离环境包括应用程序、示例配置文件和标准 unix 工具集(例如 grep、awk、sort、uniq 等)。但是,只要用户只能损坏自己的文件系统,访问整个 Linux 文件系统也是可以的。孤立的环境,而不是其他人的环境。
- 当用户 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 会话。注销时虚拟环境会自动销毁。这是一个小指南: