web-dev-qa-db-ja.com

カーネル:名前空間のサポート

Linuxカーネルの「名前空間サポート」機能が正確に何を意味するのか疑問に思っています。私はカーネル3.11.1(現時点で最新の安定したカーネル)を使用しています。

無効にすることにした場合、システムの変更に気付きますか?

そして、誰かが名前空間を利用することに決めた場合、カーネルでNAMESPACES=Yをコンパイルするだけで十分ですか、それともユーザー空間ツールも必要ですか?

15
Martin Vegter

簡単に言えば、名前空間は、より大きなLinuxシステム内に仮想Linuxシステムを構築する方法を提供します。これは、非特権プロセスとして実行される仮想マシンの実行とは異なります。仮想マシンはホストで単一のプロセスとして表示されますが、名前空間内で実行されるプロセスはホストシステムで実行されます。

より大きなシステム内で実行される仮想システムは container と呼ばれます。コンテナーの考え方は、コンテナー内で実行されているプロセスは、それらがシステム内の唯一のプロセスであると信じているということです。特に、コンテナ内のrootユーザーには、コンテナ外のroot権限がありません(これは、カーネルの最新バージョンでのみ当てはまることに注意してください)。

名前空間は、一度に1つの機能を仮想化します。名前空間のタイプの例は次のとおりです。

  • ser namespaces —これにより、プロセスは、ネームスペースの内外で異なるユーザーとして実行されているかのように動作できます。特に、ネームスペース内でUID 0として実行されているプロセスは、同じネームスペースで実行されているプロセスに対してのみスーパーユーザー権限を持っています。
    Linuxカーネル3.8以降、非特権ユーザーはユーザー名前空間を作成できます。これにより、一般ユーザーはルートに予約されている機能(ルーティングテーブルの変更や機能の設定など)を利用できます。
  • PID名前空間 — PID名前空間内のプロセスは、その名前空間外のプロセスを強制終了または追跡できません。
  • Mount namespaces —これにより、プロセスはファイルシステムの独自のビューを持つことができます。このビューは部分ビューにすることができ、ファイルシステムの一部を非表示にしたり、ディレクトリツリーを別の場所に表示するように再構成したりできます。マウント名前空間は、従来のUnix機能 chroot を一般化します。これにより、プロセスを特定のサブツリーに制限できます。
  • ネットワーク名前空間 —ネットワークリソース(ネットワークデバイス)の分離を許可し、プロセスの分離を強化します。

名前空間は、名前空間間の分離を提供するためにカーネルに依存しています。これを正しく行うのは非常に複雑なので、依然としてセキュリティバグが存在する可能性があります。セキュリティバグのリスクは、機能を有効にしない主な理由です。これを有効にしないもう1つの理由は、組み込みデバイス用の小さなカーネルを作成している場合です。一般的なサーバーまたはワークステーションにインストールする汎用カーネルでは、他の成熟したカーネル機能と同様に、名前空間を有効にする必要があります。

名前空間を利用するアプリケーションはまだほとんどありません。ここにいくつかあります:

  • [〜#〜] lxc [〜#〜] は確立されています。 cgroups に依存してコンテナーを提供します。
  • virt-sandbox は、最近のサンドボックスプロジェクトです。
  • Chromium の最近のバージョンでは、サンドボックス化に使用可能な名前空間も使用しています。
  • クラスター化されたアプリケーションの WSGI フレームワーク 名前空間を使用 サンドボックスの改善。

詳細については、 Michael KerriskによるLWN記事シリーズ を参照してください。

Linuxカーネル名前空間は、システムリソースへのアクセスに関して、プロセスのグループを他のプロセスから分離するために使用される概念です。たとえば、2つの異なるPID名前空間には、同一のPIDを持つが完全に異なるプロセスイメージを持つプロセスが含まれる場合があります。それらは、OSレベルの仮想化でよく使用されます。単一のカーネルがさまざまなオペレーティングシステムを同時に実行しています。これらはすべてLinuxベースである必要があります(明らかにカーネルを共有しているため)。ただし、ディストリビューションやバージョンが異なる場合があります。たとえば [〜#〜] lxc [〜#〜] を参照してください。

Systemdベースのシステムでは、systemdが コンテナー機能 に名前空間を使用できるため、これを無効にすることに気付く場合があります。したがって、多くは、使用しているディストリビューションとシステムで何をするつもりかによって異なります。

ほぼすべてのカーネル機能と同様に、特定の種類のユーザー空間プログラムが必ず必要です。特別なファイルを介してカーネルと対話した場合でも(私ができるかどうかはわかりません)、専用ツールに依存することをお勧めします。フォアフレンドリーなAPIを提供します。

6
peterph

名前空間の使用例を示すために、SELinux(MLSまたはStrict)対応のシステムで。名前空間は通常、ユーザーごとに個別の/tmpおよび/homeディレクトリを作成するために使用されます。これらのディレクトリは、ユーザー、同じラベルの付いたユーザー、カーネル、および特権アクセスを持つユーザーにのみ表示されます。名前空間が編集された/tmpディレクトリは、ユーザーのSELinux-MLSラベルと一致するようにSELinux-MLSによってラベル付けされます。このシナリオでは、ユーザーに表示される/tmpディレクトリは、実際には/tmp/var/user-tmp)以外の場所にマウントされている可能性があります。ただし、ユーザーには/tmpのみが表示され、ユーザーのアクティビティによって作成されたファイルが表示されます。ユーザーは、他のユーザーの製品である/tmp内のファイルを決して見ることはありません。

1
guestUserX