私は、分散シミュレーションを実装するプロジェクトに取り組んでいます。任意のコードが複数のノードで実行され、結果が後で収集および集計されます。
各ノードはUbuntu Linux仮想マシンのインスタンスであり、実行されるコードを複数のワーカープロセス(コアごとに1つ)に転送するマスタープロセスを実行します。
この質問は、各ワーカーに仮想マシンインスタンスを使用せずに、各ワーカーがサンドボックス環境で動作することを確認する方法に関するものです。労働者の正確な要件は次のとおりです。
- fs:書き込み許可なし、単一ディレクトリ(およびサブフォルダ)に制限された読み取り専用許可
- net:ローカル通信のみが許可されます(IPC、TCPなど)
- mem:メモリ使用量の上限(スワップメモリなし)
- cpu:許可されるコアは1つのみです。時間制限を超えた場合は強制終了します
他の制限を課すべきではありません:ワーカーは、動的ライブラリを(読み取り専用フォルダーから)ロードし、新しいスレッドまたはプロセスを生成し、システム関数を呼び出し、ecc eccできる必要がありますが、制限は、生成/ロードされたエンティティによって継承される必要があり、合計方式で適用する必要があります(たとえば、それぞれ800MBを使用する2つのスレッドをワーカーに生成させることはできません。そのようなワーカーのメモリ制限は1GBです)。
言うまでもなく、労働者がその権利を高める方法はないはずです。
要件を満たす最もシンプルなソリューションのための利用可能な代替案(SELinux、AppArmor、cgroups、ulimit、Linux名前空間、LXC、Dockerなど)を検討するのにかなりの時間を費やしましたが、フィールドでの経験は限られています。
現在の理解:LXCとDockerは、私のユースケースでは少し重く、完全に安全ではありません1。AppArmorは設定が簡単であるため、SELinuxよりも望ましいです。fsとネットの制限に使用します。cgroupsはulimit(単一のプロセスで動作する)よりも好ましく、memおよびcpuの制限に使用します。
これは私の目標を達成する最も簡単な方法ですか?AppArmorまたはcgroupsのみを使用できますか?モデルに明らかなセキュリティホールはありますか?ガイドラインは「労働者自身を倒すことを許可されているが、それ以外は何もしてはならない」であるべきである。