Linux名前空間は、とりわけ、子プロセスの制限とジェイルを安全に処理するために活用できることを知っています。子プロセスがゾンビ化されてinitにダンプされる可能性はありません。 。しかし、実装の詳細についてはあいまいです。 util-linuxが提供するツールをどのように使用できますか mountなど およびnsenter 起動されたすべてのプロセスが別のプロセスの直接の名前空間の子孫であることを監視、監視、および確認するには?
承認された回答:
PID名前空間を作成する
ここで使用する正しいコマンドはunshareです。 。これを行うために必要なオプションは、util-linux 2.23からのみ利用可能であることに注意してください。 。実行中のプログラムに新しいPID名前空間を作成して、そのすべての子もこの名前空間に作成されるようにするという考え方です。次の手順を実行するだけで、新しいPID名前空間でコマンドを実行できます。
sudo unshare -fp some_command
シェルを実行するには、コマンドを省略します。これにより、親(システム)名前空間内に通常どおりPIDを持つプロセスが作成されます。ただし、新しい名前空間内では、PIDは1になります。 initのいくつかの特別な特性とともに 処理する。おそらく、監視の観点から最も関連性のある特性は、その子孫のいずれかが孤立している場合、実際のinitではなく、このプロセスに対して親が変更されることです。 プロセス。
ほとんどの監視ケースでは、これを行うだけで十分な場合があります。前述のように、名前空間内のプロセスはすべて親名前空間内にPIDを持っているため、通常のコマンドを使用してそれらのアクティビティを監視できます。また、名前空間内のプロセスが孤立した場合でも、最上位プログラムのPIDの下にあるプロセスツリーブランチから外れることはないため、簡単に追跡できます。
マウント名前空間と組み合わせる
ただし、私たちができないことは、PIDに関してプロセスを監視することです それは持っています。これを行うには、特にpsを使用できるようにするため 新しい名前空間内のコマンドでは、別のprocfsをマウントする必要があります 名前空間のファイルシステム。 psの唯一の場所であるため、これは別の問題につながります。 procfsを受け入れます /procです 。 1つの解決策は、chrootを作成することです。 新しいprocfsを投獄してマウントします そこの。ただし、これは面倒なアプローチです。少なくとも、使用する予定のバイナリと、それらが依存するライブラリを新しいルートにコピー(または少なくともハードリンク)する必要があるためです。
解決策は、新しいマウント名前空間も使用することです。 。この中で、新しいprocfsをマウントできます 真のルート/procを使用する方法で ディレクトリ。PID名前空間内で使用でき、他の何にも干渉しません。このプロセスを非常に簡単にするために、unshare コマンドは--mount-procを与えます オプション:
sudo unshare -fp --mount-proc some_command
現在、psを実行しています 結合された名前空間内では、PID namspaceを持つプロセスのみが表示され、最上位のプロセスは1のPIDを持つものとして表示されます。 。
nsenterはどうですか ?
名前が示すように、nsenter unshareですでに作成されている名前空間を入力するために使用できます 。これは、名前空間内からのみ利用可能な情報を、他の点では無関係なスクリプトから取得する場合に役立ちます。最も簡単な方法は、名前空間内で実行されているプログラムのPIDにアクセスすることです。明確にするために、これはnsenterの元となる名前空間内のターゲットプログラムのPIDである必要があります。 実行中です(名前空間はネストできるため、1つのプロセスに多数のPIDが含まれる可能性があります)。ターゲットPID/マウント名前空間でシェルを実行するには、次のようにします。
sudo nsenter -t $PID -m -p
この名前空間が上記のように設定されている場合、ps これで、その名前空間内のプロセスのみが一覧表示されます。