最も単純で安全なサンドボックス(限られたリソースが必要)


15

私は、分散シミュレーションを実装するプロジェクトに取り組んでいます。任意のコードが複数のノードで実行され、結果が後で収集および集計されます。

各ノードは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のみを使用できますか?モデルに明らかなセキュリティホールはありますか?ガイドラインは「労働者自身を倒すことを許可されているが、それ以外は何もしてはならない」であるべきである。


2
場合の制限リソースを[INGの]があなたの目標である、あなたは何ができる多くの方 Ubuntuゲストよりも(あるいは、実際にそのことについては、Debianの誘導体)。いずれにせよ、あなたはおそらくしたいユーザーモードのLinuxを、および/または(最近のカーネルで)ユーザーの名前空間
mikeserv

2
LXCはまさにあなたが必要とするもののように聞こえます。なぜあなたはそれが重い側にあり、安全でないと思いますか?(もちろん、バグがありますが、使用できるものはすべてあります。)
ジル「SO-悪であるのをやめる」14

リンクされたプレゼンテーション(2011年から)およびUbuntu LXCドキュメントの「名前空間のリーク」に関するセキュリティセクションは、それほど安心できません。主に名前空間とcgroupに基づいているLXCのように、とにかく今のところ最良のオプションである可能性があります。私も見Linuxでは、サンドボックス、面白い読み物
StephQ

少し手直しが必要かもしれませんが、BSD刑務所での実行を検討しましたか?
ライダー

LXCはVMの束のように「重い」かもしれませんが、それらを作成するのは本当に簡単です。これらのソリューションのいくつかは、「より軽い」には多くの設定が必要になる場合があります。LXCを使用すると、1つのアプリにコンテナ全体が含まれるため、書き込みなどの設定を行う必要がない場合があります。
MikeP

回答:


1

はい。cgroupとSELinux / AppArmorを排他的に使用して、実行する任意のコードを監視および制御できます。

cgroupを使用すると、次のことができます。

  1. cpusetサブシステムでCPUコアの使用を1 CPUに制限する
  2. memoryサブシステムでメモリ使用制限を設定し、フォークも追跡します。例については、https://github.com/gsauthof/cgmemtimeを参照してください
  3. サブシステムでオンになっloていないものへのネットワークアクセスを防止しnet_prioます。

また、SELinux / AppArmorを使用すると、プロセスの読み取り/書き込みアクセスを制限できます。

注:私はAppArmorには慣れていませんが、必須アクセス制御(MAC)システムです。つまり、書き込みと読み取りを保護するのが仕事です。

これらのシステムを使用することは、適切な構成を書くことの問題です。もちろん、これはすべて言うよりも簡単です。そのため、開始するための参照リンクがいくつかあります。

幸運を!


1

Ubuntuを使用している場合にのみ、AppArmorのSELinuxを破棄します。(本当に難しい)

LXCはそれ自体では安全ではありません。セキュリティが必要な場合、libvirtSELinux MLSに基づく)を介し使用する必要があります。

あなたの問題は無限ですので、すぐに解決策を見つけようとしないでください。無限の時間なしで、kernel.orgさえも獲得されており、ごく最近、FBIは誰かが今まで検出されずに何年もシステムを使用していると宣言したことを忘れないでください。

私は行きますLXC / libvirtのかなり良いのセキュリティや、私が「新しい」しようとするためのインテル明確なコンテナの明確な使用を使用してコンテナのための非常に軽いVMを使用し、DAX / KSMを(私はそれらをテストしていませんが、彼らは非常に見えます確かに有望です)。

カーネルの悪用を心配している場合、grsecurityがソリューションですが、コンテナーソリューションと統合する必要があります(確かに頭痛の種)。

確か、そうではないのための簡単な作業LXC / libvirtのは本当にすごいですが、多分明確な容器を移動する方法です。

Docker?使用できる浮浪者ボックスがない場合、ローカルテスト以上にdockerを使用したことはありません/使用しません。より多くの作業とより良いコミュニティが必要です。

もちろんsystemdコンテナも素晴らしいですが、あなたはそれらに言及しさえしなかったので、あなたはそれらが好きではない/欲しくないと仮定し、それらはベンダーに依存しない解決策ではありません。

「より簡単」でよりアマチュアなものが必要な場合は、firejailをチェックアウトできます。デスクトップの「アプリ」で使用してきました。あなたのディレクトリの上にマウントし、ローカルでの使用のみにネットワークを制限し、生成されたプロセスは親のために継承し続けます...)。

乾杯して、怒らずに楽しんでください。;)


0

seccomp-bpfは、OpenSSH、vsftpd、およびChromiumで適切に機能する別のオプションであり、exit()、sigreturn()、read()のみでwrite()も使用しますが、構成可能なBerkeley Packet Filterルールを使用したシステムコールのフィルタリングが可能です。メモリ、CPUなどのcgroupと組み合わせて使用​​することもできます。

https://wiki.mozilla.org/Security/Sandbox/Seccomp


0

グリッドコンピューティングシステムを検討することもできます。特に、BOINC(http://boinc.berkeley.edu)はほとんどすべてのボックスをチェックします。

私はそれがあなたのパラメータで動作すると信じています:

fs:独自のディレクトリへの読み取り/書き込みができます。

net:BOINCサーバーへのネットワークアクセスのみを許可するように構成できますが、IIRCのデフォルトではありません

mem:はい、アイドルマシンと非アイドルマシンの個別のメモリ制限

cpu:はい、「コンピューターがアイドル状態でなければ実行しない」と言うこともできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.