SELinuxサンドボックスで学生の課題として作成されたプログラムを実行したい(一部の学生が最初に「楽しい」ことをしようとしているかどうかを厳密にチェックすることなく、課題の採点の最初の部分として出力と動作をチェックするため)。
ほとんどの割り当ては、入力を読み取り、出力を生成するだけです。システム上のファイルを読み取る人もいます。次に、システム上の誰でも読み取り可能なファイルを読み取れるようにするだけです。
ただsandbox assignment.py
いくつかの点で正常に機能します。サンドボックスは、CentOS 7のSElinuxサンドボックスのpolicycoreutils-pythonからのものです。そうすると、assignment.pyはファイルの書き込み、ネットへのアクセス、その他の悪いことを行うことができなくなります。しかし、それでも私のファイルを読み取ることができます。
実際にはローカルファイルを読み取ることはできますが、NFSマウントされたファイルを読み取ることはできません。 sandbox -t sandbox_min_t
NFSマウントされたファイルにもアクセスできますが(必要です)、問題は、テストされたプログラムがすべてのファイルにアクセスできることです。世界で読み取り可能なファイルのみにアクセスできるように、または指定されたユーザーのみが読み取り可能なファイルにアクセスできるようにするにはどうすればよいですか?
(他のサンドボックスでこれを実現する方が簡単な場合は、CentOSで利用可能な別のサンドボックスを使用することもできます。)
(プログラムをテストするためだけに新しいユーザーアカウントを作成する必要はありません。これは複数の教師/アシスタントに必要になる可能性があり、アカウントを個人用にし、ユーザーの名前空間が乱雑にならないようにしたいためです。これらがたくさんあります。)
すでに開いているファイル記述子の読み取りと書き込みを可能にする比較的単純なサンドボックスは、 seccomp
を使用して実装できます。 pythonプログラムはサンドボックスを初期化し、信頼できないスクリプトを実行します。 libseccomp 2.2.0(LWN) Pythonからlibseccomp2APIを使用する方法の一般的な例があります。
SELinuxサンドボックスは、信頼できないアプリケーションを実行するためのより一般的なサンドボックスを提供できます。 sandbox
コマンドには、ファイルへのアクセスを防ぐのに十分な便利なオプションがいくつかあります。 -M
オプション、ホームディレクトリと一時ディレクトリはtmpfsマウントでマスクされ、サンドボックスが基になるファイルにアクセスできないようにします。一緒に -i
オプションでは、必要なファイルを一時ディレクトリにコピーできます。ファイルが大きくない場合は、サンドボックスにファイルをコピーするのが最も簡単な場合があります。理想的には、ユースケースに合わせてカスタムサンドボックスドメインを作成するのが最善です。
LXCコンテナーは別のオプションを提供します。ただし、すべてをセットアップするのはやや大きな作業ですが、結果として得られるコンテナは多くの柔軟性を提供します。コンテナには読み取り専用のファイルシステムがあり、書き込み可能なアプリケーションディレクトリにバインドマウントを使用できます。構成 options を使用して、アプリケーションが新しい特権を取得しないようにすることができます。