Linux
即時複製和隔離使用者環境
我將在這個項目中使用 Ubuntu Linux。
為了在會議上培訓特定應用程序,我需要:
- 讓每個學生都能 ssh 到伺服器上的相同使用者帳戶
- 每次登錄時自動將使用者置於單獨的隔離環境中
- 每個隔離環境都包括應用程序、範例配置文件和標準 unix 工具集(例如 grep、awk、sort、uniq 等)。但是,只要使用者只能損壞自己的文件系統,訪問整個 linux 文件系統也可以孤立的環境,而不是其他人的環境。
- 當使用者 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
我希望這也是顯而易見的。