Red Hat Enterprise Linux Atomic Host でスーパー特権コンテナーを実行する
コンテナーは、自身が所有する名前空間が含まれたビューを持ち、実行しているホストへのアクセスを制限するために設計されました。コンテナーには、デフォルトでは、ホストと異なるプロセステーブル、ネットワークインターフェイス、ファイルシステム、そして IPC があります。ホストシステムやその他のコンテナーへのアクセスを制御するための機能や SELinux などの多くのセキュリティ機能がコンテナーに使用されています。コンテナーはホストのリソースを使用できますが、コンテナーから実行したコマンドは、ホストと直接やりとりする機能としては非常に制限されます。
ただし、コンテナーの中には、ホストシステムに直接アクセスし、監視し、機能を変更するために作られているものもあります。このようなコンテナーはスーパー特権コンテナー と呼ばれています。Red Hat Enterprise Linux Atomic hosts (RHEL Atomic) の性質により、スーパー特権コンテナーは、RHEL Atomic host を使用するための重要な機能を提供します。たとえば、以下のような機能があります。
- RHEL Atomic host は機能を絞っています。RHEL Atomic host を管理またはトラブルシュートするために使用するツールの多くは、デフォルトでは同梱されていません。
- Atomic hostは、yum や rpm コマンドを使用してパッケージをインストールすることはできないため、RHEL またはサードパーティのツールを RHEL Atomic host に追加する場合はコンテナーに追加することが一番の方法です。
- RHEL Atomic にスーパー特権コンテナーを追加し、問題をトラブルシュートし、不要になったリソースを削除して解放します。
Red Hat は、特に RHEL Atomic host で実行するためのスーパー特権コンテナーを複数用意しており、今後さらに追加していく予定です。これには以下が含まれます。
- RHEL Atomic Tools コンテナーイメージ: コンテナーは、管理者のシェルと見なすことができます。ホスト上の問題を診断するために管理者が使用する可能性のある多くのデバッグツール (strace、traceroute、 sosreport など) と man ページが、このコンテナー内にあります。
- RHEL Atomic rsyslog コンテナーイメージ: このコンテナーは rsyslogd サービスを実行して、集中型サーバーにログメッセージを送ったり、RHEL Atomic のログファイルを管理したりします。rsyslog コンテナーをインストールしていなくても、systemd-journald サービスは、RHEL Atomic ホストのログデータをすべて集めています。
- RHEL Atomic System Activity Data Collector (sadc) コンテナーイメージ: このコンテナーは sysstat パッケージから sadc サービスを実行し、 sar コマンドを実行すれば RHEL Atomic システムで後で読むことができるデータを継続的に収集します。
このガイドでは RHEL Atomic Tools コンテナーイメージを例にあげて、スーパー特権コンテナーがどのように実行し、スーパー特権コンテナーがホストの機能にどのようにアクセスするかを説明します。
特権コンテナーを実行する
docker コマンドを実行し、スーパー特権コンテナーとして実行する必要があるオプションをすべて追加するには、長くて複雑なコマンドラインが必要になります。したがって、コンテナーを実行する atomic コマンドを実行することで、その作業が簡単にできるようにしました。以下のように atomic コマンドを実行します。
# atomic run rhel7/rhel-tools [root@localhost /]#
これにより、複数のオプションを追加した docker コマンドを使用して rhel-tools コンテナーを作成して起動します。そして、RHEL Atomic host でコンテナーを使用して実行することが簡単にできるようになります。実際の 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 ホストにアクセスすることを示しています。
-
--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 Tools の特権コンテナーの場合にこれを実行すると、シェルが開いて、コンテナー内からコマンドを使用できるようになります。もしくは、atomic または docker コマンドラインの最後にオプションを追加して、特定のコマンド (sosreport や traceroute など) を実行できます。次のセクションでは、そのコンテナーの調査を開始する方法を説明します。
特権コンテナーにおける名前空間の概要
コンテナーでそのコマンドを実行していることを認識させるために、基本的な Red Hat Enterprise 管理コマンドの多くが修正されました。たとえば、RHEL Tools Container 内で sosreport を実行すると、/ ではなく、ファイルシステムの root として /host で実行していることが認識します。ただし、RHEL Tools Container (または特権コンテナー) からその他のコマンドを実行すると、以下の点については、特権コンテナーで実行した場合と動作が異なります。
特権
特権コンテナーは、デフォルトでは root ユーザーとしてアプリケーションを実行します。unconfined_t SELinux セキュリティコンテキストで実行しているため、コンテナーにその機能があります。
マウントテーブル
df や mount などのツールを使用してマウントされているファイルシステムを確認する場合は、ホストで直接そのコマンドを実行した場合と異なる情報を特権コンテナー内で確認することができます。情報が異なるのは、2 つの環境が独自のマウントテーブルを保持しているためです。
プロセステーブル
コンテナー内で実行しているプロセスだけを表示する通常のコンテナーとは異なり、(--pid=host セットを使用した) 特権コンテナーで ps -e コマンドを実行すると、ホスト上で実行するすべてのプロセスを表示できます。したがって、ホストから特権コンテナーで実行したコマンドにプロセス ID を渡すことができます (たとえば kill PID)。ただし、一部のコマンドでは、コンテナーからプロセスにアクセスする時にアクセス権の問題が発生する場合があります。
プロセス間のコミュニケーション
ホストの IPC 機能は、特権コンテナーからアクセスできます。したがって、ipcs などのコマンドを実行すると、ホストでアクティブなメッセージキュー、共有メモリーセグメント、セマフォセットの情報を確認できます。
Comments