私は分散シミュレーションを実装するプロジェクトを進めています。普段着コードは複数のノードで実行され、結果が収集され集計されます。
各ノードは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)システムです。
これらのシステムを使用するには、正しい構成を作成する必要があります。もちろん、これは言葉のように簡単ではありません。始めるのに役立ついくつかの参照リンクは次のとおりです。
頑張ってください!