私はオンライン裁判官システムの機能を備えたシステムを構築しています。すべての実行可能ファイルを実行して、その出力を評価する必要があります。問題は、それらすべてがコンテナに配置される場合、別のフォルダで、アプリケーションの1つがそのフォルダを終了し、別のアプリケーションに属する別のフォルダにアクセスしようとする可能性があることです。この場合、メインサーバーは保護されますが、他のアプリケーションやエバリュエーターは保護されません。
私は自分自身で解決策を見つけましたが、もっと良いものがあると思っています。たとえば、5つのコンテナを作成し、それぞれが同じアルゴリズムを実行し、一度に1つの問題を評価します。問題が評価された後、これは削除され、別の問題が受信されます。この場合、メインサーバーとすべてのアプリケーションは保護されますが、エバリュエーターは保護されません。評価されたアプリケーションは、そのフォルダを終了して、ランダムなテキストファイルの書き込みを開始し、メモリ全体を埋める場合があります。
エバリュエーターは実行可能ファイルを開始し、時間を測定し(1秒または2秒より長い場合は強制終了します)、メモリを使用します(一定の制限に達すると強制終了します)。
毎回コンテナーを作成し、実行可能ファイルが評価された後に削除することも考えましたが、コンテナーを作成して開始するのに数秒しかかかりません...
評価されたプロセスをコンテナーとエバリュエーターの混乱からどのように分離しますか?基本的に、プロセスが他のフォルダにアクセスするのをブロックしたい。
アプリケーションの別のユーザーアカウントを作成するのを妨げる問題の説明を何も読んでいません。次に、簡単なファイル権限を使用して干渉を防止できます。
chown app1 /var/lib/myapps/app1
chmod 700 /var/lib/myapps/app1
Sudo -u app1 /var/lib/myapps/app1/run.sh
編集
エバリュエーターがroot
として実行されている場合は、Sudo
を介してアプリケーションを起動できます。
エバリュエーターがroot
として実行されない場合、(通常の方法で)呼び出すアプリケーションにSUIDビット(ユーザーIDを設定)をインストールして、プロセスがバイナリファイルを所有するユーザーとして実行されるようにすることができます。評価者プロセスのユーザーとしてではなく。
ディストリビューションとカーネルに応じて、 AppArmor または SELinux を使用してアプリケーションを含めることができます。全体として、AppArmorの方がセットアップと保守がより便利だと思います。 buntu wiki には、基本的な概念を説明する記事がいくつかあります。
封じ込めがなければ、Hauke Lagingが提案したように、特定のユーザーがchrootされた環境でアプリケーションを実行することをお勧めします。 cf man chroot
設定は簡単で、複雑さはアプリケーションがアクセスする必要のあるリソースに依存します