第10章 スーパー特権コンテナーの実行

10.1. 概要

コンテナーは、独自の名前空間が含まれたビューを維持し、実行しているホストへのアクセスを制限するために設計されました。コンテナーには、デフォルトでは、ホストと異なるプロセステーブル、ネットワークインターフェース、ファイルシステム、および IPC 機能があります。ホストシステムやその他のコンテナーへのアクセスを制御するための機能や SELinux などの多くのセキュリティー機能がコンテナーに使用されています。コンテナーはホストのリソースを使用できますが、コンテナーから実行するコマンドは、ホストとの直接的なインターフェースの機能としては非常に制限されています。

ただし、一部のコンテナーはホストシステムの機能に直接アクセスし、監視し、それらの機能を変更することを目的に作成されています。これらは、スーパー特権コンテナー と呼ばれています。Red Hat Enterprise Linux Atomic Host (RHEL Atomic) の性質により、SPC (スーパー特権コンテナー) は RHEL Atomic Host の使用における重要な機能を提供しています。以下が例になります。

  • RHEL Atomic Host はスリム化を目的としています。そのため、RHEL Atomic Host の管理またはトラブルシューティングを実行するために使用する数多くのツールはデフォルトでは組み込まれていません。
  • Atomic Host では yum または rpm コマンドを使用してパッケージをインストールすることができないため、RHEL またはサードパーティーのツールを RHEL Atomic Host に追加する場合は、これらのツールをコンテナーに組み込むことが最も良い方法になります。
  • SPC (スーパー特権コンテナー) を RHEL Atomic ホストに追加し、問題をトラブルシューティングし、不要になったリソースを削除して解放します。

Red Hat は、とくに RHEL Atomic Host で実行するための SPC (スーパー特権コンテナー) を複数用意しており、今後さらに追加していく予定です。これらには、以下が含まれます。

  • RHEL Atomic Tools コンテナーイメージ: このコンテナーは、管理者のシェルと見なすことができます。多くのデバッグツール (strace、traceroute、sosreport など) と man ページがこのコンテナー内にあり、これらは管理者がホスト上の問題を診断するために使用できる可能性があります。
  • RHEL Atomic rsyslog コンテナーイメージ: このコンテナーは rsyslogd サービスを実行したり、ログメッセージを集中型サーバーに送ったり、RHEL Atomic のログファイルを管理したりします。systemd-journald サービスは、rsyslog コンテナーをインストールしていなくても、RHEL Atomic Host のすべてのログデータを収集することに注意してください。
  • RHEL Atomic System Activity Data Collector (sadc) コンテナーイメージ: このコンテナーは sysstat パッケージから sadc サービスを実行し、sar コマンドを実行することで RHEL Atomic システムが後で読み込むことのできるデータを継続的に収集できるようにします。

本書では、RHEL Atomic Tools コンテナーイメージのサンプルを使用して、スーパー特権コンテナーがどのように実行され、SPC (スーパー特権コンテナー) がホストの機能にどのようにアクセスするかを説明します。

10.2. 特権コンテナーの実行

docker コマンドを実行し、スーパー特権コンテナーとして実行する必要のあるすべてのオプションをすべて追加するには、長くて複雑なコマンドラインが必要です。そのため、コンテナーを実行する atomic コマンドを導入することで、このプロセスを単純化しました。以下のように atomic コマンドを実行します。

# atomic run rhel7/rhel-tools
[root@localhost /]#

これにより、複数のオプションを追加した docker コマンドを使用して rhel-tools コンテナーを作成し、起動します。これにより、RHEL Atomic Hoast でコンテナーを使用し、実行することがより簡単になります。実際の docker コマンドは以下のようになります。

docker run -it --name rhel-tools --privileged                       \
      --ipc=host --net=host --pid=host -e HOST=/host                \
      -e NAME=rhel-tools -e IMAGE=rhel7/rhel-tools                  \
      -v /run:/run -v /var/log:/var/log                             \
      -v /etc/localtime:/etc/localtime -v /:/host rhel7/rhel-tools

スーパー特権コンテナーでどのオプションが実行されるかを理解することにより、ホスト上のリソースにアクセスする必要のある独自のコンテナーを実行する際にそれらのオプションをどのように使用できるかについてよりよく理解できるでしょう。以下でこれらのオプションを説明します。

  • -i -t: 端末デバイス (-t) を開き、対話的に実行します (-i)。
  • --name オプションはコンテナーの名前を設定します (この場合は rhel-tools)。
  • --privileged オプションはセキュリティーの分離をオフにします。つまり、コンテナー内で root で実行されているプロセスは、コンテナー外で実行した場合と同様に RHEL Atomic Host にアクセスできることを意味します。
  • --ipc=host--net=host、および --pid=host フラグは、コンテナー内の ipc、net、および pid 名前空間をオフにします。これは、コンテナー内のプロセスが同じネットワークとプロセステーブルを認識し、IPC をホストプロセスと共有することを意味します。

