私は分散シミュレーションを実装するプロジェクトを進めています。普段着コードは複数のノードで実行され、結果が収集され集計されます。
各ノードはUbuntu Linux仮想マシンのインスタンスであり、複数のワーカープロセス(コアごとに1つ)に実行するコードを渡すマスタープロセスを実行します。
この質問は、各ワーカーに対して仮想マシンインスタンスを使用せずに、各ワーカーがサンドボックス環境で実行されるようにする方法についてです。労働者の具体的な要件は次のとおりです。
- FS:書き込み権限はなく、読み取り専用権限は単一のディレクトリ(およびサブフォルダ)に制限されています。
- ネット:ローカル通信のみ許可(IPC、TCPなど...)
- メモリ:メモリ制限を超えると、メモリ使用量制限(スワップメモリなし)が終了します。
- CPU:コアは1つだけ許可され、制限タイムアウト時に終了します。
他の制限は適用しないでください。ワーカースレッドは、ダイナミックライブラリ(読み取り専用フォルダから)をロードし、新しいスレッドまたはプロセスを作成し、システム関数を呼び出してecc eccできるようにする必要がありますが、制限は生成/ロードされたエンティティによって継承される必要があります。適用方法で合計する必要があります(たとえば、ワーカースレッドのメモリ制限は1 GBであるため、1つのワーカースレッドにそれぞれ800 MBを使用する2つのスレッドを作成させることはできません)。
労働者が自分の権利を向上させる方法がないことは言うまでもありません。
私は私の要件を満たす最も簡単なソリューションを見つけるために利用可能な代替案(SELinux、AppArmor、cgroups、ulimit、Linuxネームスペース、LXC、Dockerなど)を確認するのにかなり長い時間を費やしましたが、この分野での私の経験は限られていた。
現在の理解:LXCとDockerは私のユースケースに比べて少し重く、完全に安全ではありません。1。 AppArmorは設定が簡単で、ファイルシステムやネットワークの制限に使用されるため、SELinuxよりも優れています。 cgroupはulimit(シングルプロセスで実行)よりも優れており、メモリとCPUの制限に使用されます。
これが私の目標を達成する最も簡単な方法ですか? AppArmorまたはcgroupを単独で使用できますか?私のモデルに明らかなセキュリティホールがありますか?指示は次のとおりです。「労働者は自分自身を倒すことができますが、それ以外は何も許されません」。
答え1
はい、特にcgroupとSELinux / AppArmorを使用して監視および制御できます。普段着実行するコードです。
cgroupを使用すると、次のことができます。
cpuset
サブシステムのCPUコア使用量をCPU1個に制限- メモリ使用量制限の設定
memory
サブシステムはメモリ使用量制限を設定し、フォークも追跡します。バラよりhttps://github.com/gsauthof/cgmemtime例えば。 lo
サブシステムにnet_prio
接続されていないエントリへのネットワークアクセスを防ぎます。
SELinux / AppArmorを使用すると、プロセスへの読み取り/書き込みアクセスを制限できます。
注:私はAppArmorについてはわかりませんが、これは書き込みと読み取りの保護がそのタスクである必須アクセス制御(MAC)システムです。
これらのシステムを使用するには、正しい構成を作成する必要があります。もちろん、これは言葉のように簡単ではありません。始めるのに役立ついくつかの参照リンクは次のとおりです。
頑張ってください!
答え2
捨てますSELinux~のため鎧を適用私が使用している場合にのみUbuntu。 (本当にかなり難しい)
LXC本質的に安全ではないセキュリティが必要な場合は、以下を使用してください。ライブラリ仮想マシン(目安としてSELinux MLS)。
あなたの問題は無限したがって、無制限の時間なしで既製のソリューションを見つけようとしないでください。kernel.org最近詐欺されました。FBI誰かが自分のシステムを長年使用してきましたが、今は発見されたと主張しています。
一緒にやるよLXC/libvirt良いセキュリティのために、そうでなければ「new」を試してみましょう。インテル透明容器、コンテナに非常に軽いVMを使用し、明示的にドイツDAX/KSM(まだテストしていませんが有望に見えます。)
カーネルの悪用が懸念される場合サイバーセキュリティあなたのソリューションですが、それをコンテナソリューションと統合する必要があります(もちろん、面倒なことです)。
だから確かに簡単ではありません。LXC/libvirt本当にきれいですが、透明な容器がより良いかもしれません。
ルーストアバウト? vagrant boxが利用できない場合は、ローカルテスト以外の目的でdockerを使用しません。より多くの仕事とより良いコミュニティが必要です。
もちろん、systemdコンテナも良いですが、言及すらしなかったし、ベンダーにこだわらないソリューションではないので、気に入らなかったり、望まないと仮定します。
「もっとシンプルで」もっと素人的なものが欲しいならチェックしてみてください。火災刑務所、私はいくつかのデスクトップ「アプリ」でこのアプリを使用しており、これを行います(カスタムアプリ用のテンプレートを作成するのは非常に簡単です。ディレクトリの上部にある「プライベート」インストールを使用し、ネットワークをローカル使用に制限します)。生成プロセスは親プロセスを継承し続けます...)。
怒らずに楽しく過ごしてください。 ;)
答え3
seccomp-bpf は OpenSSH、vsftpd、Chromium で動作する別のオプションです。これにはexit()、sigreturn()、read()のみがあり、write()も使用しますが、設定可能なBerkeleyパケットフィルタルールフィルタリングを使用できます。システム移行。メモリ、CPUなどのcgroupと共に使用することもできます。
答え4
グリッドコンピューティングシステムを見たいと思うかもしれません。特にBOINC(http://boinc.berkeley.edu)ほぼすべてのボックスを確認してください。
あなたのパラメータに従って実行されると思います。
fs:自分のディレクトリを読み書きできますが、他のディレクトリは読み取れません。
net:BOINCサーバーへのネットワークアクセスのみを許可するように構成できますが、デフォルトのIIRCではありません。
mem:はい、アイドルコンピュータとアイドルコンピュータ以外のコンピュータの別のメモリ制限
CPU:はい、「コンピュータがアイドル状態でない限り実行しないでください」と言うこともできます。