web-dev-qa-db-ja.com

LXC:ルートとエンドユーザーが所有する非特権コンテナの間にセキュリティ上の違いはありますか?

LXCコンテナーを使用して、ネットワークに面しているサービスのほとんどを分離するつもりです。

私の理解によると、これを行うには主に2つの方法があります。

  1. rootが所有する非特権コンテナを作成します。この場合、ルートには単一の大きなサブUIDとサブGIDのセットがあり、この範囲のさまざまなサブセットが各コンテナーに影響します(コンテナーがサブUIDまたはサブGIDを相互に共有することはありません)。

  2. 非特権システムアカウントが所有する非特権コンテナを作成します。この場合、各アカウントは単一のコンテナーと、この単一のコンテナーに必要な従属UIDおよびGIDを所有します。

使いやすさの観点からは、前者の方がはるかに優れています。セットアップと保守が簡単です。

ただし、セキュリティの観点から、2つの間に違いはありますか?

例えば:

  • /etc/subuid/etc/subgidで定義されているのと同じプール(同じ行)に属するIDの間に、異なるユーザーに属しているために異なるプールに属しているIDと比較して、何らかのリンクまたは水平関係がありますか(別の行)?

  • 下位IDとその所有者アカウントの間に何らかのリンクまたは垂直関係がありますか? rootが所有する従属IDは、特権のないユーザーが所有する従属IDよりも高い特権を取得できますか?下位IDは、他の任意のIDにエスカレーションするよりも簡単な方法で、所有者IDにエスカレーションできますか?

  • Rootが所有するということは、コンテナを管理するためのすべてのコマンドがホストのroot権限で起動されることを意味します。これは弱点を構成しますか、またはたとえば、すべての特権が早期に削除されますか?

  • 等。

言い換えると、ルートが所有する非特権コンテナは、標準アカウントが所有するコンテナよりも「非特権」である可能性がありますか?

6
WhiteWinterWolf

言い換えると、ルートが所有する非特権コンテナは、標準アカウントが所有するコンテナよりも「非特権」である可能性がありますか?

私はそうは思いません。重要なのは、_/proc/$PID/uid_map_にあるものではなく、コンテナのユーザー名前空間にあるプロセスの_/etc/subuid_にあるものです。コンテナで実行されているプロセスの_$PID_に対して、初期ユーザー名前空間から(つまり、コンテナからではなく)以下を実行するとします。 :

_$ cat /proc/$PID/uid_map
0 200000 1000
_

これは、プロセス$ PIDのUID範囲_[0-1000)_が、(コンテナーの)ユーザー名前空間の外側のUID範囲_[200000-201000)_にマップされることを意味します。 _[200000-201000)_の範囲外のUIDは、コンテナー内の65534($(cat /proc/sys/kernel/overflowuid))にマップされます。これは、たとえば、新しいPID名前空間を作成しない場合に発生する可能性があります。その場合、コンテナ内のプロセスは外部のプロセスを認識しますが、それらのUIDは65534になります。

したがって、適切なUIDマッピングを使用すると、コンテナーがrootによって開始された場合でも、そのプロセスはその外部に非特権UIDを持ちます。

_/etc/subuid_内の従属UIDは、外部の単一のUIDにリンクされていません。このファイルの目的は、特権のないユーザーが複数のUIDを使用するコンテナーを開始できるようにすることです(これはほとんどのLinuxオペレーティングシステムに当てはまります)。デフォルトでは、非特権ユーザーの場合にのみUIDをマップできます。つまり、UIDが1000で、_$PID_がコンテナ内のプロセスを参照している場合、実行できるのは

_echo "$N 1000 1" >/proc/$PID/uid_map
_

非特権ユーザーとしての_$N_の場合。他のすべては許可されていません。より長い範囲をマッピングできる場合、つまり.

_echo "$N 1000 50" >/proc/$PID/uid_map
_

コンテナを介してコンテナの外部のUID _[1000-1050)_にアクセスできます。そしてもちろん、外部UID範囲の開始を変更できれば、rootを取得する簡単な方法があります。したがって、_/etc/subuid_は、使用が許可される外側の範囲を定義します。このファイルは、setuidルートであるnewuidmapによって使用されます。

_$ cat /etc/subuid
woky:200000:50
$ echo '0 200000 50' >/proc/$PID/uid_map
-bash: echo: write error: Operation not permitted
$ newuidmap $PID 0 200000 50
$ # success
_

詳細はもっと複雑で、私はおそらくそれを説明するのにふさわしい人物ではありませんが、答えがない方が良いと思います。 :-)マニュアルページuser_namespaces(7)newuidmap(1)、そして私自身の調査をチェックしたいかもしれません 新しいLinuxユーザー名前空間の最初のプロセスはsetuid()を呼び出す必要がありますか? 。残念ながら、LXCがこのファイルをどのように使用するかは完全にはわかりません。

1
woky