コンテナーに環境変数を設定するオプションがいくつかあります (-e)。コンテナーを起動するときに開かれるシェルからこれらのオプションを参照できます (例: echo $HOST)。これらには以下が含まれます。

  • -e HOST=/host: コンテナーにあるホストのファイルシステムの場所を設定します (つまり、ホストから / がマウントされる場所)。$HOST を任意のファイル名に追加すると、実行するコマンドは、コンテナー内ではなくホストのファイルにアクセスします。たとえば、コンテナーから $HOST/etc/passwd がホストの /etc/passwd ファイルにアクセスします。
  • -e NAME=rhel-tools: コンテナーの名前を設定します (docker ps の実行時に表示されます)。
  • -e IMAGE=rhel7/rhel-tools: イメージの名前を特定します (docker images の実行時に表示されます)。

(ホストからコンテナーに通常マウントされるもの以外に) ホストの複数のファイルおよびディレクトリーは、ホストのファイルシステムからコンテナーにマウントされます。これらには以下が含まれます。

  • -v /run:/run: -v /run:/run オプションは、ホストから /run ディレクトリーを、コンテナー内の /run ディレクトリーにマウントします。これにより、コンテナー内のプロセスは、ホストの dbus サービスと通信し、systemd サービスに直接通信できるようになります。コンテナー内のプロセスは、docker デーモンとも通信することができます。
  • -v /var/log:/var/log: コンテナー内でコマンドを実行して、ホストの /var/log ディレクトリーからログファイルの読み取りおよび書き込みを実行できるようにします。
  • -v /etc/localtime:/etc/localtime: ホストシステムのタイムゾーンをコンテナーと共に使用します。
  • -v /:/host: ホストから //host にマウントすることにより、コンテナー内のプロセスからホストのコンテンツを簡単に変更できるようになります。touch /host/etc/passwd を実行することにより、実際はホスト上の /etc/passwd ファイルに対して動作することになります。

最後の引数は、実行するイメージとして rhel7/rhel-tools を指定します。

RHEL ツールの特権コンテナーの場合にこれを実行すると、シェルが開いて、コンテナー内からコマンドを使用できるようになります。または、特定のコマンド (sosreport または traceroute など) を実行するために、atomic または docker コマンドラインの最後にオプションを追加することもできます。次のセクションでは、このコンテナーを調査する方法について説明します。

10.3. 特権コンテナーの名前空間について

基本的な Red Hat Enterprise 管理コマンドの多くは、それらがコンテナー内で実行されていることを認識できるように変更されています。たとえば、RHEL Tools コンテナー内で sosreport を実行すると、/ ではなく、ファイルシステムの root として /host を使用していることを認識します。RHEL ツールコンテナー (または任意の特権付きコンテナー) から他のコマンドを実行する場合は、以下の点について特権コンテナーで実行される場合と動作が異なります。

10.3.1. 特権

特権コンテナーは、デフォルトではホストの root ユーザーとしてアプリケーションを実行します。コンテナーでは unconfined_t SELinux セキュリティーコンテキストで実行されるため、この機能が含まれます。

10.3.2. マウントテーブル

df および mount などのツールを使用してマウントされているファイルシステムを確認する場合、同じコマンドをホスト上で直接実行した場合とは異なる情報を特権コンテナー内で確認することができます。情報が異なるのは、2 つの環境がそれぞれ独自のマウントテーブルを保持しているためです。

10.3.3. プロセステーブル

コンテナー内で実行しているプロセスのみを表示する通常のコンテナーとは異なり、特権コンテナー内で (--pid=host を設定して) ps -e コマンド を実行することにより、ホスト上で実行するすべてのプロセスを表示できます。したがって、ホストから特権コンテナーで実行したコマンドにプロセス ID を渡すことができます (例: kill PID)。ただし一部のコマンドでは、コンテナーからプロセスにアクセスしようとする際にアクセス権の問題が発生する場合があります。

10.3.4. プロセス間通信

ホストの IPC 機能は、特権コンテナーからアクセスできます。そのため、ipcs などのコマンドを実行すると、ホストでアクティブなメッセージキュー、共有メモリーセグメント、およびセマフォセットの情報を確認できます。