Linux

即時複製和隔離使用者環境

  • May 13, 2014

我將在這個項目中使用 Ubuntu Linux。

為了在會議上培訓特定應用程序,我需要:

  1. 讓每個學生都能 ssh 到伺服器上的相同使用者帳戶
  2. 每次登錄時自動將使用者置於單獨的隔離環境中
  3. 每個隔離環境都包括應用程序、範例配置文件和標準 unix 工具集(例如 grep、awk、sort、uniq 等)。但是,只要使用者只能損壞自己的文件系統,訪問整個 linux 文件系統也可以孤立的環境,而不是其他人的環境。
  4. 當使用者 SSH 會話結束時,虛擬環境應該被銷毀

對於#1,我們希望使用單個使用者帳戶,這樣我們就不必為每個學生創建一個帳戶並分髮使用者名和密碼。

有誰知道我怎樣才能實現這些目標?哪種技術(例如 LXC、Chroot 等)最適合這個?我一直在玩弄使用 .bash_profile 和 .bash_logout 來處理這些環境的創建和銷毀的想法,但不確定哪種技術能夠創建我需要的環境。

使用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

這在您的系統上可能不需要,但在我的系統上,shell 不能是登錄 shell,除非它存在於/etc/shells.

 

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

我們創建一個新使用者,他們的 shell 設置為我們將創建的腳本。該腳本將強制它們啟動到沙盒容器中。他們是該docker組的成員,因此使用者可以啟動一個新容器。

將使用者放入 docker 組的另一種方法是授予他們對單個命令的 sudo 權限。

 

passwd testuser

我希望這也是顯而易見的。

引用自:https://unix.stackexchange.com/questions/126426