分散シミュレーションを実装するプロジェクトに取り組んでいます。arbitraryコードが複数のノードで実行され、結果が後で収集および集計されます。
各ノードはUbuntu Linux仮想マシンのインスタンスであり、実行するコードを多数のワーカープロセス(コアごとに1つ)に転送する処理を行うマスタープロセスを実行します。
この質問は、各ワーカーが仮想マシンインスタンスの使用に頼らずに、サンドボックス環境で動作することを確認する方法についてです。労働者の正確な要件は次のとおりです。
その他の制限は課せられません。ワーカーは(読み取り専用フォルダーから)ダイナミックライブラリをロードし、新しいスレッドまたはプロセスを生成し、システム関数を呼び出し、ecc eccできる必要がありますが、制限は生成/ロードされたエンティティと合計の方法で適用する必要があります(たとえば、ワーカーに800MBを使用する2つのスレッドを生成させることはできません。それぞれ、このようなワーカーのメモリ制限は1GBです)。
言うまでもなく、労働者がその権利を上げる方法はありません。
私はかなりの時間を費やして、私の要件を満たす最も単純なソリューションとして、利用可能な代替手段(SELinux、AppArmor、cgroups、ulimit、Linux名前空間、LXC、Dockerなど)を確認しましたが、フィールドでの経験は限られています。
現在の理解:LXCとDockerは、私のユースケースでは少し重く、完全に安全ではありません 1 。 AppArmorは設定が簡単なためSELinuxよりも望ましいので、fsとnetの制限に使用してください。 ulimit(単一のプロセスで動作する)よりも好ましいcgroupsをmemおよびcpu制限に使用します。
これは私の目標を達成する最も簡単な方法ですか? AppArmorまたはcgroupsを排他的に使用できますか?モデルに明らかなセキュリティホールがありますか?ガイドラインは、 "自分自身をダウンさせることを許可された労働者でなければならない"である必要があります。
はい、cgroupsとSELinux/AppArmorを排他的に使用して、実行するarbitraryコードを監視および制御できます。
Cgroupsを使用すると、次のことができます。
cpuset
サブシステムでCPUコアの使用を1 CPUに制限するmemory
サブシステムを使用してメモリ使用制限を設定し、フォークも追跡します。例として https://github.com/gsauthof/cgmemtime を参照してください。net_prio
サブシステムを使用して、lo
にないものへのネットワークアクセスを防止します。また、SELinux/AppArmorを使用すると、プロセスの読み取り/書き込みアクセスを制限できます。
注:私はAppArmorに慣れていませんが、これは必須アクセス制御(MAC)システムであるため、書き込みと読み取りを保護するのが仕事です。
これらのシステムを使用するには、適切な構成を作成する必要があります。もちろん、これらすべては言うよりもはるかに簡単です。だからあなたが始めるためのいくつかの参照リンクがあります:
幸運を!
SELinuxをAppArmorで破棄したのは、Ubuntu。 (本当にかなり難しい)
[〜#〜] lxc [〜#〜]はそれ自体では安全ではありませんセキュリティが必要な場合は、libvirt(SELinux MLSに基づく)).
あなたの問題はinfiniteなので、既製の解決策を見つけようとしないでください。無限の時間がないと、 kernel.orgが受賞し、ごく最近、[〜#〜] fbi [〜#〜]が誰かを宣言した彼らのシステムを何年も使用してきましたが、今まで検出されていません。
LXC/libvirtを使用してセキュリティをかなり向上させるか、「新しい」- インテルクリアコンテナー を使用します。非常に軽いVMDAX/KSMを明確に使用するコンテナ用(私はそれらをテストしていませんが、確かに非常に有望に見える)。
カーネルの悪用について懸念がある場合は、grsecurityがソリューションですが、コンテナーソリューションと統合する必要があります(確かに頭痛の種)。
確かに簡単な作業ではありません。LXC/libvirtは本当にきちんとしていますが、おそらく明確なコンテナが適しています。
Docker?利用可能な放浪箱がない場合、私はローカルのテスト以上にdockerを使用していません/使用していません。より多くの作業とはるかに優れたコミュニティが必要です。
もちろんsystemdコンテナもいいですが、あなたはそれらを好きでも望んでもないし、あなたもそれらを言及しなかったので、それらはベンダーにとらわれないソリューションではありません。
あなたが何かもっと「もっと簡単」でもっとアマチュアが欲しいなら、チェックアウトできます firejail 、私はそれをいくつかのデスクトップ「アプリ」に使っていて、それは仕事をします(あなたのテンプレートを作成するのは非常に簡単です)カスタムアプリ、dirsの上に「プライベート」マウントを使用し、ネットワークをローカルでの使用のみに制限します。生成されたプロセスは親のために継承して続行します...)。
乾杯して、怒らないで楽しんでください。 ;)
グリッドコンピューティングシステムを調べてみてください。特に、BOINC( http://boinc.berkeley.ed )は、ほとんどすべてのボックスをチェックします。
私はそれがあなたのパラメーターで動作すると信じています:
fs:他の場所ではなく、独自のディレクトリに読み書きできます
net:BOINCサーバーへのネットワークアクセスのみを許可するように構成できますが、デフォルトのIIRCはデフォルトではありません
mem:はい、アイドル状態のマシンとアイドル状態でないマシンのメモリ制限を分けます
cpu:はい、「コンピュータがアイドル状態でない場合は実行しない」と言うこともできます
seccomp-bpfは、OpenSSH、vsftpd、およびChromiumで適切に機能する別のオプションです。exit()、sigreturn()、read()のみがあり、設定可能なBerkeley Packet Filterルールを使用してシステムコールをフィルタリングできます。メモリ、CPUなどのcgroupと組み合わせて使用することもできます...