web-dev-qa-db-ja.com

その場でユーザー環境を複製および分離する

このプロジェクトではUbuntuLinuxを使用します。

会議で特定のアプリケーションをトレーニングするには、次のものが必要です。

  1. 各学生がサーバー上の同じユーザーアカウントにSSH接続できるようにするには
  2. ログインするたびに、ユーザーは自動的に個別の隔離された環境に置かれます
  3. 分離された各環境には、アプリケーション、設定ファイルの例、および標準のUNIXツールセット(grep、awk、sort、uniqなど)が含まれます。ただし、ユーザーが自分のファイルに損傷を与えることしかできない限り、Linuxファイルシステム全体へのアクセスも問題ありません。孤立した環境であり、他の環境ではありません。
  4. ユーザーのSSHセッションが終了すると、仮想環境を破棄する必要があります

#1では、シングルユーザーアカウントを作成したいので、学生ごとにアカウントを作成したり、ユーザー名とパスワードを配布したりする必要はありません。

誰かが私がこれらの目標を達成する方法を知っていますか?どのテクノロジー(例: LXC、Chrootなどがこれに最適ですか?私は、.bash_profileと.bash_logoutを使用してこれらの環境の作成と破棄を処理するというアイデアをいじっていますが、どのテクノロジーが必要な環境を作成できるかわかりません。

8
jonschipp

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はその1つです。

docker run -t -i ubuntu /bin/bash
# make your changes and then log out

ここでは、ubuntuイメージからシェルを起動します。行った変更はすべてユーザーのために保持されます。
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

これも明らかだと思います。

8
Patrick

Firejail 制限付きシェルを使用できます。基本的に、マウント、PID、IPC、およびネットワーク名前空間をSSHまたはtelnet経由で開かれる通常のbashセッションにアタッチします。仮想環境はログアウト時に自動的に破棄されます。これは小さなハウツーです。

Linux名前空間を使用してログインシェルを制限する方法

2
netblue