「nsenter:」を使用して子プロセスを投獄する信頼できる方法


15

Linuxの名前空間は、とりわけ、ゾンビ化されたりダンプされたりすることなく、子プロセスの制限と投獄を安全に処理するために活用できることを知っていますinit。しかし、実装の詳細についてはあいまいです。やutil-linuxなどのツールを使用して、起動したすべてのプロセスが別のプロセスの直接の名前空間の子孫であることを監視、監視、および確認するにはどうすればよいですか?mountnsenter

回答:


19

PID名前空間を作成する

ここで使用する正しいコマンドはunshareです。これを行うために必要なオプションはからのみ利用可能であることに注意してくださいutil-linux 2.23。アイデアは、実行中のプログラム用に新しいPID名前空間を作成し、そのすべての子もこの名前空間に作成されるようにすることです。以下を実行するだけで、新しいPID名前空間でコマンドを実行できます。

sudo unshare -fp some_command

シェルを実行するには、コマンドを省略します。これにより、子(子)とともに親(システム)名前空間内で通常どおりPIDを持つプロセスが作成されます。ただし、新しいネームスペース内1では、initプロセスの特別な特性のいくつかとともにPID があります。おそらく、監視の観点から最も関連する特性は、その子孫のいずれかが孤立している場合、実際のinitプロセスではなく、このプロセスに再度親になることです。

ほとんどの場合、これを行うだけで十分です。前述のように、ネームスペース内のプロセスはすべて親ネームスペース内にPIDを持っているため、通常のコマンドを使用してアクティビティを監視できます。また、名前空間内のプロセスが孤立しても、最上位プログラムのPIDの下のプロセスツリーブランチから落ちないことを保証します。つまり、簡単に追跡できます。

マウント名前空間と組み合わせる

ただし、実行できないと考えているPIDに関してプロセスを監視することはできません。これを行うには、特にps新しいネームスペース内でコマンドを使用できるようにするにはprocfs、ネームスペース用に別のファイルシステムをマウントする必要があります。これだけの場所から別の問題にターンリードでpsのために受け入れprocfsIS /proc。1つの解決策は、chroot刑務所を作成し、procfsそこに新しい刑務所を設置することです。しかし、これは面倒なアプローチです。少なくとも、使用する予定のバイナリを新しいルートに依存するライブラリと一緒にコピー(または少なくともハードリンク)する必要があります。

解決策は、新しいマウント名前空間も使用することです。この中でprocfs、真のルート/procディレクトリを使用し、PID名前空間内で使用でき、他の何にも干渉しない方法で新しいをマウントできます。このプロセスを非常に簡単にするために、unshareコマンドは--mount-procオプションを提供します:

sudo unshare -fp --mount-proc some_command

ps結合された名前空間内で実行すると、PIDネームスペースを持つプロセスのみが表示され、PIDがのトップレベルプロセスが表示され1ます。

どうnsenter

名前が示すように、nsenterを使用して既に作成された名前空間を入力するために使用できますunshare。これは、他の方法では無関係のスクリプトから名前空間内からのみ利用可能な情報を取得する場合に便利です。最も簡単な方法は、名前空間内で実行されているプログラムのPIDにアクセスすることです。明確にするために、これnsenterは実行元のネームスペース内のターゲットプログラムのPIDである必要があります(ネームスペースはネストできるため、1つのプロセスに多くのPIDを持たせることができます)。ターゲットPID / mount名前空間でシェルを実行するには、次のようにします。

sudo nsenter -t $PID -m -p

この名前空間が上記のように設定されている場合、psその名前空間内のプロセスのみがリストされます。


ありがとう、グレーム。これはすでに質問などに答えています。実際に私に尋ねたのは、/ proc / pid / ns / *のさまざまなファイルのprocfsのマニュアルページからメモを読むことでした。「このファイル(mount(2)を参照)のマウントをファイルシステムの他の場所にバインドすると、 ...現在ネームスペースにあるすべてのプロセスが終了した場合でも、pid aliveで指定されたプロセスのネームスペース。ほとんど同じ質問を、私は知っているが、これはすでにあなたはあなたがそれを追加したい場合があります関連すると感じた場合、私は思っとても良いです。linux.die.net/man/5/proc
mikeserv

これについては、最後のセクションLWNの記事で説明しています(バインドマウントを検索するだけです)。PID名前空間を存続させますが、トップレベルのinitスタイルプロセスが終了すると、それ以上作成できなくなるため、そのポイントは本当にわかりません。
グレアム14

ええ、残りの部分もあまりわかりません。しかし、この答えとman自分自身への週末で、私はそれに少し慣れることを意味します。再度、感謝します。おそらく、--user 名前空間に関連性があります。
mikeserv 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.